{"info":{"_postman_id":"64c5656b-02fb-4d86-aad7-7df20db8787b","name":"Voxbi Public APIs","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"description":"<html><head></head><body></body></html>","owner":"34626147","collectionId":"64c5656b-02fb-4d86-aad7-7df20db8787b","publishedId":"2sBXwtpUWJ","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"e88bdd"},"publishDate":"2026-06-16T09:46:40.000Z"},"item":[{"name":"Cockpit APIs","item":[{"name":"Push Configurations","item":[{"name":"Push the PBX configuration","id":"181050e8-4923-414c-9862-fc6784a97a2f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"{{baseUrl}}/{{version}}/push-configuration","description":"<p>Push the caller's PBX configuration so pending changes take effect - the\nprogrammatic equivalent of the \"Push configuration\" button in Cockpit.</p>\n<p><strong>Rate limit:</strong> 1 request per minute per PBX. Exceeding it returns <code>429</code> with\na <code>Retry-After</code> header.</p>\n<hr />\n<h2 id=\"responses\">Responses</h2>\n<h3 id=\"200--configuration-push-recorded\"><code>200</code> — Configuration push recorded.</h3>\n<p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>pushed_at</code></td>\n<td>string</td>\n<td>—</td>\n<td>When the push was recorded (PBX timezone).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"401--authorization-token-missing-this-error-is-returned-when-the-authorization-token-is-missing\"><code>401</code> — Authorization Token Missing <br />This error is returned when the authorization token is missing.</h3>\n<p><strong>Headers</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Type</th>\n<th>Example</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Cache-Control</code></td>\n<td>string</td>\n<td><code>private, must-revalidate</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Connection</code></td>\n<td>string</td>\n<td><code>keep-alive</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td>string</td>\n<td><code>application/json</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Vary</code></td>\n<td>string</td>\n<td><code>Origin</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Limit</code></td>\n<td>integer</td>\n<td><code>60</code></td>\n<td>Max requests allowed in the current rate-limit window.</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Remaining</code></td>\n<td>integer</td>\n<td><code>57</code></td>\n<td>Requests remaining in the current rate-limit window.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>error</code></td>\n<td>string</td>\n<td>—</td>\n<td>Error message</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"409--configuration-pushes-are-currently-locked-for-this-pbx\"><code>409</code> — Configuration pushes are currently locked for this PBX.</h3>\n<p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>error</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>message</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"429--rate-limit-exceeded-max-1-push-per-minute-per-pbx-wait-retry-after\"><code>429</code> — Rate limit exceeded (max 1 push per minute per PBX). Wait <code>Retry-After</code></h3>\n<p>Rate limit exceeded (max 1 push per minute per PBX). Wait <code>Retry-After</code>\nseconds before retrying.</p>\n<p><strong>Headers</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Type</th>\n<th>Example</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Retry-After</code></td>\n<td>integer</td>\n<td><code>46</code></td>\n<td>Seconds to wait before the next allowed request.</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Limit</code></td>\n<td>integer</td>\n<td><code>1</code></td>\n<td>Max requests allowed in the window (1).</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Remaining</code></td>\n<td>integer</td>\n<td><code>0</code></td>\n<td>Requests remaining in the window (0 while throttled).</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Reset</code></td>\n<td>integer</td>\n<td><code>1781265182</code></td>\n<td>Unix timestamp when the window resets.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"500--the-push-could-not-be-recorded-retry-later\"><code>500</code> — The push could not be recorded; retry later.</h3>\n<p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>error</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>message</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["{{version}}","push-configuration"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"1f0fed46-032e-41af-a1ed-df35e10b526b","name":"200 — Configuration push recorded.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"{{baseUrl}}/{{version}}/push-configuration","description":"Push the caller's PBX configuration so pending changes take effect - the\nprogrammatic equivalent of the \"Push configuration\" button in Cockpit.\n\n**Rate limit:** 1 request per minute per PBX. Exceeding it returns `429` with\na `Retry-After` header.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"pushed\",\n  \"pushed_at\": \"2026-06-15 09:12:04\"\n}"},{"id":"09c79f27-524d-43cb-b805-e81a2e4592e8","name":"401 — Authorization Token Missing This error is returned when the authorization token is missing.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"{{baseUrl}}/{{version}}/push-configuration","description":"Push the caller's PBX configuration so pending changes take effect - the\nprogrammatic equivalent of the \"Push configuration\" button in Cockpit.\n\n**Rate limit:** 1 request per minute per PBX. Exceeding it returns `429` with\na `Retry-After` header.\n"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Cache-Control","value":"private, must-revalidate","description":""},{"key":"Connection","value":"keep-alive","description":""},{"key":"Vary","value":"Origin","description":""},{"key":"X-RateLimit-Limit","value":"60","description":"Max requests allowed in the current rate-limit window."},{"key":"X-RateLimit-Remaining","value":"57","description":"Requests remaining in the current rate-limit window."}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Authorization Token is missing\"\n}"},{"id":"e28a1925-1db5-4e31-9cdb-69002d99ea6f","name":"409 — Configuration pushes are currently locked for this PBX.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"{{baseUrl}}/{{version}}/push-configuration","description":"Push the caller's PBX configuration so pending changes take effect - the\nprogrammatic equivalent of the \"Push configuration\" button in Cockpit.\n\n**Rate limit:** 1 request per minute per PBX. Exceeding it returns `429` with\na `Retry-After` header.\n"},"status":"Conflict","code":409,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"push_configuration_locked\",\n  \"message\": \"Configuration pushes are currently locked for this PBX.\"\n}"},{"id":"7daa2e63-207b-4216-86e2-1fe8aebfc93b","name":"429 — Rate limit exceeded (max 1 push per minute per PBX). Wait `Retry-After` seconds before retrying.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"{{baseUrl}}/{{version}}/push-configuration","description":"Push the caller's PBX configuration so pending changes take effect - the\nprogrammatic equivalent of the \"Push configuration\" button in Cockpit.\n\n**Rate limit:** 1 request per minute per PBX. Exceeding it returns `429` with\na `Retry-After` header.\n"},"status":"Too Many Requests","code":429,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"text/plain"},{"key":"Retry-After","value":"46","description":"Seconds to wait before the next allowed request."},{"key":"X-RateLimit-Limit","value":"1","description":"Max requests allowed in the window (1)."},{"key":"X-RateLimit-Remaining","value":"0","description":"Requests remaining in the window (0 while throttled)."},{"key":"X-RateLimit-Reset","value":"1781265182","description":"Unix timestamp when the window resets."}],"cookie":[],"responseTime":null,"body":"Rate limit exceeded (max 1 push per minute per PBX). Wait `Retry-After`\nseconds before retrying.\n"},{"id":"ad815bb6-9752-4944-98d4-7dec40123313","name":"500 — The push could not be recorded; retry later.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"{{baseUrl}}/{{version}}/push-configuration","description":"Push the caller's PBX configuration so pending changes take effect - the\nprogrammatic equivalent of the \"Push configuration\" button in Cockpit.\n\n**Rate limit:** 1 request per minute per PBX. Exceeding it returns `429` with\na `Retry-After` header.\n"},"status":"Internal Server Error","code":500,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"push_failed\",\n  \"message\": \"Could not push the configuration. Please try again later.\"\n}"}],"_postman_id":"181050e8-4923-414c-9862-fc6784a97a2f"}],"id":"fc317d58-5593-40db-8bdd-9dd597eac727","description":"<p>Push the PBX configuration so pending changes take effect - the programmatic equivalent of the \"Push configuration\"\nbutton in Cockpit. PBX API key auth; rate limited to 1 request/minute per PBX.</p>\n","_postman_id":"fc317d58-5593-40db-8bdd-9dd597eac727"},{"name":"Authenticate","item":[{"name":"Login without code","item":[{"name":"Request code","id":"46562526-2964-446b-8600-ca4d32d339e0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"email\": \"demo@yourdomain.lu\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/passwordless/login","description":"<h3 id=\"passwordless-login\">Passwordless Login</h3>\n<p>This endpoint allows users to initiate a passwordless login flow by providing their email.</p>\n<h3 id=\"request\"><strong>Request</strong></h3>\n<ul>\n<li>email (string, required): The email address of the user initiating the passwordless login.</li>\n</ul>\n<h4 id=\"response\">Response</h4>\n<p>The response for this request is a JSON object with the following schema:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"status\": \"string\",\n  \"message\": \"string\"\n}\n\n</code></pre>\n<ul>\n<li><p>status (string): The status of the verification process.</p>\n</li>\n<li><p>message (string): A message indicating the result of the verification process.</p>\n</li>\n</ul>\n","urlObject":{"path":["{{version}}","passwordless","login"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"46562526-2964-446b-8600-ca4d32d339e0"},{"name":"Resend code","id":"d4394fdf-68fd-4bf9-907e-4502fb3ce90e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"email\": \"admin@demo.com\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/passwordless/resend","description":"<h3 id=\"passwordless-resend\">Passwordless Resend</h3>\n<p>This endpoint is used to resend a passwordless authentication link to the specified email address.</p>\n<h4 id=\"request-body\">Request Body</h4>\n<ul>\n<li>email (string, required): The email address to which the authentication link will be sent.</li>\n</ul>\n<h4 id=\"response\">Response</h4>\n<p>The response for this request is a JSON object with the following schema:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"status\": \"string\",\n  \"message\": \"string\"\n}\n\n</code></pre>\n<ul>\n<li><p>status (string): The status of the verification process.</p>\n</li>\n<li><p>message (string): A message indicating the result of the verification process.</p>\n</li>\n</ul>\n","urlObject":{"path":["{{version}}","passwordless","resend"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"d4394fdf-68fd-4bf9-907e-4502fb3ce90e"},{"name":"Verify Code","id":"438b95a0-d003-4df0-99a2-f239fe78de39","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"email\": \"demo@mixvoip.com\",\n    \"code\": \"284737\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/passwordless/verify","description":"<p>This endpoint is used to verify a passwordless authentication code sent to the user's email.</p>\n<h4 id=\"request-body\">Request Body</h4>\n<ul>\n<li><p>email (string, required): The email address to which the verification code was sent.</p>\n</li>\n<li><p>code (string, required): The verification code received by the user.</p>\n</li>\n</ul>\n<h4 id=\"response\">Response</h4>\n<p>The response for this request is a JSON object with the following schema:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"status\": \"string\",\n  \"message\": \"string\"\n}\n\n</code></pre>\n<ul>\n<li><p>status (string): The status of the verification process.</p>\n</li>\n<li><p>message (string): A message indicating the result of the verification process.</p>\n</li>\n</ul>\n","urlObject":{"path":["{{version}}","passwordless","verify"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"438b95a0-d003-4df0-99a2-f239fe78de39"}],"id":"20f4d32c-2e8e-4f8e-9be2-0f0ca8d943db","description":"<p>The \"Login without code\" folder documents passwordless authentication flows for Cockpit APIs. These flows allow users to sign in without entering their password by using a magic link or a one-time verification code sent via email. They are ideal for customer-facing or low-friction login experiences where you do not want to directly handle user passwords.</p>\n<p>Use this folder if:</p>\n<ul>\n<li><p>You want users to authenticate without typing a password.</p>\n</li>\n<li><p>You are sending login links or verification codes to the user’s email address.</p>\n</li>\n<li><p>You prefer short-lived, verification-based sessions instead of collecting persistent credentials.</p>\n</li>\n</ul>\n<p>For classic username/password authentication, use the \"Basic Auth Option\"</p>\n","_postman_id":"20f4d32c-2e8e-4f8e-9be2-0f0ca8d943db"},{"name":"Login","event":[{"listen":"test","script":{"exec":["const responseJson = pm.response.json();","","if (responseJson.data) {","    pm.environment.set(\"cockpit_auth\", responseJson.data.token);","}"],"type":"text/javascript","packages":{},"requests":{},"id":"0e0c2d23-cbea-4aa8-a9da-3b76987962f3"}}],"id":"9f1abd91-672a-475c-a00e-569cd1767e45","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"email\": \"{{email}}\",\n    \"password\": \"{{password}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/login","description":"<p>Authenticate a Cockpit user using <strong>email and password</strong> and obtain a <code>cockpit_auth</code> access token that is required to call protected endpoints such as <a href=\"https://request/34626147-e9a1a28e-d63d-43c3-9abb-58a1d6f74799\"><code>Me</code></a> or call‑control APIs.</p>\n<p>This request is implemented as a classic, stateful login endpoint. It does <strong>not</strong> require an existing bearer token; instead, it issues a new token when valid credentials are provided.</p>\n<hr />\n<h3 id=\"request\">Request</h3>\n<p><strong>Method</strong>: <code>POST</code><br /><strong>URL</strong>: <code>{{baseUrl}}/{{version}}/login</code></p>\n<h4 id=\"headers\">Headers</h4>\n<ul>\n<li><code>Content-Type: application/json</code></li>\n</ul>\n<p>No <code>Authorization</code> header is required for this request itself.</p>\n<h4 id=\"body\">Body</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"email\": \"{{email}}\",\n  \"password\": \"{{password}}\"\n}\n\n</code></pre>\n<ul>\n<li><p><code>email</code> (string, required)</p>\n<ul>\n<li><p>Must be a syntactically valid email address.</p>\n</li>\n<li><p>Examples of invalid values: empty string, malformed email (e.g., <code>user@</code>, <code>userexample.com</code>).</p>\n</li>\n</ul>\n</li>\n<li><p><code>password</code> (string, required)</p>\n<ul>\n<li><p>Non‑empty string containing the user’s password.</p>\n</li>\n<li><p>The API does not expose specific password complexity errors; invalid credentials are treated as authentication failures (see below).</p>\n</li>\n</ul>\n</li>\n</ul>\n<p>Environment variables <code>{{email}}</code> and <code>{{password}}</code> should be set in the active Cockpit environment (such as <code>[PROD] cockpit.voxbi.com</code>).</p>\n<hr />\n<h3 id=\"behaviors--responses-based-on-saved-examples\">Behaviors &amp; Responses (based on saved examples)</h3>\n<p>This endpoint has several documented behaviors, inferred from its saved examples:</p>\n<h4 id=\"1-200-ok--login-success\">1. 200 OK — Login Success</h4>\n<p><strong>Example</strong>: <em>“200 OK – Login Success”</em><br /><strong>Status code</strong>: <code>200</code></p>\n<p>When a valid <code>email</code> + <code>password</code> combination is provided:</p>\n<ul>\n<li><p>The response contains a <code>data</code> object with an authentication <code>token</code> (stored in the environment as <code>cockpit_auth</code> by the request’s test script).</p>\n</li>\n<li><p>Clients must persist this token (securely) and use it as a <strong>Bearer token</strong> for subsequent Cockpit API calls:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">  Authorization: Bearer {{cockpit_auth}}\n\n</code></pre>\n</li>\n</ul>\n<p>Typical next step after a successful login:</p>\n<ul>\n<li>Call <a href=\"https://request/34626147-e9a1a28e-d63d-43c3-9abb-58a1d6f74799\"><code>GET /me</code></a> to bootstrap the user’s PBX context.</li>\n</ul>\n<hr />\n<h4 id=\"2-4xx--validation-errors-request-payload-invalid\">2. 4xx — Validation Errors (Request Payload Invalid)</h4>\n<p><strong>Example</strong>: <em>“Login (Validation Error)”</em> (status code 4xx)<br />These responses occur when the payload is <strong>syntactically accepted as JSON</strong> but fails field‑level validation.</p>\n<p>Typical characteristics (Laravel‑style validation errors):</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"The given data was invalid.\",\n  \"errors\": {\n    \"email\": [\n      \"The email field is required.\",\n      \"The email must be a valid email address.\"\n    ],\n    \"password\": [\n      \"The password field is required.\"\n    ]\n  }\n}\n\n</code></pre>\n<p>Common causes:</p>\n<ul>\n<li><p>Missing <code>email</code> or <code>password</code> fields.</p>\n</li>\n<li><p><code>email</code> is not a valid email format.</p>\n</li>\n<li><p>One or both fields are empty.</p>\n</li>\n</ul>\n<p><strong>Client handling recommendations</strong>:</p>\n<ul>\n<li><p>Parse <code>errors</code> and surface <strong>field‑specific messages</strong> beside the corresponding form inputs.</p>\n</li>\n<li><p>Treat these as <strong>user‑correctable input errors</strong>, not as authentication failures.</p>\n</li>\n</ul>\n<hr />\n<h4 id=\"3-401-unauthorized--invalid-credentials\">3. 401 Unauthorized — Invalid Credentials</h4>\n<p><strong>Example</strong>: <em>“401 Unauthorized – Invalid Credentials”</em><br /><strong>Status code</strong>: <code>401</code></p>\n<p>The credentials are <strong>syntactically valid</strong> (correct email format, non‑empty password) but do not match any active user account.</p>\n<p>Typical response shape:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Invalid credentials.\",\n  \"status\": 401\n}\n\n</code></pre>\n<p><strong>Client handling recommendations</strong>:</p>\n<ul>\n<li><p>Show a generic “invalid email or password” error without exposing whether the email exists.</p>\n</li>\n<li><p>Do <strong>not</strong> distinguish between “wrong email” and “wrong password” in user‑facing messages for security reasons.</p>\n</li>\n<li><p>Optionally, limit repeated attempts (e.g., backoff, captcha) based on product requirements.</p>\n</li>\n</ul>\n<hr />\n<h4 id=\"4-noauth--missing-or-invalid-token-scenarios\">4. No‑Auth / Missing or Invalid Token Scenarios</h4>\n<p>This login endpoint itself <strong>does not require a bearer token</strong> and is <strong>not expected</strong> to return authorization errors due to missing/invalid <code>Authorization</code> headers.</p>\n<p>However, the token it returns (<code>cockpit_auth</code>) is used to authenticate subsequent requests. Authorization failures (e.g., missing/expired token) will occur on <strong>other endpoints</strong>, not on <code>/login</code> itself. Typical patterns there include:</p>\n<ul>\n<li><p><code>401 Unauthorized</code> — Missing or invalid <code>Authorization: Bearer</code> header.</p>\n</li>\n<li><p><code>403 Forbidden</code> — Token is valid but does not have permission for the requested resource.</p>\n</li>\n</ul>\n<p>These behaviors are documented at the level of those protected endpoints rather than on this login request.</p>\n<hr />\n<h3 id=\"summary-of-status-codes--examples\">Summary of Status Codes &amp; Examples</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP Status</th>\n<th>Meaning</th>\n<th>Example name</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200</code></td>\n<td>Login succeeded, token issued</td>\n<td><code>200 OK – Login Success</code></td>\n</tr>\n<tr>\n<td><code>4xx</code></td>\n<td>Validation error on request payload</td>\n<td><code>Login (Validation Error)</code></td>\n</tr>\n<tr>\n<td><code>401</code></td>\n<td>Invalid credentials (auth failure)</td>\n<td><code>401 Unauthorized – Invalid Credentials</code></td>\n</tr>\n</tbody>\n</table>\n</div><p>Use these examples as references when implementing both <strong>client‑side validation</strong> (for request construction) and <strong>error handling</strong> (for interpreting responses).</p>\n","urlObject":{"path":["{{version}}","login"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"4621dadf-45b2-4ed4-a0c7-d35c6f9d0f42","name":"200 OK – Login Success","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"email\": \"{{email}}\",\n    \"password\": \"{{password}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/login"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Server","value":"nginx/1.25.3"},{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"Vary","value":"Accept-Encoding"},{"key":"Vary","value":"Origin"},{"key":"Cache-Control","value":"private, must-revalidate"},{"key":"Date","value":"Tue, 16 Dec 2025 12:22:17 GMT"},{"key":"Last-Modified","value":"Tue, 16 Dec 2025 12:22:17 GMT"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"59"},{"key":"Alt-Svc","value":"h3=\":443\""},{"key":"Content-Encoding","value":"gzip"}],"cookie":[],"responseTime":null,"body":"{\n    \"message\": \"User Logged In Successfully\",\n    \"data\": {\n        \"token\": \"a09b4721-ce8d-4444-84ba-0ea378813bdc|E0fOQ8pylpviuGlCVQvEnXVzzf8UQtHyBDqnuq9y1ffcd252\"\n    }\n}"},{"id":"fe64a340-9218-4fe1-b344-9c8a5858dba2","name":"422 Unprocessable Content – Validation Error","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"email\": \"{{email}}\",\n    \"password\": \"{{password}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/login"},"status":"Unprocessable Content","code":422,"_postman_previewlanguage":"json","header":[{"key":"Server","value":"nginx/1.25.3"},{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"Cache-Control","value":"private, must-revalidate"},{"key":"Date","value":"Tue, 16 Dec 2025 12:23:08 GMT"},{"key":"Last-Modified","value":"Tue, 16 Dec 2025 12:23:08 GMT"},{"key":"ETag","value":"bbacad2da6528dab74ae67e7ad3a43e5"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"59"},{"key":"Vary","value":"Origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"errors\": {\n        \"password\": [\n            \"The password field must be a string.\",\n            \"The password field is required.\"\n        ]\n    }\n}"},{"id":"597677d9-2847-4949-836d-aa5ecb545b92","name":"401 Unauthorized – Invalid Credentials","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"email\": \"{{email}}\",\n    \"password\": \"{{password}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/login"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Server","value":"nginx/1.25.3"},{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"Cache-Control","value":"private, must-revalidate"},{"key":"Date","value":"Tue, 16 Dec 2025 12:23:30 GMT"},{"key":"Last-Modified","value":"Tue, 16 Dec 2025 12:23:30 GMT"},{"key":"ETag","value":"8311547e267e7326a1f935510dd05e69"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"59"},{"key":"Vary","value":"Origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"message\": \"Invalid email or password.\"\n}"}],"_postman_id":"9f1abd91-672a-475c-a00e-569cd1767e45"},{"name":"Me","id":"ab710e6a-3ed4-4881-aa79-3180207b985a","protocolProfileBehavior":{"protocolVersion":"auto","disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{cockpit_auth}}"}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"{{baseUrl}}/{{version}}/me","description":"<p><code>GET {{baseUrl}}/{{version}}/me</code> returns the authenticated user’s profile together with all information required to configure the Voxbi Cockpit client for that user.</p>\n<p>The response contains:</p>\n<ul>\n<li><p>Basic identity (user id, name, email, language, status)</p>\n</li>\n<li><p>An access token scoped to the PBX context</p>\n</li>\n<li><p>WebRTC configuration for the built‑in softphone</p>\n</li>\n<li><p>PBX extensions and groups the user belongs to</p>\n</li>\n<li><p>PBX instance details (numbers, caller IDs, settings)</p>\n</li>\n<li><p>Twinnings (linked mobile numbers/devices)</p>\n</li>\n<li><p>Caller identities the user can present</p>\n</li>\n<li><p>Integrations configured for the PBX</p>\n</li>\n</ul>\n<p>This endpoint is read‑only and does not modify any server state.</p>\n<p><strong>When to use this endpoint</strong></p>\n<p>This is the <strong>primary route an authenticated client should call immediately after login</strong>. Once a user has successfully authenticated and you have a valid <code>cockpit_auth</code> bearer token, call <code>GET {{baseUrl}}/{{version}}/me</code> to retrieve everything needed to initialize the app for that user, for example:</p>\n<ul>\n<li><p>Displaying the correct user name and avatar/initials</p>\n</li>\n<li><p>Showing the main extension and any additional extensions</p>\n</li>\n<li><p>Determining which groups/queues the user is part of</p>\n</li>\n<li><p>Loading WebRTC/SIP configuration for the in‑app softphone</p>\n</li>\n<li><p>Determining feature rights (telephony allowed, DND, voicemail, call recording visibility, etc.)</p>\n</li>\n<li><p>Loading PBX‑level context (main numbers, caller IDs, instance name)</p>\n</li>\n<li><p>Understanding twinning configuration for mobile devices and push notifications</p>\n</li>\n</ul>\n<p>Clients typically call this endpoint:</p>\n<ol>\n<li><p>Right after login, to build the initial session context.</p>\n</li>\n<li><p>Whenever a full refresh of the user’s PBX context is needed (e.g. after changing rights or twinning settings elsewhere).</p>\n</li>\n</ol>\n<p><strong>Authentication</strong></p>\n<ul>\n<li><p>Method: <strong>GET</strong></p>\n</li>\n<li><p>URL: <code>{{baseUrl}}/{{version}}/me</code></p>\n</li>\n<li><p>Auth: <strong>Bearer token</strong> in the <code>Authorization</code> header</p>\n<ul>\n<li><code>Authorization: Bearer {{cockpit_auth}}</code></li>\n</ul>\n</li>\n<li><p>A valid <code>cockpit_auth</code> token is required; otherwise the request will fail with an authorization error.</p>\n</li>\n</ul>\n<p><strong>Response structure (top‑level fields)</strong></p>\n<p>The successful <code>200 OK</code> response body is wrapped in a <code>data</code> object. The table below describes the main attributes inside <code>data</code> and how clients typically use them.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description / Typical usage</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>Unique identifier of the user in the PBX/Cockpit system. Use as the primary user key when making other user‑specific API calls.</td>\n</tr>\n<tr>\n<td><code>pbx_id</code></td>\n<td>string</td>\n<td>Identifier of the PBX instance this user belongs to. Useful when working with multi‑PBX environments or cross‑referencing PBX‑scoped resources.</td>\n</tr>\n<tr>\n<td><code>full_name_with_email</code></td>\n<td>string</td>\n<td>Display‑ready string combining full name and email (e.g. <code>John Doe (john@example.com)</code>). Commonly used in UI when you want a single label for the user.</td>\n</tr>\n<tr>\n<td><code>first_name</code></td>\n<td>string</td>\n<td>User’s first name. Use for personalized greetings and compact displays.</td>\n</tr>\n<tr>\n<td><code>last_name</code></td>\n<td>string</td>\n<td>User’s last name. Combine with <code>first_name</code> for display name if you don’t use <code>full_name_with_email</code>.</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>User’s primary login and contact email. May be used for notifications and support flows.</td>\n</tr>\n<tr>\n<td><code>language</code></td>\n<td>string</td>\n<td>User’s preferred UI language (e.g. <code>en</code>, <code>fr</code>). Use to select the correct locale in the client.</td>\n</tr>\n<tr>\n<td><code>access_token</code></td>\n<td>string</td>\n<td>Access token for PBX‑level operations in the user context. The client can use this where PBX APIs require a user‑scoped token (store securely, never expose in logs).</td>\n</tr>\n<tr>\n<td><code>email_verified_at</code></td>\n<td>string / null</td>\n<td>Timestamp when the email was verified, if applicable. May be used to decide whether to prompt the user for verification.</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>User status in the PBX (e.g. <code>enabled</code>, <code>disabled</code>). If not <code>enabled</code>, the client may restrict telephony or show an appropriate warning.</td>\n</tr>\n<tr>\n<td><code>allow_telephony</code></td>\n<td>boolean</td>\n<td>Indicates whether this user is allowed to place/receive calls. Use to enable/disable calling features in the UI.</td>\n</tr>\n<tr>\n<td><code>allow_dnd</code></td>\n<td>boolean</td>\n<td>Whether the user can toggle Do Not Disturb. Controls whether DND settings are editable in the client.</td>\n</tr>\n<tr>\n<td><code>allow_change_twinning_dest</code></td>\n<td>boolean</td>\n<td>Whether the user can change their twinning destination (linked external number). If <code>false</code>, hide or disable related UI controls.</td>\n</tr>\n<tr>\n<td><code>allow_call_forwarding</code></td>\n<td>boolean</td>\n<td>Whether the user may configure call forwarding. Guides whether forwarding options are shown in settings.</td>\n</tr>\n<tr>\n<td><code>allow_manage_global_contacts</code></td>\n<td>boolean</td>\n<td>Permission flag indicating if the user can create/edit global contacts. Use to gate contact‑management features affecting the whole PBX.</td>\n</tr>\n<tr>\n<td><code>call_recordings_visibility</code></td>\n<td>string</td>\n<td>Defines which recordings the user can access (e.g. <code>own_calls_only</code>). Use to scope the call recordings list in the app.</td>\n</tr>\n<tr>\n<td><code>extension_roaming</code></td>\n<td>boolean</td>\n<td>Indicates if the user’s extension can roam between devices. Can influence how you present device/extension binding in the UI.</td>\n</tr>\n<tr>\n<td><code>call_information_visibility</code></td>\n<td>string</td>\n<td>Scope of call information the user can see (e.g. only own calls vs. group/company calls). Use to filter call history views.</td>\n</tr>\n<tr>\n<td><code>allow_status_changer</code></td>\n<td>boolean</td>\n<td>Whether the user is allowed to change their availability / presence status. Drives whether presence controls are shown.</td>\n</tr>\n<tr>\n<td><code>allow_manage_voicemail_parameters</code></td>\n<td>boolean</td>\n<td>Whether the user can manage voicemail settings such as destination and greetings. Use to show/hide voicemail configuration UI.</td>\n</tr>\n<tr>\n<td><code>show_in_address_book</code></td>\n<td>boolean</td>\n<td>Whether this user should appear in shared address books. Clients may hide users with this set to <code>false</code> in certain directory views.</td>\n</tr>\n<tr>\n<td><code>voicemail_type</code></td>\n<td>string</td>\n<td>Type of voicemail service for this user (e.g. <code>enabled</code>, <code>disabled</code>, or specific modes). Affects how voicemail features are presented.</td>\n</tr>\n<tr>\n<td><code>voicemail_destination</code></td>\n<td>string</td>\n<td>Where voicemails are delivered (e.g. <code>email_only</code>). Use to display current voicemail routing.</td>\n</tr>\n<tr>\n<td><code>concurrent_calls</code></td>\n<td>boolean</td>\n<td>Whether multiple concurrent calls are allowed for this user. Can be used to adjust UI behavior around call waiting/holding.</td>\n</tr>\n<tr>\n<td><code>vip</code></td>\n<td>boolean</td>\n<td>VIP flag; may be used to highlight the user or apply special routing/permissions in the client UI.</td>\n</tr>\n<tr>\n<td><code>sync_source</code></td>\n<td>string</td>\n<td>Indicates how the user was created/synchronized (e.g. <code>provision</code>). Mostly useful for admin/diagnostic screens.</td>\n</tr>\n<tr>\n<td><code>allow_anonymous_calls</code></td>\n<td>boolean</td>\n<td>Whether the user is allowed to present anonymous caller ID. Use to enable/disable “hide my number” options.</td>\n</tr>\n<tr>\n<td><code>identity_provider_uid</code></td>\n<td>string</td>\n<td>Identifier of the external identity provider record (if any). Relevant for SSO/identity management integrations.</td>\n</tr>\n<tr>\n<td><code>is_shadow</code></td>\n<td>boolean</td>\n<td>Marks shadow/technical users. Clients may hide or treat such users differently in the UI.</td>\n</tr>\n<tr>\n<td><code>created_at</code></td>\n<td>string</td>\n<td>Creation timestamp for the user record. Primarily informational or for admin views.</td>\n</tr>\n<tr>\n<td><code>updated_at</code></td>\n<td>string</td>\n<td>Last update timestamp for the user record. Can be used to detect when local cached data may be stale.</td>\n</tr>\n<tr>\n<td><code>webrtc_configuration</code></td>\n<td>object</td>\n<td>Contains WebRTC softphone configuration such as username, password, and WebSocket connection string. Use this to configure the in‑app WebRTC/SIP client.</td>\n</tr>\n<tr>\n<td><code>extensions</code></td>\n<td>array</td>\n<td>List of PBX extensions associated with the user (number, name, recording flags, etc.). The client typically uses this to pick the primary extension and show/manage associated numbers.</td>\n</tr>\n<tr>\n<td><code>groups</code></td>\n<td>array</td>\n<td>Groups or queues the user belongs to (e.g. departments, call queues). Use to show group memberships and to scope features like group contacts and call pickups.</td>\n</tr>\n<tr>\n<td><code>allow_manage_group_contacts</code></td>\n<td>array</td>\n<td>Groups for which the user can manage contacts. Use this to enable contact‑management features only for the relevant groups.</td>\n</tr>\n<tr>\n<td><code>allow_access_to_group_contacts</code></td>\n<td>array</td>\n<td>Groups for which the user can access shared contacts. Drives which shared address books are visible to the user.</td>\n</tr>\n<tr>\n<td><code>pbx</code></td>\n<td>object</td>\n<td>PBX instance details (name, instance_name, numbers, servers, caller identities, settings). Use to display tenant information and to determine default caller IDs.</td>\n</tr>\n<tr>\n<td><code>twinnings</code></td>\n<td>array</td>\n<td>User twinning configurations (linked mobile numbers/devices and push tokens). Use to show and manage parallel ringing to mobiles and app push notifications.</td>\n</tr>\n<tr>\n<td><code>caller_identities</code></td>\n<td>array</td>\n<td>Caller identities this user can present (numbers and labels). Clients typically build the “outgoing caller ID” selection from this list.</td>\n</tr>\n<tr>\n<td><code>integrations</code></td>\n<td>array</td>\n<td>Third‑party or internal integrations configured for this PBX/user (e.g. CRM connectors). Use to enable/disable or configure integration‑related UI and flows.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Additional nested fields may be added over time. Clients should ignore unknown properties to remain forward‑compatible.</p>\n","urlObject":{"path":["{{version}}","me"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"743031d9-019c-453d-8e3f-9ee6686d19b1","name":"Me (200 OK)","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"https://cockpit.voxbi.com/api/v1/me"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":":status","value":200},{"key":"server","value":"nginx/1.25.3"},{"key":"content-type","value":"application/json"},{"key":"vary","value":"Accept-Encoding, Origin"},{"key":"cache-control","value":"private, must-revalidate"},{"key":"date","value":"Tue, 16 Dec 2025 12:36:37 GMT"},{"key":"last-modified","value":"Tue, 16 Dec 2025 12:36:37 GMT"},{"key":"x-ratelimit-limit","value":"60"},{"key":"x-ratelimit-remaining","value":"59"},{"key":"alt-svc","value":"h3=\":443\""},{"key":"content-encoding","value":"gzip"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": {\n    \"id\": \"bf121259-f9ae-****\",\n    \"pbx_id\": \"eb2109dd-adc7-****\",\n    \"full_name_with_email\": \"*** (***)\",\n    \"first_name\": \"***\",\n    \"last_name\": \"***\",\n    \"email\": \"***\",\n    \"language\": \"en\",\n    \"access_token\": \"[REDACTED]\",\n    \"email_verified_at\": null,\n    \"status\": \"enabled\",\n\n    \"allow_telephony\": true,\n    \"allow_dnd\": false,\n    \"allow_change_twinning_dest\": true,\n    \"allow_call_forwarding\": false,\n\n    \"webrtc_configuration\": {\n      \"username\": \"[REDACTED]\",\n      \"password\": \"[REDACTED]\",\n      \"connection_string\": \"wss://[REDACTED]@pbxMixvoip.voxbi.cloud:8089/pbx/ws\"\n    },\n\n    \"extensions\": [\n      {\n        \"id\": \"6aa692be-d4d3-****\",\n        \"number\": \"****\",\n        \"name\": \"***\",\n        \"record_internal_calls\": true\n      }\n    ],\n\n    \"groups\": [\n      {\n        \"id\": \"9eb4bb68-e451-****\",\n        \"name\": \"***\",\n        \"caller_identities\": [\n          {\n            \"number_with_suffix\": \"********\",\n            \"suffix\": \"**\"\n          }\n        ]\n      }\n    ],\n\n    \"pbx\": {\n      \"id\": \"eb2109dd-adc7-****\",\n      \"name\": \"***\",\n      \"instance_name\": \"***\",\n      \"servers\": [\n        {\n          \"id\": \"8a07e2b0-f55a-****\",\n          \"hostname\": \"***\",\n          \"dns\": \"***\",\n          \"config\": {\n            \"main_ip\": \"5.180.***.***\"\n          }\n        }\n      ]\n    },\n\n    \"twinnings\": [\n      {\n        \"id\": \"9fad5c84-565d-****\",\n        \"status\": \"disabled\",\n        \"phone_number\": \"********\",\n        \"type\": \"mobile\"\n      },\n      {\n        \"id\": \"a091ab6b-4ce0-****\",\n        \"status\": \"enabled\",\n        \"phone_number\": \"********\",\n        \"type\": \"mobile\",\n        \"push_notify\": \"[REDACTED]\",\n        \"push_tokens\": [\n          {\n            \"id\": \"a08d355e-3cbd-****\",\n            \"type\": \"apn\",\n            \"token\": \"[REDACTED]\"\n          },\n          {\n            \"id\": \"676e8a4f-c4c3-****\",\n            \"type\": \"fcm\",\n            \"token\": \"[REDACTED]\"\n          }\n        ]\n      }\n    ],\n\n    \"caller_identities\": [\n      {\n        \"id\": \"9f5b4f38-1c89-****\",\n        \"number_without_suffix\": \"********\",\n        \"number_with_suffix\": \"********\",\n        \"suffix\": \"**\",\n        \"label\": \"***\"\n      }\n    ],\n\n    \"integrations\": [\n      {\n        \"id\": \"9f2b2642-0323-****\",\n        \"type\": \"odoo\",\n        \"url\": \"https://voxbi-19.odoo.com\",\n        \"is_active\": true\n      },\n      {\n        \"id\": \"f1db1aef-3ac0-****\",\n        \"type\": \"Grafana\",\n        \"url\": \"https://mixvoipcloud.voxbi.ws\",\n        \"login_url\": \"https://cockpit.voxbi.com/grafana/login\"\n      }\n    ]\n  }\n}\n"}],"_postman_id":"ab710e6a-3ed4-4881-aa79-3180207b985a"}],"id":"af35a30d-2f3a-4528-a8cf-4992d72d211f","description":"<p>The <strong>Authenticate</strong> folder documents how to obtain a Cockpit access token for use with all subsequent API calls. There are two main ways to get this token:</p>\n<ol>\n<li><p><strong>Basic email + password login (traditional login)</strong>  </p>\n<ul>\n<li>The client collects the user’s email and password and sends them to the API.  </li>\n<li>After validating the credentials, the API returns an access token that represents the authenticated user.</li>\n</ul>\n</li>\n<li><p><strong>Passwordless login without a password</strong>  </p>\n<ul>\n<li>The client collects only the user’s email address.  </li>\n<li>The user receives a verification code or magic link via email and uses it to complete the login.  </li>\n<li>The verified code is then exchanged for an access token.</li>\n</ul>\n</li>\n</ol>\n<p>In this folder:</p>\n<ul>\n<li>The <strong>basic email + password</strong> flow is documented in detail in the <strong>\"Login (Basic Auth)\"</strong> request.  </li>\n<li>The <strong>passwordless</strong> flow is documented in the nested <strong>\"Login without code\"</strong> folder.  </li>\n<li>This parent <strong>Authenticate</strong> folder serves as the conceptual overview of both token acquisition options.</li>\n</ul>\n<p>In both flows, the result is a bearer token (commonly stored as <code>{{cockpit_auth}}</code>) that must be sent with all authenticated requests using the HTTP <code>Authorization</code> header:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">Authorization: Bearer &lt;token&gt;\n</code></pre>\n","_postman_id":"af35a30d-2f3a-4528-a8cf-4992d72d211f"},{"name":"Twinninge","item":[{"name":"Twinnings List","event":[{"listen":"test","script":{"exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Response contains twinnings array\", function () {","    const jsonData = pm.response.json();","    // Support both root array and data wrapper","    const twinnings = Array.isArray(jsonData) ? jsonData : jsonData.data;","    pm.expect(twinnings).to.be.an(\"array\");","});","","pm.test(\"Each twinning has required fields (id, status, dial_strategy)\", function () {","    const jsonData = pm.response.json();","    const twinnings = Array.isArray(jsonData) ? jsonData : jsonData.data;","    ","    if (twinnings.length > 0) {","        twinnings.forEach(function (twinning, index) {","            pm.expect(twinning).to.have.property(\"id\", undefined, `Twinning at index ${index} missing 'id'`);","            pm.expect(twinning).to.have.property(\"status\", undefined, `Twinning at index ${index} missing 'status'`);","            pm.expect(twinning).to.have.property(\"dial_strategy\", undefined, `Twinning at index ${index} missing 'dial_strategy'`);","        });","    }","});"],"type":"text/javascript","packages":{},"requests":{},"id":"a3e68859-c275-47df-b913-73ab020276f1"}}],"id":"47e53210-862f-449c-98d5-dbdc86ffb321","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{cockpit_auth}}"}]},"isInherited":false},"method":"GET","header":[],"body":{"mode":"raw","raw":"{\n    \"per_page\" : 10\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/twinnings","description":"<p>Retrieve the list of twinnings (user devices / routing configurations) available for the authenticated user.</p>\n<p>Each twinning represents a <strong>call routing target</strong> (for example a mobile number or VoIP endpoint) and is identified by an <code>id</code> that must be reused in <strong>call-control endpoints</strong> (such as starting a new call).</p>\n<p>This endpoint is typically called immediately after authentication, together with <code>GET /me</code>.</p>\n<hr />\n<h2 id=\"when-to-call-this-endpoint\">When to call this endpoint</h2>\n<p>Call <code>GET {{baseUrl}}/{{version}}/twinnings</code> when you need to:</p>\n<ul>\n<li><p>Build the list of available <strong>devices / routing targets</strong></p>\n</li>\n<li><p>Display which devices are configured for <strong>parallel or selective ringing</strong></p>\n</li>\n<li><p>Let the user choose a <strong>source or target device</strong> when starting a call</p>\n</li>\n<li><p>Refresh UI state after twinning configuration changes</p>\n</li>\n</ul>\n<h3 id=\"common-flows\">Common flows</h3>\n<p><strong>After login</strong></p>\n<ol>\n<li><p><code>POST /login</code> → obtain <code>{{cockpit_auth}}</code></p>\n</li>\n<li><p><code>GET /me</code> → load user + PBX context</p>\n</li>\n<li><p><code>GET /twinnings</code> → load available devices</p>\n</li>\n</ol>\n<p><strong>Before starting a call</strong></p>\n<ol>\n<li><p><code>GET /twinnings</code></p>\n</li>\n<li><p>Use returned <code>id</code> values when calling <code>POST /calls/new</code></p>\n</li>\n</ol>\n<hr />\n<h2 id=\"authentication\">Authentication</h2>\n<p><strong>Protected endpoint</strong></p>\n<p><strong>Method:</strong> <code>GET</code><br /><strong>URL:</strong> <code>{{baseUrl}}/{{version}}/twinnings</code><br /><strong>Auth:</strong> Bearer token</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: Bearer {{cockpit_auth}}\n\n</code></pre><p>Missing or invalid tokens result in:</p>\n<ul>\n<li><p><code>401 Unauthorized</code></p>\n</li>\n<li><p><code>403 Forbidden</code></p>\n</li>\n</ul>\n<hr />\n<h2 id=\"request-parameters\">Request parameters</h2>\n<p>This endpoint supports pagination via the request body (legacy behavior):</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"per_page\": 10\n}\n\n</code></pre>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>per_page</td>\n<td>integer</td>\n<td>No</td>\n<td>Number of twinnings per page</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n</blockquote>\n<p>⚠️ Note: Although this is a GET request, <code>per_page</code> is accepted in the JSON body for backward compatibility.</p>\n<hr />\n<h2 id=\"response-structure\">Response structure</h2>\n<p>The response is always wrapped in an object with <code>data</code>, <code>links</code>, and <code>meta</code>.</p>\n<h3 id=\"example-response\">Example response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"data\": [\n    {\n      \"id\": \"9fad5c84-565d-****\",\n      \"user_id\": \"bf121259-f9ae-****\",\n      \"status\": \"disabled\",\n      \"phone_number\": \"********\",\n      \"delay\": 0,\n      \"sync_source\": \"provision\",\n      \"type\": \"mobile\",\n      \"created_at\": \"2025-08-20T05:55:03.000000Z\",\n      \"updated_at\": \"2025-12-11T17:44:26.000000Z\",\n      \"deleted_at\": null,\n      \"dial_strategy\": \"gsm_only\"\n    },\n    {\n      \"id\": \"a091ab6b-4ce0-****\",\n      \"user_id\": \"bf121259-f9ae-****\",\n      \"status\": \"enabled\",\n      \"phone_number\": \"********\",\n      \"delay\": 0,\n      \"sync_source\": \"manual\",\n      \"type\": \"mobile\",\n      \"created_at\": \"2025-12-11T17:44:26.000000Z\",\n      \"updated_at\": \"2025-12-11T18:27:59.000000Z\",\n      \"deleted_at\": null,\n      \"dial_strategy\": \"voip_only\"\n    }\n  ],\n  \"links\": { ... },\n  \"meta\": { ... }\n}\n\n</code></pre>\n<hr />\n<h2 id=\"twinning-object-fields-data\">Twinning object fields (<code>data[]</code>)</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td>string</td>\n<td>Unique identifier of the twinning. <strong>Reuse this ID</strong> in call-control endpoints.</td>\n</tr>\n<tr>\n<td>user_id</td>\n<td>string</td>\n<td>ID of the user who owns this twinning.</td>\n</tr>\n<tr>\n<td>status</td>\n<td>string</td>\n<td>Current state of the twinning (<code>enabled</code>, <code>disabled</code>).</td>\n</tr>\n<tr>\n<td>phone_number</td>\n<td>string</td>\n<td>Phone number associated with this twinning (masked in examples).</td>\n</tr>\n<tr>\n<td>delay</td>\n<td>integer</td>\n<td>Delay in seconds before this twinning rings. <code>0</code> means immediate.</td>\n</tr>\n<tr>\n<td>sync_source</td>\n<td>string</td>\n<td>Origin of the configuration (<code>provision</code>, <code>manual</code>).</td>\n</tr>\n<tr>\n<td>type</td>\n<td>string</td>\n<td>Logical device type (e.g. <code>mobile</code>).</td>\n</tr>\n<tr>\n<td>dial_strategy</td>\n<td>string</td>\n<td>Routing strategy (<code>gsm_only</code>, <code>voip_only</code>, etc.).</td>\n</tr>\n<tr>\n<td>created_at</td>\n<td>string (ISO 8601)</td>\n<td>Creation timestamp.</td>\n</tr>\n<tr>\n<td>updated_at</td>\n<td>string (ISO 8601)</td>\n<td>Last update timestamp.</td>\n</tr>\n<tr>\n<td>deleted_at</td>\n<td>string</td>\n<td>null</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n</blockquote>\n<p>❗ Fields such as <code>name</code>, <code>label</code>, <code>phone</code>, or <code>address</code> <strong>are not returned by this endpoint</strong> and should not be expected by clients.</p>\n<hr />\n<h2 id=\"pagination-metadata\">Pagination metadata</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>meta.current_page</td>\n<td>integer</td>\n<td>Current page index</td>\n</tr>\n<tr>\n<td>meta.per_page</td>\n<td>integer</td>\n<td>Items per page</td>\n</tr>\n<tr>\n<td>meta.total</td>\n<td>integer</td>\n<td>Total number of twinnings</td>\n</tr>\n<tr>\n<td>meta.from</td>\n<td>integer</td>\n<td>Index of first item on page</td>\n</tr>\n<tr>\n<td>meta.to</td>\n<td>integer</td>\n<td>Index of last item on page</td>\n</tr>\n<tr>\n<td>meta.last_page</td>\n<td>integer</td>\n<td>Last page index</td>\n</tr>\n<tr>\n<td>meta.path</td>\n<td>string</td>\n<td>Base pagination URL</td>\n</tr>\n<tr>\n<td>meta.links</td>\n<td>array</td>\n<td>Pagination helper objects</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"pagination-links-links\">Pagination links (<code>links</code>)</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>links.first</td>\n<td>string</td>\n<td>URL to first page</td>\n</tr>\n<tr>\n<td>links.last</td>\n<td>string</td>\n<td>URL to last page</td>\n</tr>\n<tr>\n<td>links.prev</td>\n<td>string</td>\n<td>null</td>\n</tr>\n<tr>\n<td>links.next</td>\n<td>string</td>\n<td>null</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"status-codes\">Status codes</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>200</td>\n<td>Twinnings successfully retrieved</td>\n</tr>\n<tr>\n<td>401</td>\n<td>Missing or invalid token</td>\n</tr>\n<tr>\n<td>403</td>\n<td>Token does not grant access</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n","urlObject":{"path":["{{version}}","twinnings"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"8b54e830-94fd-4974-a037-e0dc6d23ca7a","name":"200 OK - Twinnings List","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/{{version}}/twinnings"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Accept","value":"application/json","enabled":true}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"9fad5c84-565d-****\",\n      \"user_id\": \"bf121259-f9ae-****\",\n      \"status\": \"disabled\",\n      \"phone_number\": \"********\",\n      \"delay\": 0,\n      \"sync_source\": \"provision\",\n      \"type\": \"mobile\",\n      \"created_at\": \"2025-08-20T05:55:03.000000Z\",\n      \"updated_at\": \"2025-12-11T17:44:26.000000Z\",\n      \"deleted_at\": null,\n      \"dial_strategy\": \"gsm_only\"\n    },\n    {\n      \"id\": \"a091ab6b-4ce0-****\",\n      \"user_id\": \"bf121259-f9ae-****\",\n      \"status\": \"enabled\",\n      \"phone_number\": \"********\",\n      \"delay\": 0,\n      \"sync_source\": \"manual\",\n      \"type\": \"mobile\",\n      \"created_at\": \"2025-12-11T17:44:26.000000Z\",\n      \"updated_at\": \"2025-12-11T18:27:59.000000Z\",\n      \"deleted_at\": null,\n      \"dial_strategy\": \"voip_only\"\n    }\n  ],\n\n  \"links\": {\n    \"first\": \"https://cockpit.voxbi.com/api/v1/twinnings?page=1\",\n    \"last\": \"https://cockpit.voxbi.com/api/v1/twinnings?page=1\",\n    \"prev\": null,\n    \"next\": null\n  },\n\n  \"meta\": {\n    \"current_page\": 1,\n    \"from\": 1,\n    \"last_page\": 1,\n    \"links\": [\n      {\n        \"url\": null,\n        \"label\": \"&laquo; Previous\",\n        \"active\": false\n      },\n      {\n        \"url\": \"https://cockpit.voxbi.com/api/v1/twinnings?page=1\",\n        \"label\": \"1\",\n        \"active\": true\n      },\n      {\n        \"url\": null,\n        \"label\": \"Next &raquo;\",\n        \"active\": false\n      }\n    ],\n    \"path\": \"https://cockpit.voxbi.com/api/v1/twinnings\",\n    \"per_page\": 10,\n    \"to\": 2,\n    \"total\": 2\n  }\n}\n"}],"_postman_id":"47e53210-862f-449c-98d5-dbdc86ffb321"},{"name":"Single Twinning","event":[{"listen":"test","script":{"exec":["pm.test(\"Status code is 200, 404, or 422\", function () {","    pm.expect(pm.response.code).to.be.oneOf([200, 404, 422]);","});","","pm.test(\"Response is JSON\", function () {","    pm.response.to.be.json;","});","","if (pm.response.code === 200) {","    pm.test(\"Success: Twinning has required fields (id, status, dial_strategy)\", function () {","        const jsonData = pm.response.json();","        const twinning = jsonData.data || jsonData;","        ","        pm.expect(twinning).to.have.property(\"id\");","        pm.expect(twinning).to.have.property(\"status\");","        pm.expect(twinning).to.have.property(\"dial_strategy\");","    });","}","","if (pm.response.code === 404 || pm.response.code === 422) {","    pm.test(\"Error: Laravel-style error structure with message\", function () {","        const jsonData = pm.response.json();","        pm.expect(jsonData).to.have.property(\"message\");","        pm.expect(jsonData.message).to.be.a(\"string\");","    });","","    pm.test(\"Error: Contains errors object with twinning_id array\", function () {","        const jsonData = pm.response.json();","        pm.expect(jsonData).to.have.property(\"errors\");","        pm.expect(jsonData.errors).to.be.an(\"object\");","        pm.expect(jsonData.errors).to.have.property(\"twinning_id\");","        pm.expect(jsonData.errors.twinning_id).to.be.an(\"array\");","    });","}"],"type":"text/javascript","packages":{},"requests":{},"id":"1f05066d-fbc6-4d16-96d5-bada4ca45767"}}],"id":"c5aea344-3479-4677-a0ce-1396b0094e58","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{cockpit_auth}}"}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/twinnings/9fad5c84-565d-4656-970d-103bc9c1f5c8","description":"<h3 id=\"get-single-twinning\">Get Single Twinning</h3>\n<p>Retrieve the details of a <strong>single twinning</strong> (device / routing configuration) by its ID.</p>\n<p>This endpoint is used when you already know the <code>twinning_id</code> (for example, from the <strong>Twinnings List</strong> endpoint) and need the full details for that specific twinning.</p>\n<hr />\n<h4 id=\"request\">Request</h4>\n<p><strong>Method:</strong> <code>GET</code><br /><strong>URL:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">{{baseUrl}}/{{version}}/twinnings/{twinning_id}\n\n</code></pre>\n<p>Example:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">{{baseUrl}}/{{version}}/twinnings/9fad5c84-565d-4656-970d-103bc9c1f5c8\n\n</code></pre>\n<p><strong>Headers:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">Accept: application/json\nAuthorization: Bearer {{cockpit_auth}}\n\n</code></pre>\n<ul>\n<li><code>{{cockpit_auth}}</code> – access token obtained from the Login endpoint.</li>\n</ul>\n<p><strong>Path parameter:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>twinning_id</code></td>\n<td>string</td>\n<td>UUID of the twinning to be fetched.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h4 id=\"when-and-how-this-is-used\">When and How This Is Used</h4>\n<ul>\n<li><p>After listing twinnings with <strong>Twinnings List</strong>, select one <code>id</code> and call <strong>Get Single Twinning</strong> to:</p>\n<ul>\n<li><p>Show a <strong>detail view</strong> in the UI.</p>\n</li>\n<li><p>Check the current <code>status</code> or <code>dial_strategy</code>.</p>\n</li>\n<li><p>Pre‑fill an edit/update form for this specific twinning.</p>\n</li>\n<li><p>Validate that a given <code>twinning_id</code> is still valid for the current user.</p>\n</li>\n</ul>\n</li>\n</ul>\n<hr />\n<h4 id=\"success-response\">Success Response</h4>\n<p>On success, the endpoint returns a <strong>single twinning object</strong>.<br />Implementation may return it directly as the root object or wrapped inside a <code>data</code> property.</p>\n<p>Example shapes:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"data\":   {\n      \"id\": \"a091ab6b-4ce0-****\",\n      \"user_id\": \"bf121259-f9ae-****\",\n      \"status\": \"enabled\",\n      \"phone_number\": \"********\",\n      \"delay\": 0,\n      \"sync_source\": \"manual\",\n      \"type\": \"mobile\",\n      \"created_at\": \"2025-12-11T17:44:26.000000Z\",\n      \"updated_at\": \"2025-12-11T18:27:59.000000Z\",\n      \"deleted_at\": null,\n      \"dial_strategy\": \"voip_only\"\n    }\n}\n\n#### Error Responses\n\nThe tests on this request allow for 3 main codes: **200**, **404**, **422**.\n\n##### 404 Not Found\n\nReturned when the `twinning_id` does not exist or is not accessible.\n\nExample structure (Laravel‑style):\n\n``` json\n{\n  \"message\": \"The selected twinning is invalid.\",\n  \"errors\": {\n    \"twinning_id\": [\n      \"The selected twinning_id is invalid.\"\n    ]\n  }\n}\n\n</code></pre>\n<h5 id=\"422-unprocessable-content\">422 Unprocessable Content</h5>\n<p>Returned when the <code>twinning_id</code> is syntactically invalid (e.g. wrong format) and fails validation.</p>\n<p>Same Laravel‑style error shape:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"The given data was invalid.\",\n  \"errors\": {\n    \"twinning_id\": [\n      \"The twinning_id format is invalid.\"\n    ]\n  }\n}\n\n</code></pre>\n<h5 id=\"401--403-auth-errors\">401 / 403 (Auth errors)</h5>\n<ul>\n<li><p><strong>401 Unauthorized</strong> – missing or invalid <code>Bearer</code> token.</p>\n</li>\n<li><p><strong>403 Forbidden</strong> – token is valid but the user is not allowed to access this twinning (depending on backend policy).</p>\n</li>\n</ul>\n<p>Error payloads include a <code>message</code> field describing the auth error.</p>\n<hr />\n<h4 id=\"summary\">Summary</h4>\n<p>Use this endpoint to fetch <strong>one specific twinning</strong> using its <code>id</code>, typically obtained from <strong>Twinnings List</strong>.<br />On success you get the full twinning object (with all fields listed in the table above).<br />On failure you receive a Laravel‑style error JSON with a <code>message</code> and an <code>errors.twinning_id</code> array explaining what went wrong.</p>\n","urlObject":{"path":["{{version}}","twinnings","9fad5c84-565d-4656-970d-103bc9c1f5c8"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"9abea38d-8116-40fd-8d01-6bf74af9df09","name":"401 Un Authorized","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"{{baseUrl}}/{{version}}/twinnings/1"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"Text","header":[{"key":"Server","value":"nginx/1.25.3"},{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"Cache-Control","value":"private, must-revalidate"},{"key":"Date","value":"Tue, 16 Dec 2025 12:37:14 GMT"},{"key":"Last-Modified","value":"Tue, 16 Dec 2025 12:37:14 GMT"},{"key":"ETag","value":"55194256e3a7df2f22f1d0846ed3f675"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"58"},{"key":"Vary","value":"Origin"}],"cookie":[],"responseTime":null,"body":"{\n    \"message\": \"Unauthenticated.\"\n}"},{"id":"27af249f-1e10-4848-90a2-9596ca1c03c1","name":"403 Forbiden","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"{{baseUrl}}/{{version}}/twinnings/1"},"status":"Forbidden","code":403,"_postman_previewlanguage":"Text","header":[{"key":"Server","value":"nginx/1.25.3"},{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"Vary","value":"Accept-Encoding"},{"key":"Vary","value":"Origin"},{"key":"Cache-Control","value":"private, must-revalidate"},{"key":"Date","value":"Tue, 16 Dec 2025 12:37:48 GMT"},{"key":"Last-Modified","value":"Tue, 16 Dec 2025 12:37:48 GMT"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"58"},{"key":"Content-Encoding","value":"gzip"}],"cookie":[],"responseTime":null,"body":"{\n    \"message\": \"Data not found.\"\n}"},{"id":"89052e9d-21b5-4b5e-a9c9-aa98be7094a4","name":"Single Twinning (200 OK)","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"{{baseUrl}}/{{version}}/twinnings/9fad5c84-565d-4656-970d-103bc9c1f5c8"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Server","value":"nginx/1.25.3"},{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"Vary","value":"Accept-Encoding"},{"key":"Vary","value":"Origin"},{"key":"Cache-Control","value":"private, must-revalidate"},{"key":"Date","value":"Tue, 16 Dec 2025 12:38:12 GMT"},{"key":"Last-Modified","value":"Tue, 16 Dec 2025 12:38:12 GMT"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"59"},{"key":"Alt-Svc","value":"h3=\":443\""},{"key":"Content-Encoding","value":"gzip"}],"cookie":[],"responseTime":null,"body":"  {\n      \"id\": \"a091ab6b-4ce0-****\",\n      \"user_id\": \"bf121259-f9ae-****\",\n      \"status\": \"enabled\",\n      \"phone_number\": \"********\",\n      \"delay\": 0,\n      \"sync_source\": \"manual\",\n      \"type\": \"mobile\",\n      \"created_at\": \"2025-12-11T17:44:26.000000Z\",\n      \"updated_at\": \"2025-12-11T18:27:59.000000Z\",\n      \"deleted_at\": null,\n      \"dial_strategy\": \"voip_only\"\n    }"},{"id":"8cdfc97c-0c81-45cb-8008-2564928ecfea","name":"200 OK - Single Twinning","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/{{version}}/twinnings/9fad5c84-565d-4656-970d-103bc9c1f5c8"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Accept","value":"application/json","enabled":true}],"cookie":[],"responseTime":null,"body":"{\n  \"data\":   {\n      \"id\": \"a091ab6b-4ce0-****\",\n      \"user_id\": \"bf121259-f9ae-****\",\n      \"status\": \"enabled\",\n      \"phone_number\": \"********\",\n      \"delay\": 0,\n      \"sync_source\": \"manual\",\n      \"type\": \"mobile\",\n      \"created_at\": \"2025-12-11T17:44:26.000000Z\",\n      \"updated_at\": \"2025-12-11T18:27:59.000000Z\",\n      \"deleted_at\": null,\n      \"dial_strategy\": \"voip_only\"\n    }\n}"},{"id":"446b5e80-c56f-48fd-83aa-6bbb9467e580","name":"404 Not Found - Twinning Does Not Exist","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/{{version}}/twinnings/00000000-0000-4000-8000-000000000000"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Accept","value":"application/json","enabled":true}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"The specified twinning could not be found.\",\n  \"errors\": {\n    \"twinning_id\": [\n      \"The selected twinning_id is invalid.\",\n      \"No twinning exists with the provided ID.\"\n    ]\n  }\n}"}],"_postman_id":"c5aea344-3479-4677-a0ce-1396b0094e58"}],"id":"7b5a592a-c4f9-4301-96b4-fc1ddcffc198","description":"<p>This folder contains endpoints for managing a user’s <strong>twinnings</strong> logical representations of the user’s devices and call routes (for example, SIP phones, WebRTC clients, or forwarding rules). Twinnings define how calls are delivered to or placed from a user, including current status and dial strategy.</p>\n<p>Included endpoints:</p>\n<ul>\n<li><p><strong>Twinnings List</strong> – returns all twinnings (devices/routes) for the authenticated user.</p>\n</li>\n<li><p><strong>Single Twinning</strong> – returns details for a specific twinning by its ID.</p>\n</li>\n</ul>\n<p>Each twinning exposes information such as:</p>\n<ul>\n<li><p><strong>Status</strong> (e.g., enabled, disabled)</p>\n</li>\n<li><p><strong>Dial strategy</strong> GSM Only, Voip Only, Both</p>\n</li>\n</ul>\n<p>Typical usage with calling APIs:</p>\n<ol>\n<li><p>Call <strong>Twinnings List</strong> to discover the user’s available twinning devices and their IDs.</p>\n</li>\n<li><p>Optionally call <strong>Single Twinning</strong> to inspect a specific device’s status and dial strategy.</p>\n</li>\n<li><p>Use the selected twinning ID(s) as caller and/or target devices when invoking the <strong>Start New Call</strong> API, so calls originate from or are delivered to the correct user device configuration.</p>\n</li>\n</ol>\n","_postman_id":"7b5a592a-c4f9-4301-96b4-fc1ddcffc198"},{"name":"Sip Devices","item":[{"name":"SIP devices","id":"a1c8aef4-2cae-46e6-aca6-a94a9294bf1f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{cockpit_auth}}"}]},"isInherited":false},"method":"GET","header":[],"url":"{{baseUrl}}/{{version}}/user-sip-devices","description":"<h3 id=\"get-user-sip-devices--list-sip-devices-for-the-authenticated-user\">GET <code>/user-sip-devices</code> – List SIP devices for the authenticated user</h3>\n<p>Retrieve all SIP devices that belong to the currently authenticated Cockpit user. A <strong>SIP device</strong> represents a concrete SIP endpoint that can register to the PBX and be used to place or receive calls (for example: Voxbi desktop or mobile apps, WebRTC clients, hardware phones such as Yealink, etc.).</p>\n<p>Use this endpoint after the user has successfully logged in and obtained a valid <code>cockpit_auth</code> token.</p>\n<hr />\n<h4 id=\"purpose\">Purpose</h4>\n<p>This endpoint is used to:</p>\n<ul>\n<li><p>Discover which <strong>SIP endpoints</strong> are currently associated with the logged-in user.</p>\n</li>\n<li><p>Build <strong>device selection UIs</strong> (for example, \"Call from: Desktop App / Desk Phone / Mobile App\").</p>\n</li>\n<li><p>Determine which devices are <strong>enabled</strong> and whether they are currently <strong>registered</strong> to the PBX.</p>\n</li>\n<li><p>Obtain technical parameters (such as SIP username, domain, outbound proxy, transport) required by clients that need to configure/register a device or route calls through a specific SIP endpoint.</p>\n</li>\n<li><p>Provide device identifiers that may be referenced by other call-related flows (for example, when selecting the device used for a new outgoing call).</p>\n</li>\n</ul>\n<hr />\n<h4 id=\"authentication--headers\">Authentication &amp; Headers</h4>\n<p>This endpoint is <strong>authenticated</strong> and requires a valid Cockpit access token.</p>\n<ul>\n<li><p><strong>Authorization</strong>: <code>Bearer {{cockpit_auth}}</code></p>\n</li>\n<li><p><strong>Accept</strong>: <code>application/json</code></p>\n</li>\n</ul>\n<p>The base URL and API version are provided by collection/environment variables:</p>\n<ul>\n<li><p><code>{{baseUrl}}</code> – usually <code>https://cockpit.voxbi.com</code></p>\n</li>\n<li><p><code>{{version}}</code> – typically <code>v1/api</code></p>\n</li>\n</ul>\n<p>Final request URL:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">GET {{baseUrl}}/{{version}}/user-sip-devices\n\n</code></pre>\n<hr />\n<h4 id=\"when-and-how-to-call-this-endpoint\">When and how to call this endpoint</h4>\n<ol>\n<li><p><strong>After login</strong></p>\n<ul>\n<li><p>Authenticate the user using the Cockpit authentication endpoints to obtain a <code>cockpit_auth</code> token.</p>\n</li>\n<li><p>Optionally call <code>GET /me</code> to load the full user+PBX context.</p>\n</li>\n<li><p>Then call <code>GET /user-sip-devices</code> to get the list of SIP devices for that user.</p>\n</li>\n</ul>\n</li>\n<li><p><strong>Building device selection UIs</strong></p>\n<ul>\n<li><p>Use the <code>data[]</code> array to render all devices associated with the user.</p>\n</li>\n<li><p>Common fields for UI:</p>\n<ul>\n<li><p><code>name</code> / <code>label</code> – human-friendly device name (for example, \"Voxbi Desktop App\", \"Yealink T54W - Office\").</p>\n</li>\n<li><p><code>status.enabled</code> or <code>is_enabled</code> – whether the device is enabled.</p>\n</li>\n<li><p><code>status.registration</code> – current registration state (for example, <code>registered</code> or <code>unregistered</code>).</p>\n</li>\n<li><p><code>status.user_agent</code> or <code>user_agent</code> – shows the client or hardware model.</p>\n</li>\n<li><p><code>location.name</code> (if present) – descriptive location such as <code>\"LU - Dev Office\"</code>.</p>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><p><strong>Choosing which endpoint to use for calls</strong></p>\n<ul>\n<li><p>When starting an outbound call, your client can:</p>\n<ul>\n<li><p>Default to a primary device (for example, the currently registered desktop app).</p>\n</li>\n<li><p>Or allow the user to choose a device from the <code>/user-sip-devices</code> list.</p>\n</li>\n</ul>\n</li>\n<li><p>Depending on your integration, the selected SIP device ID or SIP username may be used by downstream endpoints responsible for initiating and controlling calls.</p>\n</li>\n</ul>\n</li>\n<li><p><strong>Operational and monitoring use</strong></p>\n<ul>\n<li><p>Periodically refresh the list (or cache it for the session) to detect when devices become enabled/disabled or move between locations.</p>\n</li>\n<li><p>Use status fields to indicate whether a device is currently reachable.</p>\n</li>\n</ul>\n</li>\n</ol>\n<hr />\n<h4 id=\"response\">Response</h4>\n<p>On success, the endpoint returns an object containing a <code>data</code> array. Each entry in <code>data</code> is a SIP device owned by the current user.</p>\n<h4 id=\"relation-to-other-endpoints\">Relation to other endpoints</h4>\n<ul>\n<li><p><strong>Authentication and user context</strong>:<br />  Call the authentication endpoints to obtain <code>cockpit_auth</code>, then <code>GET /me</code> to retrieve the user and PBX context.</p>\n</li>\n<li><p><strong>Call control</strong>:<br />  When you initiate a new call via the Cockpit call control APIs, you may rely on information from <code>/user-sip-devices</code> to choose which endpoint (device) should ring or be used as the source of the call.</p>\n</li>\n<li><p><strong>Twinnings and routing</strong>:<br />  In complex deployments, SIP devices and twinnings together describe how calls are routed to the user. Use <code>/twinnings</code> alongside <code>/user-sip-devices</code> if you need a full picture of how and where calls can terminate.</p>\n</li>\n</ul>\n<hr />\n<h4 id=\"status-codes\">Status codes</h4>\n<ul>\n<li><p><strong>200 OK</strong> – The list of SIP devices was successfully returned. The response body contains a <code>data</code> array of SIP device objects.</p>\n</li>\n<li><p><strong>401 Unauthorized</strong> – The request is missing a valid <code>Authorization</code> header or the <code>cockpit_auth</code> token is invalid or expired. Refresh the token via the authentication endpoints and retry.</p>\n</li>\n<li><p><strong>403 Forbidden</strong> – The token is valid but does not have permission to access SIP devices for this user/tenant.</p>\n</li>\n<li><p><strong>404 Not Found</strong> – In rare cases, returned if the user context cannot be resolved for the given token.</p>\n</li>\n<li><p><strong>429 Too Many Requests</strong> – The caller has exceeded the rate limit. Check <code>X-RateLimit-\\\\\\\\\\*</code> headers and retry after the indicated interval.</p>\n</li>\n<li><p><strong>5xx Server Error</strong> – An unexpected error occurred on the Cockpit or PBX side. Retry with backoff or contact support if the problem persists.</p>\n</li>\n</ul>\n","urlObject":{"path":["{{version}}","user-sip-devices"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"52dac2ea-5ab2-4e1a-a0fa-e1cd02e4b1b1","name":"200 OK - List of user SIP devices","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/{{version}}/user-sip-devices"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Accept","value":"application/json","enabled":true}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"11111111-2222-3333-4444-555555555555\",\n      \"pbx_id\": \"11111111-2222-3333-4444-555555555555\",\n      \"target_type\": \"App\\\\Models\\\\User\",\n      \"target_id\": \"11111111-2222-3333-4444-555555555555\",\n      \"extension_id_shown_for_internal_calls\": null,\n      \"roaming_user_id\": null,\n      \"location_id\": \"11111111-2222-3333-4444-555555555555\",\n      \"parent_sip_device_id\": null,\n      \"name\": \"Voxbi Desktop App\",\n      \"description\": null,\n      \"is_enabled\": true,\n      \"ip_internal\": \"192.0.2.20\",\n      \"ip_external\": \"198.51.100.20\",\n      \"user_agent\": \"VoxbiDesktop/1.0.0 (Windows)\",\n      \"mac\": \"00:11:22:33:44:77\",\n      \"vlan_phone\": null,\n      \"vlan_pc\": null,\n      \"sip_username\": \"1003\",\n      \"alt_username\": null,\n      \"transport\": \"tls\",\n      \"type\": \"auto\",\n      \"allow_roaming\": true,\n      \"language\": \"english\",\n      \"easy_deploy\": null,\n      \"notify\": \"2025-01-01 00:00:00\",\n      \"allow_default_pbxes_outgoing_phone_numbers\": true,\n      \"sync_source\": \"manual\",\n      \"created_at\": \"2025-01-01T00:00:00.000000Z\",\n      \"updated_at\": \"2025-01-01T00:00:00.000000Z\",\n      \"deleted_at\": null,\n      \"select2_dropdown_option\": \"<div class=\\\"custom-select2-dropdown\\\">\\n  <div class=\\\"with-status\\\">\\n    <div class='enabled-status on'></div>\\n    <span>00:11:22:33:44:77 Voxbi Desktop App [LU - Demo Office]</span>\\n  </div>\\n</div>\",\n      \"location\": {\n        \"id\": \"11111111-2222-3333-4444-555555555555\",\n        \"pbx_id\": \"11111111-2222-3333-4444-555555555555\",\n        \"name\": \"LU - Demo Office\",\n        \"description\": null,\n        \"enable_location_as_presence_status\": false,\n        \"created_at\": \"2025-01-01T00:00:00.000000Z\",\n        \"updated_at\": \"2025-01-01T00:00:00.000000Z\",\n        \"deleted_at\": null,\n        \"select2_dropdown_option\": \"<div class=\\\"custom-select2-dropdown\\\">\\n  <span>LU - Demo Office</span>\\n</div>\"\n      }\n    },\n    {\n      \"id\": \"11111111-2222-3333-4444-555555555555\",\n      \"pbx_id\": \"11111111-2222-3333-4444-555555555555\",\n      \"target_type\": \"App\\\\Models\\\\User\",\n      \"target_id\": \"11111111-2222-3333-4444-555555555555\",\n      \"extension_id_shown_for_internal_calls\": null,\n      \"roaming_user_id\": null,\n      \"location_id\": \"11111111-2222-3333-4444-555555555555\",\n      \"parent_sip_device_id\": null,\n      \"name\": \"Yealink T54W - Office\",\n      \"description\": null,\n      \"is_enabled\": true,\n      \"ip_internal\": \"192.0.2.21\",\n      \"ip_external\": \"198.51.100.21\",\n      \"user_agent\": \"Yealink T54W 00.00.0.000\",\n      \"mac\": \"00:11:22:33:44:88\",\n      \"vlan_phone\": null,\n      \"vlan_pc\": null,\n      \"sip_username\": \"1004\",\n      \"alt_username\": null,\n      \"transport\": \"udp\",\n      \"type\": \"auto\",\n      \"allow_roaming\": true,\n      \"language\": \"english\",\n      \"easy_deploy\": null,\n      \"notify\": \"2025-01-01 00:00:00\",\n      \"allow_default_pbxes_outgoing_phone_numbers\": true,\n      \"sync_source\": \"manual\",\n      \"created_at\": \"2025-01-01T00:00:00.000000Z\",\n      \"updated_at\": \"2025-01-01T00:00:00.000000Z\",\n      \"deleted_at\": null,\n      \"select2_dropdown_option\": \"<div class=\\\"custom-select2-dropdown\\\">\\n  <div class=\\\"with-status\\\">\\n    <div class='enabled-status on'></div>\\n    <span>00:11:22:33:44:88 Yealink T54W - Office [LU - Demo Office]</span>\\n  </div>\\n</div>\",\n      \"location\": {\n        \"id\": \"11111111-2222-3333-4444-555555555555\",\n        \"pbx_id\": \"11111111-2222-3333-4444-555555555555\",\n        \"name\": \"LU - Demo Office\",\n        \"description\": null,\n        \"enable_location_as_presence_status\": false,\n        \"created_at\": \"2025-01-01T00:00:00.000000Z\",\n        \"updated_at\": \"2025-01-01T00:00:00.000000Z\",\n        \"deleted_at\": null,\n        \"select2_dropdown_option\": \"<div class=\\\"custom-select2-dropdown\\\">\\n  <span>LU - Demo Office</span>\\n</div>\"\n      }\n    }\n  ]\n}"}],"_postman_id":"a1c8aef4-2cae-46e6-aca6-a94a9294bf1f"},{"name":"SIP devices inventory","id":"562f9cc1-9dfc-4a96-91ea-ad55a71f8592","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{cockpit_auth}}"}]},"isInherited":false},"method":"GET","header":[],"url":"{{baseUrl}}/{{version}}/sip-devices/inventory","description":"<h1 id=\"sip-device-inventory-api\">SIP Device Inventory API</h1>\n<p>Returns a paginated inventory of SIP devices for the authenticated user's PBX, including assignment (user or extension), roaming session, tags, location, and an online indicator based on the last registration timestamp.</p>\n<h2 id=\"endpoint\">Endpoint</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-html\">GET /api/v1/sip-devices/inventory\n\n</code></pre>\n<h2 id=\"authentication\">Authentication</h2>\n<p>Bearer token (Laravel Sanctum). Obtain one via:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">POST /api/v1/login\nContent-Type: application/json\n{ \"email\": \"user@example.com\", \"password\": \"secret\" }\n\n</code></pre>\n<p>The response contains <code>data.token</code>. Send it on every inventory request:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: Bearer &lt;token&gt;\n\n</code></pre><p>All results are automatically scoped to the authenticated user's PBX — cross-tenant access is not possible.</p>\n<h2 id=\"query-parameters\">Query Parameters</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field Name</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>page</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Page number. Defaults to <code>1</code>.</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>integer</td>\n<td>No</td>\n<td>Items per page. Defaults to <code>100</code>. Maximum <code>1000</code>. Values outside the range <code>1..1000</code> fall back to the default.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"response--200-ok\">Response — <code>200 OK</code></h2>\n<p>Standard Laravel paginator envelope: <code>data[]</code> + <code>links</code> + <code>meta</code>.</p>\n<h3 id=\"response-fields\">Response Fields</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field Name</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>uuid</td>\n<td>Device ID.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Friendly name of the device.</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>string</td>\n<td>null</td>\n</tr>\n<tr>\n<td><code>mac</code></td>\n<td>string</td>\n<td>null</td>\n</tr>\n<tr>\n<td><code>type</code></td>\n<td>string</td>\n<td>One of <code>auto</code>, <code>manual</code>, <code>gigaset</code>, <code>trunk</code>.</td>\n</tr>\n<tr>\n<td><code>is_enabled</code></td>\n<td>bool</td>\n<td>Administrative enabled flag.</td>\n</tr>\n<tr>\n<td><code>allow_roaming</code></td>\n<td>bool</td>\n<td>Whether roaming login is permitted on this device.</td>\n</tr>\n<tr>\n<td><code>ip_internal</code></td>\n<td>string</td>\n<td>null</td>\n</tr>\n<tr>\n<td><code>ip_external</code></td>\n<td>string</td>\n<td>null</td>\n</tr>\n<tr>\n<td><code>last_seen</code></td>\n<td>string (ISO 8601)</td>\n<td>null</td>\n</tr>\n<tr>\n<td><code>online</code></td>\n<td>bool</td>\n<td><code>true</code> if <code>last_seen</code> is within the last 10 minutes. <code>false</code> otherwise (including when <code>last_seen</code> is <code>null</code>).</td>\n</tr>\n<tr>\n<td><code>tags[]</code></td>\n<td>array</td>\n<td>Tags attached to the device. Each item: <code>{ id, name }</code>.</td>\n</tr>\n<tr>\n<td><code>location</code></td>\n<td>object</td>\n<td>null</td>\n</tr>\n<tr>\n<td><code>user</code></td>\n<td>object</td>\n<td>null</td>\n</tr>\n<tr>\n<td><code>extension</code></td>\n<td>object</td>\n<td>null</td>\n</tr>\n<tr>\n<td><code>loggedin_user</code></td>\n<td>object</td>\n<td>null</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"user-object\">User object</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": \"uuid\",\n  \"name\": \"Jane Doe\",\n  \"email\": \"jane@example.com\",\n  \"extensions\": [\n    { \"id\": \"uuid\", \"name\": \"Jane\", \"number\": \"1001\" }\n  ]\n}\n\n</code></pre>\n<p><code>extensions[]</code> lists every extension owned by that user.</p>\n<h3 id=\"assignment-rules\">Assignment rules</h3>\n<p><code>user</code>, <code>extension</code>, and <code>loggedin_user</code> behave as follows:</p>\n<ul>\n<li><p>A device is assigned <strong>either</strong> to a user (<code>user</code> populated, <code>extension</code> null) <strong>or</strong> to an extension (<code>extension</code> populated, <code>user</code> null) — never both.</p>\n</li>\n<li><p><code>loggedin_user</code> is independent of assignment and only appears when someone is currently roamed-in.</p>\n</li>\n</ul>\n<h3 id=\"example-response\">Example Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"data\": [\n    {\n      \"id\": \"0195f7c1-1a2b-7c4d-9e8f-aabbccddeeff\",\n      \"name\": \"Meeting Room Phone\",\n      \"description\": \"Yealink T46U in the upstairs meeting room\",\n      \"mac\": \"AABBCCDDEEFF\",\n      \"type\": \"auto\",\n      \"is_enabled\": true,\n      \"allow_roaming\": false,\n      \"ip_internal\": \"10.0.0.12\",\n      \"ip_external\": \"1.2.3.4\",\n      \"last_seen\": \"2026-04-24T10:22:00+00:00\",\n      \"online\": true,\n      \"tags\": [\n        { \"id\": \"0195f7c1-1a2b-7c4d-9e8f-111111111111\", \"name\": \"floor-2\" }\n      ],\n      \"location\": {\n        \"id\": \"0195f7c1-1a2b-7c4d-9e8f-222222222222\",\n        \"name\": \"Main Office\"\n      },\n      \"user\": {\n        \"id\": \"0195f7c1-1a2b-7c4d-9e8f-333333333333\",\n        \"name\": \"Jane Doe\",\n        \"email\": \"jane@example.com\",\n        \"extensions\": [\n          { \"id\": \"0195f7c1-1a2b-7c4d-9e8f-444444444444\", \"name\": \"Jane\", \"number\": \"1001\" }\n        ]\n      },\n      \"extension\": null,\n      \"loggedin_user\": null\n    }\n  ],\n  \"links\": {\n    \"first\": \"https://cockpit.voxbi.com/api/v1/sip-devices/inventory?page=1\",\n    \"last\":  \"https://cockpit.voxbi.com/api/v1/sip-devices/inventory?page=3\",\n    \"prev\":  null,\n    \"next\":  \"https://cockpit.voxbi.com/api/v1/sip-devices/inventory?page=2\"\n  },\n  \"meta\": {\n    \"current_page\": 1,\n    \"from\": 1,\n    \"last_page\": 3,\n    \"per_page\": 100,\n    \"to\": 100,\n    \"total\": 247\n  }\n}\n\n</code></pre>\n<h2 id=\"errors\">Errors</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>When</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>Missing or invalid Bearer token.</td>\n</tr>\n<tr>\n<td><code>422 Unprocessable Entity</code></td>\n<td>Invalid query parameter type (e.g. <code>per_page=abc</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"example\">Example</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">TOKEN=$(curl -s -X POST https://cockpit.example.com/api/v1/login \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"email\":\"user@example.com\",\"password\":\"secret\"}' \\\n  | jq -r .data.token)\n# First page, 500 devices\ncurl -s \"https://cockpit.voxbi.com/api/v1/sip-devices/inventory?per_page=500\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n# Next page\ncurl -s \"https://cockpit.voxbi.com/api/v1/sip-devices/inventory?per_page=500&amp;page=2\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n\n</code></pre>\n","urlObject":{"path":["{{version}}","sip-devices","inventory"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"24da149c-f753-4b96-a217-b60e48724a6a","name":"200 OK - List of user SIP devices","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/{{version}}/user-sip-devices"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Accept","value":"application/json","enabled":true}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"11111111-2222-3333-4444-555555555555\",\n      \"pbx_id\": \"11111111-2222-3333-4444-555555555555\",\n      \"target_type\": \"App\\\\Models\\\\User\",\n      \"target_id\": \"11111111-2222-3333-4444-555555555555\",\n      \"extension_id_shown_for_internal_calls\": null,\n      \"roaming_user_id\": null,\n      \"location_id\": \"11111111-2222-3333-4444-555555555555\",\n      \"parent_sip_device_id\": null,\n      \"name\": \"Voxbi Desktop App\",\n      \"description\": null,\n      \"is_enabled\": true,\n      \"ip_internal\": \"192.0.2.20\",\n      \"ip_external\": \"198.51.100.20\",\n      \"user_agent\": \"VoxbiDesktop/1.0.0 (Windows)\",\n      \"mac\": \"00:11:22:33:44:77\",\n      \"vlan_phone\": null,\n      \"vlan_pc\": null,\n      \"sip_username\": \"1003\",\n      \"alt_username\": null,\n      \"transport\": \"tls\",\n      \"type\": \"auto\",\n      \"allow_roaming\": true,\n      \"language\": \"english\",\n      \"easy_deploy\": null,\n      \"notify\": \"2025-01-01 00:00:00\",\n      \"allow_default_pbxes_outgoing_phone_numbers\": true,\n      \"sync_source\": \"manual\",\n      \"created_at\": \"2025-01-01T00:00:00.000000Z\",\n      \"updated_at\": \"2025-01-01T00:00:00.000000Z\",\n      \"deleted_at\": null,\n      \"select2_dropdown_option\": \"<div class=\\\"custom-select2-dropdown\\\">\\n  <div class=\\\"with-status\\\">\\n    <div class='enabled-status on'></div>\\n    <span>00:11:22:33:44:77 Voxbi Desktop App [LU - Demo Office]</span>\\n  </div>\\n</div>\",\n      \"location\": {\n        \"id\": \"11111111-2222-3333-4444-555555555555\",\n        \"pbx_id\": \"11111111-2222-3333-4444-555555555555\",\n        \"name\": \"LU - Demo Office\",\n        \"description\": null,\n        \"enable_location_as_presence_status\": false,\n        \"created_at\": \"2025-01-01T00:00:00.000000Z\",\n        \"updated_at\": \"2025-01-01T00:00:00.000000Z\",\n        \"deleted_at\": null,\n        \"select2_dropdown_option\": \"<div class=\\\"custom-select2-dropdown\\\">\\n  <span>LU - Demo Office</span>\\n</div>\"\n      }\n    },\n    {\n      \"id\": \"11111111-2222-3333-4444-555555555555\",\n      \"pbx_id\": \"11111111-2222-3333-4444-555555555555\",\n      \"target_type\": \"App\\\\Models\\\\User\",\n      \"target_id\": \"11111111-2222-3333-4444-555555555555\",\n      \"extension_id_shown_for_internal_calls\": null,\n      \"roaming_user_id\": null,\n      \"location_id\": \"11111111-2222-3333-4444-555555555555\",\n      \"parent_sip_device_id\": null,\n      \"name\": \"Yealink T54W - Office\",\n      \"description\": null,\n      \"is_enabled\": true,\n      \"ip_internal\": \"192.0.2.21\",\n      \"ip_external\": \"198.51.100.21\",\n      \"user_agent\": \"Yealink T54W 00.00.0.000\",\n      \"mac\": \"00:11:22:33:44:88\",\n      \"vlan_phone\": null,\n      \"vlan_pc\": null,\n      \"sip_username\": \"1004\",\n      \"alt_username\": null,\n      \"transport\": \"udp\",\n      \"type\": \"auto\",\n      \"allow_roaming\": true,\n      \"language\": \"english\",\n      \"easy_deploy\": null,\n      \"notify\": \"2025-01-01 00:00:00\",\n      \"allow_default_pbxes_outgoing_phone_numbers\": true,\n      \"sync_source\": \"manual\",\n      \"created_at\": \"2025-01-01T00:00:00.000000Z\",\n      \"updated_at\": \"2025-01-01T00:00:00.000000Z\",\n      \"deleted_at\": null,\n      \"select2_dropdown_option\": \"<div class=\\\"custom-select2-dropdown\\\">\\n  <div class=\\\"with-status\\\">\\n    <div class='enabled-status on'></div>\\n    <span>00:11:22:33:44:88 Yealink T54W - Office [LU - Demo Office]</span>\\n  </div>\\n</div>\",\n      \"location\": {\n        \"id\": \"11111111-2222-3333-4444-555555555555\",\n        \"pbx_id\": \"11111111-2222-3333-4444-555555555555\",\n        \"name\": \"LU - Demo Office\",\n        \"description\": null,\n        \"enable_location_as_presence_status\": false,\n        \"created_at\": \"2025-01-01T00:00:00.000000Z\",\n        \"updated_at\": \"2025-01-01T00:00:00.000000Z\",\n        \"deleted_at\": null,\n        \"select2_dropdown_option\": \"<div class=\\\"custom-select2-dropdown\\\">\\n  <span>LU - Demo Office</span>\\n</div>\"\n      }\n    }\n  ]\n}"}],"_postman_id":"562f9cc1-9dfc-4a96-91ea-ad55a71f8592"}],"id":"1ea3fd76-b059-42de-9ca1-1ae9ddb4cad7","description":"<p>This folder groups endpoints for listing and inspecting SIP devices associated with the currently authenticated user. Use these requests to:</p>\n<ol>\n<li>Retrieve and review all SIP devices linked to the user.</li>\n<li>Understand each device’s configuration and current status (for example, to see which devices are registered or available).</li>\n<li>Use these SIP devices as sources when placing or receiving calls to internal or external numbers.</li>\n</ol>\n<p>These endpoints are primarily used to observe and manage the user’s SIP devices, which are typically selected as the device used to place or receive calls to any internal or external destination (for example, when combined with the <strong>Start New Call</strong> API).</p>\n","_postman_id":"1ea3fd76-b059-42de-9ca1-1ae9ddb4cad7"},{"name":"Caller Identities","item":[{"name":"Caller Identities","id":"da42e9c8-a12c-4b9f-b816-5c52c251acdb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{cockpit_auth}}"}]},"isInherited":false},"method":"GET","header":[],"url":"{{baseUrl}}/{{version}}/caller-identities","description":"<h3 id=\"caller-identities\">Caller Identities</h3>\n<p>Retrieve the list of caller identity configurations available for the current PBX / tenant.</p>\n<p>This endpoint returns the mapping between phone numbers (and their suffixes) and the underlying PBX entities (e.g. PBX, Group). It is typically used by client applications (such as Cockpit) to display or select which identity will be presented when placing calls.</p>\n<hr />\n<h3 id=\"http-request\">HTTP Request</h3>\n<p><code>GET {{baseUrl}}/{{version}}/caller-identities</code></p>\n<ul>\n<li><p><strong>Method:</strong> <code>GET</code></p>\n</li>\n<li><p><strong>Path:</strong> <code>/caller-identities</code></p>\n</li>\n</ul>\n<h4 id=\"url--path-variables\">URL / Path Variables</h4>\n<ul>\n<li><p><code>{{baseUrl}}</code> – Base URL for the Cockpit API (configured in the active environment).</p>\n</li>\n<li><p><code>{{version}}</code> – API version segment (for example, <code>v1</code>).</p>\n</li>\n</ul>\n<hr />\n<h3 id=\"authentication\">Authentication</h3>\n<p>This request uses authentication based on environment variables.</p>\n<p>Commonly used variables:</p>\n<ul>\n<li><code>{{cockpit_auth}}</code> – Auth token/value used by the Cockpit API for authenticated requests (typically injected via headers in the environment or collection-level auth configuration).</li>\n</ul>\n<blockquote>\n<p>Note: Auth configuration is inherited from the parent collection/folder or the active environment – this request does <strong>not</strong> override it. </p>\n</blockquote>\n<hr />\n<h3 id=\"response\">Response</h3>\n<p>On success, the endpoint returns HTTP <strong>200 OK</strong> and a JSON body of the form:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"data\": [\n    {\n      \"id\": \"00000000-0000-0000-0000-000000000001\",\n      \"pbx_id\": \"10000000-0000-0000-0000-000000000000\",\n      \"phone_number_id\": \"20000000-0000-0000-0000-000000000000\",\n      \"number_without_suffix\": \"NNNNNNNNN\",\n      \"number_with_suffix\": \"+NNNNNNNNNN XX root\",\n      \"suffix\": \"AA\",\n      \"label\": null,\n      \"caller_identity_target_type\": \"App\\\\Models\\\\Group\",\n      \"caller_identity_target_id\": \"30000000-0000-0000-0000-000000000000\"\n    },\n    {\n      \"id\": \"00000000-0000-0000-0000-000000000002\",\n      \"pbx_id\": \"10000000-0000-0000-0000-000000000000\",\n      \"phone_number_id\": \"20000000-0000-0000-0000-000000000000\",\n      \"number_without_suffix\": \"NNNNNNNNN\",\n      \"number_with_suffix\": \"+NNNNNNNNNN XX root\",\n      \"suffix\": \"*\",\n      \"label\": null,\n      \"caller_identity_target_type\": \"App\\\\Models\\\\Pbx\",\n      \"caller_identity_target_id\": \"10000000-0000-0000-0000-000000000000\"\n    },\n    {\n      \"id\": \"00000000-0000-0000-0000-000000000003\",\n      \"pbx_id\": \"10000000-0000-0000-0000-000000000000\",\n      \"phone_number_id\": \"20000000-0000-0000-0000-000000000000\",\n      \"number_without_suffix\": \"NNNNNNNNN\",\n      \"number_with_suffix\": \"+NNNNNNNNNN XX root\",\n      \"suffix\": \"BB\",\n      \"label\": null,\n      \"caller_identity_target_type\": \"App\\\\Models\\\\Pbx\",\n      \"caller_identity_target_id\": \"10000000-0000-0000-0000-000000000000\"\n    },\n    {\n      \"id\": \"00000000-0000-0000-0000-000000000004\",\n      \"pbx_id\": \"10000000-0000-0000-0000-000000000000\",\n      \"phone_number_id\": \"20000000-0000-0000-0000-000000000001\",\n      \"number_without_suffix\": \"NNNNNNNNNNNN\",\n      \"number_with_suffix\": \"+NNNNNNNNNNNNYYYYY\",\n      \"suffix\": \"YYYYY\",\n      \"label\": null,\n      \"caller_identity_target_type\": \"App\\\\Models\\\\Pbx\",\n      \"caller_identity_target_id\": \"10000000-0000-0000-0000-000000000000\"\n    },\n    {\n      \"id\": \"00000000-0000-0000-0000-000000000005\",\n      \"pbx_id\": \"10000000-0000-0000-0000-000000000000\",\n      \"phone_number_id\": \"20000000-0000-0000-0000-000000000002\",\n      \"number_without_suffix\": \"NNNNNNNNN\",\n      \"number_with_suffix\": \"+NNNNNNNNNN Z Example\",\n      \"suffix\": \"Z\",\n      \"label\": null,\n      \"caller_identity_target_type\": \"App\\\\Models\\\\Pbx\",\n      \"caller_identity_target_id\": \"10000000-0000-0000-0000-000000000000\"\n    }\n  ]\n}\n\n</code></pre>\n<h4 id=\"top-level-fields\">Top-level fields</h4>\n<ul>\n<li><code>data</code> <em>(array)</em> – List of caller identity records.</li>\n</ul>\n<h4 id=\"caller-identity-object-fields\">Caller identity object fields</h4>\n<p>Each element in <code>data</code> has the following fields:</p>\n<ul>\n<li><p><code>id</code> <em>(string, UUID)</em> – Unique identifier of the caller identity record.</p>\n</li>\n<li><p><code>pbx_id</code> <em>(string, UUID)</em> – Identifier of the PBX this identity belongs to.</p>\n</li>\n<li><p><code>phone_number_id</code> <em>(string, UUID)</em> – Identifier of the underlying phone number resource.</p>\n</li>\n<li><p><code>number_without_suffix</code> <em>(string)</em> – Base phone number without any suffix.</p>\n</li>\n<li><p><code>number_with_suffix</code> <em>(string)</em> – Full phone number representation including suffix and optional description.</p>\n</li>\n<li><p><code>suffix</code> <em>(string)</em> – Suffix part of the number (e.g. extension, additional digits, or special symbol such as <code>\\\\\\*</code>).</p>\n</li>\n<li><p><code>label</code> <em>(string | null)</em> – Optional human-readable label for this identity.</p>\n</li>\n<li><p><code>caller_identity_target_type</code> <em>(string)</em> – Back-end model type that this identity points to (e.g. <code>App\\\\Models\\\\Pbx</code>, <code>App\\\\Models\\\\Group</code>).</p>\n</li>\n<li><p><code>caller_identity_target_id</code> <em>(string, UUID)</em> – Identifier of the target entity referenced by <code>caller_identity_target_type</code>.</p>\n</li>\n</ul>\n<hr />\n<h3 id=\"usage-notes\">Usage Notes</h3>\n<ul>\n<li><p>Use this endpoint to <strong>list all available caller identities</strong> for the current authenticated PBX context.</p>\n</li>\n<li><p>Typically called early in the UI flow to populate dropdowns/selectors where a user chooses the caller ID to present when making outbound calls.</p>\n</li>\n<li><p>Combine this response with additional PBX/Group metadata (if needed) by resolving <code>caller_identity_target_type</code> and <code>caller_identity_target_id</code> via related endpoints.</p>\n</li>\n</ul>\n","urlObject":{"path":["{{version}}","caller-identities"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"f57bae1e-ca43-4d19-bf09-d74157f3db8b","name":"200 OK","originalRequest":{"method":"GET","header":[],"url":"{{baseUrl}}/{{version}}/caller-identities"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Host","value":"localhost:8083"},{"key":"Connection","value":"close"},{"key":"X-Powered-By","value":"PHP/8.2.24"},{"key":"Cache-Control","value":"private, must-revalidate"},{"key":"Date","value":"Tue, 16 Dec 2025 15:07:26 GMT"},{"key":"Content-Type","value":"application/json"},{"key":"Last-Modified","value":"Tue, 16 Dec 2025 15:07:26 GMT"},{"key":"ETag","value":"81407762049e8c1d4ef4168b0ca95672"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"59"},{"key":"phpdebugbar-id","value":"01KCKV7C9W69HK7F51P7D1P8KQ"},{"key":"Vary","value":"Origin"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"00000000-0000-0000-0000-000000000001\",\n      \"pbx_id\": \"10000000-0000-0000-0000-000000000000\",\n      \"phone_number_id\": \"20000000-0000-0000-0000-000000000000\",\n      \"number_without_suffix\": \"NNNNNNNNN\",\n      \"number_with_suffix\": \"+NNNNNNNNNN XX root\",\n      \"suffix\": \"AA\",\n      \"label\": null,\n      \"caller_identity_target_type\": \"App\\\\Models\\\\Group\",\n      \"caller_identity_target_id\": \"30000000-0000-0000-0000-000000000000\"\n    },\n    {\n      \"id\": \"00000000-0000-0000-0000-000000000002\",\n      \"pbx_id\": \"10000000-0000-0000-0000-000000000000\",\n      \"phone_number_id\": \"20000000-0000-0000-0000-000000000000\",\n      \"number_without_suffix\": \"NNNNNNNNN\",\n      \"number_with_suffix\": \"+NNNNNNNNNN XX root\",\n      \"suffix\": \"*\",\n      \"label\": null,\n      \"caller_identity_target_type\": \"App\\\\Models\\\\Pbx\",\n      \"caller_identity_target_id\": \"10000000-0000-0000-0000-000000000000\"\n    },\n    {\n      \"id\": \"00000000-0000-0000-0000-000000000003\",\n      \"pbx_id\": \"10000000-0000-0000-0000-000000000000\",\n      \"phone_number_id\": \"20000000-0000-0000-0000-000000000000\",\n      \"number_without_suffix\": \"NNNNNNNNN\",\n      \"number_with_suffix\": \"+NNNNNNNNNN XX root\",\n      \"suffix\": \"BB\",\n      \"label\": null,\n      \"caller_identity_target_type\": \"App\\\\Models\\\\Pbx\",\n      \"caller_identity_target_id\": \"10000000-0000-0000-0000-000000000000\"\n    },\n    {\n      \"id\": \"00000000-0000-0000-0000-000000000004\",\n      \"pbx_id\": \"10000000-0000-0000-0000-000000000000\",\n      \"phone_number_id\": \"20000000-0000-0000-0000-000000000001\",\n      \"number_without_suffix\": \"NNNNNNNNNNNN\",\n      \"number_with_suffix\": \"+NNNNNNNNNNNNYYYYY\",\n      \"suffix\": \"YYYYY\",\n      \"label\": null,\n      \"caller_identity_target_type\": \"App\\\\Models\\\\Pbx\",\n      \"caller_identity_target_id\": \"10000000-0000-0000-0000-000000000000\"\n    },\n    {\n      \"id\": \"00000000-0000-0000-0000-000000000005\",\n      \"pbx_id\": \"10000000-0000-0000-0000-000000000000\",\n      \"phone_number_id\": \"20000000-0000-0000-0000-000000000002\",\n      \"number_without_suffix\": \"NNNNNNNNN\",\n      \"number_with_suffix\": \"+NNNNNNNNNN Z Example\",\n      \"suffix\": \"Z\",\n      \"label\": null,\n      \"caller_identity_target_type\": \"App\\\\Models\\\\Pbx\",\n      \"caller_identity_target_id\": \"10000000-0000-0000-0000-000000000000\"\n    }\n  ]\n}\n"}],"_postman_id":"da42e9c8-a12c-4b9f-b816-5c52c251acdb"}],"id":"53fb9147-4e7d-4838-afee-6a533fc657fd","description":"<p>The <strong>Caller Identities</strong> APIs expose the list of outbound caller IDs that the authenticated user is allowed to present when placing calls through Voxbi Cockpit.</p>\n<p>A <em>caller identity</em> represents a phone number or PBX identity that can appear as the <strong>From / Caller ID</strong> on an outgoing call (for example, a personal DID, a company main number, or a department number). These identities are typically configured at the PBX / tenant level and constrained by regulatory requirements.</p>\n<p>Use the endpoints in this folder to:</p>\n<ul>\n<li>Retrieve the current user’s <strong>available caller identities</strong>.</li>\n<li>Build UI components such as <strong>\"Call as\" / \"Show number\"</strong> dropdowns in your softphone.</li>\n<li>Pre‑select or validate a caller identity before starting a new outbound call through the call‑control APIs.</li>\n</ul>\n<p>All endpoints in this folder:</p>\n<ul>\n<li>Are <strong>read‑only</strong> and do not modify caller ID configuration.</li>\n<li>Require a valid Cockpit bearer token (<code>{{cockpit_auth}}</code>) provided by the authentication flows in this collection.</li>\n<li>Use the shared collection variables <code>{{baseUrl}}</code> and <code>{{version}}</code> to construct the full URL, for example:</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">GET {{baseUrl}}/{{version}}/caller-identities\n</code></pre>\n","_postman_id":"53fb9147-4e7d-4838-afee-6a533fc657fd"},{"name":"Phone Number Orders","item":[{"name":"List phone numbers on the PBX","id":"08f8d759-c34a-4e09-a5aa-e0555d810249","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"{{baseUrl}}/{{version}}/numbers","description":"<p>List the PhoneNumbers attached to the caller's PBX (resolved from the bearer\ntoken). Each entry includes the currently-attached call flow (id + summary)\nwhen one is configured.</p>\n<p>The list is <strong>paginated</strong> (<code>data</code> + <code>meta</code> + <code>links</code>) and supports filtering\nand sorting (Spatie query-builder style).</p>\n<hr />\n<h2 id=\"request\">Request</h2>\n<p><strong>Query parameters</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Required</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>filter[number]</code></td>\n<td>string</td>\n<td>no</td>\n<td>—</td>\n<td>Filter by phone number (substring match). A leading <code>+</code> is ignored, so<br /><code>filter[number]=+4922</code> and <code>filter[number]=4922</code> both match.<br /></td>\n</tr>\n<tr>\n<td><code>filter[name]</code></td>\n<td>string</td>\n<td>no</td>\n<td>—</td>\n<td>Filter by the number's name (substring match).</td>\n</tr>\n<tr>\n<td><code>sort</code></td>\n<td>string</td>\n<td>no</td>\n<td>enum: <code>number</code>, <code>-number</code>, <code>name</code>, <code>-name</code>, <code>created_at</code>, <code>-created_at</code></td>\n<td>Sort field; prefix with <code>-</code> for descending. Allowed: <code>number</code>, <code>name</code>,<br /><code>created_at</code>. Defaults to <code>number</code> ascending.<br /></td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>integer</td>\n<td>no</td>\n<td>minimum: <code>1</code></td>\n<td>Page number (1-based).</td>\n</tr>\n<tr>\n<td><code>per_page</code></td>\n<td>integer</td>\n<td>no</td>\n<td>minimum: <code>1</code>; maximum: <code>100</code></td>\n<td>Items per page. Defaults to and is capped at 100 (the API page-length<br />limit); larger values are clamped to 100.<br /></td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"responses\">Responses</h2>\n<h3 id=\"200--ok\"><code>200</code> — OK</h3>\n<p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>data</code></td>\n<td>array</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data[].id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data[].number</code></td>\n<td>string</td>\n<td>—</td>\n<td>Phone number in E.164 format.</td>\n</tr>\n<tr>\n<td><code>data[].name</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data[].is_active</code></td>\n<td>boolean</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data[].call_flow_id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code>; nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data[].call_flow</code></td>\n<td>object</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data[].call_flow.id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data[].call_flow.name</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data[].call_flow.enabled</code></td>\n<td>boolean</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>links</code></td>\n<td>object</td>\n<td>—</td>\n<td>First/last/prev/next page URLs.</td>\n</tr>\n<tr>\n<td><code>meta</code></td>\n<td>object</td>\n<td>—</td>\n<td>Pagination metadata (current_page, per_page, total, last_page, ...).</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"401--authorization-token-missing-this-error-is-returned-when-the-authorization-token-is-missing\"><code>401</code> — Authorization Token Missing <br />This error is returned when the authorization token is missing.</h3>\n<p><strong>Headers</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Type</th>\n<th>Example</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Cache-Control</code></td>\n<td>string</td>\n<td><code>private, must-revalidate</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Connection</code></td>\n<td>string</td>\n<td><code>keep-alive</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td>string</td>\n<td><code>application/json</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Vary</code></td>\n<td>string</td>\n<td><code>Origin</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Limit</code></td>\n<td>integer</td>\n<td><code>60</code></td>\n<td>Max requests allowed in the current rate-limit window.</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Remaining</code></td>\n<td>integer</td>\n<td><code>57</code></td>\n<td>Requests remaining in the current rate-limit window.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>error</code></td>\n<td>string</td>\n<td>—</td>\n<td>Error message</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["{{version}}","numbers"],"host":["{{baseUrl}}"],"query":[{"disabled":true,"description":{"content":"<p>Filter by phone number (substring match). A leading <code>+</code> is ignored, so\n<code>filter[number]=+4922</code> and <code>filter[number]=4922</code> both match.</p>\n","type":"text/plain"},"key":"filter[number]","value":"4922"},{"disabled":true,"description":{"content":"<p>Filter by the number's name (substring match).</p>\n","type":"text/plain"},"key":"filter[name]","value":"Support"},{"disabled":true,"description":{"content":"<p>Sort field; prefix with <code>-</code> for descending. Allowed: <code>number</code>, <code>name</code>,\n<code>created_at</code>. Defaults to <code>number</code> ascending.</p>\n","type":"text/plain"},"key":"sort","value":"-created_at"},{"disabled":true,"description":{"content":"<p>Page number (1-based).</p>\n","type":"text/plain"},"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>Items per page. Defaults to and is capped at 100 (the API page-length\nlimit); larger values are clamped to 100.</p>\n","type":"text/plain"},"key":"per_page","value":"50"}],"variable":[]}},"response":[{"id":"d6b1eb00-5680-445d-809b-39a018a4034d","name":"200 — OK","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/{{version}}/numbers","host":["{{baseUrl}}"],"path":["{{version}}","numbers"],"query":[{"key":"filter[number]","value":"4922","description":"Filter by phone number (substring match). A leading `+` is ignored, so\n`filter[number]=+4922` and `filter[number]=4922` both match.\n","disabled":true},{"key":"filter[name]","value":"Support","description":"Filter by the number's name (substring match).","disabled":true},{"key":"sort","value":"-created_at","description":"Sort field; prefix with `-` for descending. Allowed: `number`, `name`,\n`created_at`. Defaults to `number` ascending.\n","disabled":true},{"key":"page","value":"1","description":"Page number (1-based).","disabled":true},{"key":"per_page","value":"50","description":"Items per page. Defaults to and is capped at 100 (the API page-length\nlimit); larger values are clamped to 100.\n","disabled":true}]},"description":"List the PhoneNumbers attached to the caller's PBX (resolved from the bearer\ntoken). Each entry includes the currently-attached call flow (id + summary)\nwhen one is configured.\n\nThe list is **paginated** (`data` + `meta` + `links`) and supports filtering\nand sorting (Spatie query-builder style).\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n      \"number\": \"+12125550100\",\n      \"name\": \"Customer Support\",\n      \"is_active\": true,\n      \"call_flow_id\": \"550e8400-e29b-41d4-a716-446655440100\",\n      \"call_flow\": {\n        \"id\": \"550e8400-e29b-41d4-a716-446655440100\",\n        \"name\": \"Business hours\",\n        \"enabled\": true\n      }\n    }\n  ],\n  \"links\": {\n    \"first\": \"https://cockpit.voxbi.com/api/v1/numbers?page=1\",\n    \"last\": \"https://cockpit.voxbi.com/api/v1/numbers?page=3\",\n    \"prev\": null,\n    \"next\": \"https://cockpit.voxbi.com/api/v1/numbers?page=2\"\n  },\n  \"meta\": {\n    \"current_page\": 1,\n    \"per_page\": 50,\n    \"total\": 124,\n    \"last_page\": 3\n  }\n}"},{"id":"7cb09704-a211-4979-b4ec-a2a1416e6d41","name":"401 — Authorization Token Missing This error is returned when the authorization token is missing.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/{{version}}/numbers","host":["{{baseUrl}}"],"path":["{{version}}","numbers"],"query":[{"key":"filter[number]","value":"4922","description":"Filter by phone number (substring match). A leading `+` is ignored, so\n`filter[number]=+4922` and `filter[number]=4922` both match.\n","disabled":true},{"key":"filter[name]","value":"Support","description":"Filter by the number's name (substring match).","disabled":true},{"key":"sort","value":"-created_at","description":"Sort field; prefix with `-` for descending. Allowed: `number`, `name`,\n`created_at`. Defaults to `number` ascending.\n","disabled":true},{"key":"page","value":"1","description":"Page number (1-based).","disabled":true},{"key":"per_page","value":"50","description":"Items per page. Defaults to and is capped at 100 (the API page-length\nlimit); larger values are clamped to 100.\n","disabled":true}]},"description":"List the PhoneNumbers attached to the caller's PBX (resolved from the bearer\ntoken). Each entry includes the currently-attached call flow (id + summary)\nwhen one is configured.\n\nThe list is **paginated** (`data` + `meta` + `links`) and supports filtering\nand sorting (Spatie query-builder style).\n"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Cache-Control","value":"private, must-revalidate","description":""},{"key":"Connection","value":"keep-alive","description":""},{"key":"Vary","value":"Origin","description":""},{"key":"X-RateLimit-Limit","value":"60","description":"Max requests allowed in the current rate-limit window."},{"key":"X-RateLimit-Remaining","value":"57","description":"Requests remaining in the current rate-limit window."}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Authorization Token is missing\"\n}"}],"_postman_id":"08f8d759-c34a-4e09-a5aa-e0555d810249"},{"name":"Attach a call flow to a phone number","id":"88401303-2623-48c5-b329-d1635c1f93eb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"PUT","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"call_flow_id\": \"550e8400-e29b-41d4-a716-446655440100\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/numbers/:id/call-flow","description":"<p>Set the handling strategy of a PhoneNumber to route incoming calls through\na specific call flow. Both the PhoneNumber and the CallFlow must belong to\nthe caller's PBX.</p>\n<hr />\n<h2 id=\"request\">Request</h2>\n<p><strong>Path parameters</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Required</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>yes</td>\n<td>format: <code>uuid</code></td>\n<td>PhoneNumber UUID.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Request body</strong> — <code>application/json</code>  <em>(required)</em></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>call_flow_id</code></td>\n<td>string</td>\n<td>yes</td>\n<td>format: <code>uuid</code></td>\n<td>—</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"responses\">Responses</h2>\n<h3 id=\"200--updated-phonenumber-with-the-new-call-flow-attached\"><code>200</code> — Updated PhoneNumber with the new call flow attached.</h3>\n<p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>number</code></td>\n<td>string</td>\n<td>—</td>\n<td>Phone number in E.164 format.</td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>is_active</code></td>\n<td>boolean</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>call_flow_id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code>; nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>call_flow</code></td>\n<td>object</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>call_flow.id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>call_flow.name</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>call_flow.enabled</code></td>\n<td>boolean</td>\n<td>—</td>\n<td>—</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"401--authorization-token-missing-this-error-is-returned-when-the-authorization-token-is-missing\"><code>401</code> — Authorization Token Missing <br />This error is returned when the authorization token is missing.</h3>\n<p><strong>Headers</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Type</th>\n<th>Example</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Cache-Control</code></td>\n<td>string</td>\n<td><code>private, must-revalidate</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Connection</code></td>\n<td>string</td>\n<td><code>keep-alive</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td>string</td>\n<td><code>application/json</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Vary</code></td>\n<td>string</td>\n<td><code>Origin</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Limit</code></td>\n<td>integer</td>\n<td><code>60</code></td>\n<td>Max requests allowed in the current rate-limit window.</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Remaining</code></td>\n<td>integer</td>\n<td><code>57</code></td>\n<td>Requests remaining in the current rate-limit window.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>error</code></td>\n<td>string</td>\n<td>—</td>\n<td>Error message</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"404--phonenumber-not-found-in-the-callers-pbx\"><code>404</code> — PhoneNumber not found in the caller's PBX.</h3>\n<h3 id=\"422--validation-error---call_flow_id-missing-malformed-or-doesnt-belong\"><code>422</code> — Validation error - call_flow_id missing, malformed, or doesn't belong</h3>\n<p>Validation error - call_flow_id missing, malformed, or doesn't belong\nto the caller's PBX.</p>\n","urlObject":{"path":["{{version}}","numbers",":id","call-flow"],"host":["{{baseUrl}}"],"query":[],"variable":[{"id":"bb4fc316-ca2d-45f2-9272-e2f6f710a762","description":{"content":"<p>PhoneNumber UUID.</p>\n","type":"text/plain"},"type":"any","value":"550e8400-e29b-41d4-a716-446655440000","key":"id"}]}},"response":[{"id":"7f4c6c7a-08cd-40d5-bb4b-38dd6806cc25","name":"200 — Updated PhoneNumber with the new call flow attached.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"PUT","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"call_flow_id\": \"550e8400-e29b-41d4-a716-446655440100\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{baseUrl}}/{{version}}/numbers/:id/call-flow","host":["{{baseUrl}}"],"path":["{{version}}","numbers",":id","call-flow"],"variable":[{"key":"id","value":"550e8400-e29b-41d4-a716-446655440000","description":"PhoneNumber UUID."}]},"description":"Set the handling strategy of a PhoneNumber to route incoming calls through\na specific call flow. Both the PhoneNumber and the CallFlow must belong to\nthe caller's PBX.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"number\": \"+12125550100\",\n  \"name\": \"Customer Support\",\n  \"is_active\": true,\n  \"call_flow_id\": \"550e8400-e29b-41d4-a716-446655440100\",\n  \"call_flow\": {\n    \"id\": null,\n    \"name\": null,\n    \"enabled\": null\n  }\n}"},{"id":"bf05f532-7608-411a-b812-d9f9bd55d37f","name":"401 — Authorization Token Missing This error is returned when the authorization token is missing.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"PUT","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"call_flow_id\": \"550e8400-e29b-41d4-a716-446655440100\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{baseUrl}}/{{version}}/numbers/:id/call-flow","host":["{{baseUrl}}"],"path":["{{version}}","numbers",":id","call-flow"],"variable":[{"key":"id","value":"550e8400-e29b-41d4-a716-446655440000","description":"PhoneNumber UUID."}]},"description":"Set the handling strategy of a PhoneNumber to route incoming calls through\na specific call flow. Both the PhoneNumber and the CallFlow must belong to\nthe caller's PBX.\n"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Cache-Control","value":"private, must-revalidate","description":""},{"key":"Connection","value":"keep-alive","description":""},{"key":"Vary","value":"Origin","description":""},{"key":"X-RateLimit-Limit","value":"60","description":"Max requests allowed in the current rate-limit window."},{"key":"X-RateLimit-Remaining","value":"57","description":"Requests remaining in the current rate-limit window."}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Authorization Token is missing\"\n}"},{"id":"868be432-1f95-4b64-9f0f-3d4a8fba65f2","name":"404 — PhoneNumber not found in the caller's PBX.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"PUT","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"call_flow_id\": \"550e8400-e29b-41d4-a716-446655440100\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{baseUrl}}/{{version}}/numbers/:id/call-flow","host":["{{baseUrl}}"],"path":["{{version}}","numbers",":id","call-flow"],"variable":[{"key":"id","value":"550e8400-e29b-41d4-a716-446655440000","description":"PhoneNumber UUID."}]},"description":"Set the handling strategy of a PhoneNumber to route incoming calls through\na specific call flow. Both the PhoneNumber and the CallFlow must belong to\nthe caller's PBX.\n"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"text/plain"}],"cookie":[],"responseTime":null,"body":"PhoneNumber not found in the caller's PBX."},{"id":"cae33a05-fc52-4436-a217-21aec5271292","name":"422 — Validation error - call_flow_id missing, malformed, or doesn't belong to the caller's PBX.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"PUT","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"call_flow_id\": \"550e8400-e29b-41d4-a716-446655440100\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{baseUrl}}/{{version}}/numbers/:id/call-flow","host":["{{baseUrl}}"],"path":["{{version}}","numbers",":id","call-flow"],"variable":[{"key":"id","value":"550e8400-e29b-41d4-a716-446655440000","description":"PhoneNumber UUID."}]},"description":"Set the handling strategy of a PhoneNumber to route incoming calls through\na specific call flow. Both the PhoneNumber and the CallFlow must belong to\nthe caller's PBX.\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"text/plain"}],"cookie":[],"responseTime":null,"body":"Validation error - call_flow_id missing, malformed, or doesn't belong\nto the caller's PBX.\n"}],"_postman_id":"88401303-2623-48c5-b329-d1635c1f93eb"},{"name":"Check whether a phone number can be ordered","id":"9cb23243-ec7b-4757-bd14-e6941de5cdaf","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"street\": \"Adenauerallee\",\n  \"street_number\": \"1\",\n  \"postal_code\": \"53113\",\n  \"city\": \"Bonn\",\n  \"area_code\": null,\n  \"country\": \"DE\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/numbers/orders/check","description":"<p>Pre-flight check that validates an address with the upstream registry and\nreturns (a) the dial <code>prefix</code> for the resolved location, (b) the geocoder's\n<code>resolvedAddress</code>, and (c) the <code>kycRequirements</code> that must accompany the\nfuture order. Call this before <code>POST /numbers/orders</code>.</p>\n<h3 id=\"comparing-the-address\">Comparing the address</h3>\n<p>The address is geocoded, so <code>resolvedAddress</code> may differ from what you sent\n(<code>address</code> echoes your input). Compare the two and, if they differ, confirm\nthe corrected values with the end user before placing the order - the order\nendpoint persists the geocoder-resolved values. Structured fields in\n<code>resolvedAddress</code> are nullable (the geocoder may fail to pin a component such\nas the street number); <code>formattedAddress</code> is always present.</p>\n<h3 id=\"working-with-kycrequirements\">Working with <code>kycRequirements</code></h3>\n<p><code>kycRequirements</code> lists the KYC documents that must be supplied on\n<code>POST /numbers/orders</code>. Each <strong>top-level entry</strong> is either:</p>\n<ul>\n<li>an <strong>object</strong> - that exact document is required, or</li>\n<li>an <strong>array of objects</strong> - you must provide <strong>any one</strong> of the documents\nlisted inside (an \"OR group\").</li>\n</ul>\n<p>So the example below requires <strong>two</strong> documents in total:</p>\n<ul>\n<li>either a <code>business_registration_certificate</code> <strong>or</strong> a <code>utility_bill</code>\n(the OR group), <strong>and</strong></li>\n<li>an <code>id_document</code> (the standalone entry).</li>\n</ul>\n<p>Each <code>documentType</code> is the code you reference when uploading on\n<code>POST /numbers/orders</code>: send file documents as a file part\n<code>kyc[&lt;documentType&gt;]</code> (e.g. <code>kyc[utility_bill]</code> carrying <code>bill.pdf</code>;\naccepted MIME types <code>application/pdf</code>, <code>image/jpeg</code>, <code>image/png</code>), and\nidentifier-only documents as a form field\n<code>kyc[&lt;documentType&gt;]=&lt;value&gt;</code> (e.g. <code>kyc[business_registration_number]=BE-12345</code>).</p>\n<p>The optional <code>notes</code> field carries country-specific context (the local name\nof the document, or a freshness constraint such as \"dated within 3 months\")\nand can be surfaced verbatim to the end user.</p>\n<hr />\n<h2 id=\"request\">Request</h2>\n<p><strong>Request body</strong> — <code>application/json</code>  <em>(required)</em></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>street</code></td>\n<td>string</td>\n<td>yes</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>street_number</code></td>\n<td>string</td>\n<td>yes</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>postal_code</code></td>\n<td>string</td>\n<td>yes</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>city</code></td>\n<td>string</td>\n<td>yes</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>area_code</code></td>\n<td>string</td>\n<td>no</td>\n<td>maxLength: <code>16</code>; nullable</td>\n<td>Country-conditional. Required for some countries (e.g. Switzerland,<br /><code>CH</code>, where it would be something like <code>43</code>) and must be omitted for<br />others - it is <code>null</code> for the <code>DE</code> example here. Send the same value<br />you will send to <code>POST /numbers/orders</code>.<br /></td>\n</tr>\n<tr>\n<td><code>country</code></td>\n<td>string</td>\n<td>yes</td>\n<td>minLength: <code>2</code>; maxLength: <code>2</code></td>\n<td>ISO 3166-1 alpha-2 country code.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"responses\">Responses</h2>\n<h3 id=\"200--address-resolved-successfully-kyc-requirements-returned\"><code>200</code> — Address resolved successfully; KYC requirements returned.</h3>\n<p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>address</code></td>\n<td>object</td>\n<td>—</td>\n<td>Echo of the address components you submitted.</td>\n</tr>\n<tr>\n<td><code>address.street</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.street_number</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.postal_code</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.city</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.country</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>resolvedAddress</code></td>\n<td>object</td>\n<td>—</td>\n<td>Address as resolved by the geocoder. Compare against <code>address</code><br />to detect corrections. Structured fields are nullable;<br /><code>formattedAddress</code> is always present.<br /></td>\n</tr>\n<tr>\n<td><code>resolvedAddress.street</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>resolvedAddress.streetNumber</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>resolvedAddress.postalCode</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>resolvedAddress.city</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>resolvedAddress.country</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>resolvedAddress.formattedAddress</code></td>\n<td>string</td>\n<td>—</td>\n<td>Human-readable resolved address. Always present.</td>\n</tr>\n<tr>\n<td><code>prefix</code></td>\n<td>string</td>\n<td>—</td>\n<td>Dial prefix for the resolved location in E.164 form with a<br />leading <code>+</code> (country prefix plus area code where applicable).<br /></td>\n</tr>\n<tr>\n<td><code>kycRequirements</code></td>\n<td>array</td>\n<td>—</td>\n<td>KYC documents required on the future order. Each entry is<br />either a single requirement object, or an array of objects<br />meaning \"provide any one of these\". See the endpoint<br />description for how to upload each <code>documentType</code>.<br /></td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"401--authorization-token-missing-this-error-is-returned-when-the-authorization-token-is-missing\"><code>401</code> — Authorization Token Missing <br />This error is returned when the authorization token is missing.</h3>\n<p><strong>Headers</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Type</th>\n<th>Example</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Cache-Control</code></td>\n<td>string</td>\n<td><code>private, must-revalidate</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Connection</code></td>\n<td>string</td>\n<td><code>keep-alive</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td>string</td>\n<td><code>application/json</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Vary</code></td>\n<td>string</td>\n<td><code>Origin</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Limit</code></td>\n<td>integer</td>\n<td><code>60</code></td>\n<td>Max requests allowed in the current rate-limit window.</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Remaining</code></td>\n<td>integer</td>\n<td><code>57</code></td>\n<td>Requests remaining in the current rate-limit window.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>error</code></td>\n<td>string</td>\n<td>—</td>\n<td>Error message</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"422--the-address-failed-validation---locally-or-upstream-eg-it-could-not-be\"><code>422</code> — The address failed validation - locally or upstream (e.g. it could not be</h3>\n<p>The address failed validation - locally or upstream (e.g. it could not be\nresolved, or your account may not order numbers for that country). Same\n<code>{ message, errors }</code> shape as every other API validation 422, with\n<code>errors</code> mapping each rejected field to its messages. No order is created\nat this stage, so there is no <code>data</code>.</p>\n<p>When an upstream error has no field to attach to, <code>errors</code> is an empty\nobject <code>{}</code> and <code>message</code> carries the reason.</p>\n<p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>message</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>errors</code></td>\n<td>object</td>\n<td>—</td>\n<td>—</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["{{version}}","numbers","orders","check"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"ac63c878-0b00-400c-beff-5adbd434741d","name":"200 — Address resolved successfully; KYC requirements returned.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"street\": \"Adenauerallee\",\n  \"street_number\": \"1\",\n  \"postal_code\": \"53113\",\n  \"city\": \"Bonn\",\n  \"area_code\": null,\n  \"country\": \"DE\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/numbers/orders/check","description":"Pre-flight check that validates an address with the upstream registry and\nreturns (a) the dial `prefix` for the resolved location, (b) the geocoder's\n`resolvedAddress`, and (c) the `kycRequirements` that must accompany the\nfuture order. Call this before `POST /numbers/orders`.\n\n### Comparing the address\n\nThe address is geocoded, so `resolvedAddress` may differ from what you sent\n(`address` echoes your input). Compare the two and, if they differ, confirm\nthe corrected values with the end user before placing the order - the order\nendpoint persists the geocoder-resolved values. Structured fields in\n`resolvedAddress` are nullable (the geocoder may fail to pin a component such\nas the street number); `formattedAddress` is always present.\n\n### Working with `kycRequirements`\n\n`kycRequirements` lists the KYC documents that must be supplied on\n`POST /numbers/orders`. Each **top-level entry** is either:\n\n  * an **object** - that exact document is required, or\n  * an **array of objects** - you must provide **any one** of the documents\n    listed inside (an \"OR group\").\n\nSo the example below requires **two** documents in total:\n\n  * either a `business_registration_certificate` **or** a `utility_bill`\n    (the OR group), **and**\n  * an `id_document` (the standalone entry).\n\nEach `documentType` is the code you reference when uploading on\n`POST /numbers/orders`: send file documents as a file part\n`kyc[<documentType>]` (e.g. `kyc[utility_bill]` carrying `bill.pdf`;\naccepted MIME types `application/pdf`, `image/jpeg`, `image/png`), and\nidentifier-only documents as a form field\n`kyc[<documentType>]=<value>` (e.g. `kyc[business_registration_number]=BE-12345`).\n\nThe optional `notes` field carries country-specific context (the local name\nof the document, or a freshness constraint such as \"dated within 3 months\")\nand can be surfaced verbatim to the end user.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"address\": {\n    \"street\": \"Adenauerallee\",\n    \"street_number\": \"1\",\n    \"postal_code\": \"53113\",\n    \"city\": \"Bonn\",\n    \"country\": \"DE\"\n  },\n  \"resolvedAddress\": {\n    \"street\": \"Adenauerallee\",\n    \"streetNumber\": \"1\",\n    \"postalCode\": \"53113\",\n    \"city\": \"Bonn\",\n    \"country\": \"DE\",\n    \"formattedAddress\": \"Adenauerallee 1, 53113 Bonn, Germany\"\n  },\n  \"prefix\": \"+49228\",\n  \"kycRequirements\": [\n    [\n      {\n        \"documentType\": \"business_registration_certificate\",\n        \"notes\": \"Handelsregister\"\n      },\n      {\n        \"documentType\": \"utility_bill\",\n        \"notes\": \"Dated within 3 months\"\n      }\n    ],\n    {\n      \"documentType\": \"id_document\"\n    }\n  ]\n}"},{"id":"5e78bf7f-edb2-4854-98d6-46e7c01ee87d","name":"401 — Authorization Token Missing This error is returned when the authorization token is missing.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"street\": \"Adenauerallee\",\n  \"street_number\": \"1\",\n  \"postal_code\": \"53113\",\n  \"city\": \"Bonn\",\n  \"area_code\": null,\n  \"country\": \"DE\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/numbers/orders/check","description":"Pre-flight check that validates an address with the upstream registry and\nreturns (a) the dial `prefix` for the resolved location, (b) the geocoder's\n`resolvedAddress`, and (c) the `kycRequirements` that must accompany the\nfuture order. Call this before `POST /numbers/orders`.\n\n### Comparing the address\n\nThe address is geocoded, so `resolvedAddress` may differ from what you sent\n(`address` echoes your input). Compare the two and, if they differ, confirm\nthe corrected values with the end user before placing the order - the order\nendpoint persists the geocoder-resolved values. Structured fields in\n`resolvedAddress` are nullable (the geocoder may fail to pin a component such\nas the street number); `formattedAddress` is always present.\n\n### Working with `kycRequirements`\n\n`kycRequirements` lists the KYC documents that must be supplied on\n`POST /numbers/orders`. Each **top-level entry** is either:\n\n  * an **object** - that exact document is required, or\n  * an **array of objects** - you must provide **any one** of the documents\n    listed inside (an \"OR group\").\n\nSo the example below requires **two** documents in total:\n\n  * either a `business_registration_certificate` **or** a `utility_bill`\n    (the OR group), **and**\n  * an `id_document` (the standalone entry).\n\nEach `documentType` is the code you reference when uploading on\n`POST /numbers/orders`: send file documents as a file part\n`kyc[<documentType>]` (e.g. `kyc[utility_bill]` carrying `bill.pdf`;\naccepted MIME types `application/pdf`, `image/jpeg`, `image/png`), and\nidentifier-only documents as a form field\n`kyc[<documentType>]=<value>` (e.g. `kyc[business_registration_number]=BE-12345`).\n\nThe optional `notes` field carries country-specific context (the local name\nof the document, or a freshness constraint such as \"dated within 3 months\")\nand can be surfaced verbatim to the end user.\n"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Cache-Control","value":"private, must-revalidate","description":""},{"key":"Connection","value":"keep-alive","description":""},{"key":"Vary","value":"Origin","description":""},{"key":"X-RateLimit-Limit","value":"60","description":"Max requests allowed in the current rate-limit window."},{"key":"X-RateLimit-Remaining","value":"57","description":"Requests remaining in the current rate-limit window."}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Authorization Token is missing\"\n}"},{"id":"100d5195-e67c-4e4b-9e27-7e09956bb0ed","name":"422 — Local validation - one or more fields invalid","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"street\": \"Adenauerallee\",\n  \"street_number\": \"1\",\n  \"postal_code\": \"53113\",\n  \"city\": \"Bonn\",\n  \"area_code\": null,\n  \"country\": \"DE\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/numbers/orders/check","description":"Pre-flight check that validates an address with the upstream registry and\nreturns (a) the dial `prefix` for the resolved location, (b) the geocoder's\n`resolvedAddress`, and (c) the `kycRequirements` that must accompany the\nfuture order. Call this before `POST /numbers/orders`.\n\n### Comparing the address\n\nThe address is geocoded, so `resolvedAddress` may differ from what you sent\n(`address` echoes your input). Compare the two and, if they differ, confirm\nthe corrected values with the end user before placing the order - the order\nendpoint persists the geocoder-resolved values. Structured fields in\n`resolvedAddress` are nullable (the geocoder may fail to pin a component such\nas the street number); `formattedAddress` is always present.\n\n### Working with `kycRequirements`\n\n`kycRequirements` lists the KYC documents that must be supplied on\n`POST /numbers/orders`. Each **top-level entry** is either:\n\n  * an **object** - that exact document is required, or\n  * an **array of objects** - you must provide **any one** of the documents\n    listed inside (an \"OR group\").\n\nSo the example below requires **two** documents in total:\n\n  * either a `business_registration_certificate` **or** a `utility_bill`\n    (the OR group), **and**\n  * an `id_document` (the standalone entry).\n\nEach `documentType` is the code you reference when uploading on\n`POST /numbers/orders`: send file documents as a file part\n`kyc[<documentType>]` (e.g. `kyc[utility_bill]` carrying `bill.pdf`;\naccepted MIME types `application/pdf`, `image/jpeg`, `image/png`), and\nidentifier-only documents as a form field\n`kyc[<documentType>]=<value>` (e.g. `kyc[business_registration_number]=BE-12345`).\n\nThe optional `notes` field carries country-specific context (the local name\nof the document, or a freshness constraint such as \"dated within 3 months\")\nand can be surfaced verbatim to the end user.\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"The street field is required. (and 1 more error)\",\n  \"errors\": {\n    \"street\": [\n      \"The street field is required.\"\n    ],\n    \"street_number\": [\n      \"The street number field is required.\"\n    ]\n  }\n}"},{"id":"7398658d-8437-4f94-a9a3-89b413b3c650","name":"422 — Account not authorised to order in this country","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"street\": \"Adenauerallee\",\n  \"street_number\": \"1\",\n  \"postal_code\": \"53113\",\n  \"city\": \"Bonn\",\n  \"area_code\": null,\n  \"country\": \"DE\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/numbers/orders/check","description":"Pre-flight check that validates an address with the upstream registry and\nreturns (a) the dial `prefix` for the resolved location, (b) the geocoder's\n`resolvedAddress`, and (c) the `kycRequirements` that must accompany the\nfuture order. Call this before `POST /numbers/orders`.\n\n### Comparing the address\n\nThe address is geocoded, so `resolvedAddress` may differ from what you sent\n(`address` echoes your input). Compare the two and, if they differ, confirm\nthe corrected values with the end user before placing the order - the order\nendpoint persists the geocoder-resolved values. Structured fields in\n`resolvedAddress` are nullable (the geocoder may fail to pin a component such\nas the street number); `formattedAddress` is always present.\n\n### Working with `kycRequirements`\n\n`kycRequirements` lists the KYC documents that must be supplied on\n`POST /numbers/orders`. Each **top-level entry** is either:\n\n  * an **object** - that exact document is required, or\n  * an **array of objects** - you must provide **any one** of the documents\n    listed inside (an \"OR group\").\n\nSo the example below requires **two** documents in total:\n\n  * either a `business_registration_certificate` **or** a `utility_bill`\n    (the OR group), **and**\n  * an `id_document` (the standalone entry).\n\nEach `documentType` is the code you reference when uploading on\n`POST /numbers/orders`: send file documents as a file part\n`kyc[<documentType>]` (e.g. `kyc[utility_bill]` carrying `bill.pdf`;\naccepted MIME types `application/pdf`, `image/jpeg`, `image/png`), and\nidentifier-only documents as a form field\n`kyc[<documentType>]=<value>` (e.g. `kyc[business_registration_number]=BE-12345`).\n\nThe optional `notes` field carries country-specific context (the local name\nof the document, or a freshness constraint such as \"dated within 3 months\")\nand can be surfaced verbatim to the end user.\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Phone numbers cannot be ordered for this country. Your account is not authorised to order numbers here - pick a different country or contact support.\",\n  \"errors\": {\n    \"country\": [\n      \"Phone numbers cannot be ordered for this country. Your account is not authorised to order numbers here - pick a different country or contact support.\"\n    ]\n  }\n}"}],"_postman_id":"9cb23243-ec7b-4757-bd14-e6941de5cdaf"},{"name":"Place a phone number order","id":"d03c2a12-9987-426f-b765-8c4901fd8bf3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"customer_name","type":"text","description":"<p>Legal name of the customer the numbers are ordered for. Required;\nforwarded to the carrier, which records and may validate it.</p>\n","value":"ACME GmbH"},{"key":"street","type":"text","value":"Adenauerallee"},{"key":"street_number","type":"text","value":"1"},{"key":"postal_code","type":"text","value":"53113"},{"key":"city","type":"text","value":"Bonn"},{"key":"area_code","type":"text","description":"<p>Country-conditional. Required for some countries (e.g. Switzerland,\n<code>CH</code>, where it would be something like <code>43</code>) and rejected (422) for\nothers - it is <code>null</code> for the <code>DE</code> example here. Use the same value\nyou sent to <code>POST /numbers/orders/check</code>.</p>\n","value":"","disabled":true},{"key":"country","type":"text","value":"DE"},{"key":"quantity","type":"text","value":"1"},{"key":"webhook","type":"text","description":"<p>Optional URL we POST to once the order is fulfilled. The order is\naccepted asynchronously (this endpoint returns <code>201</code> with status\n<code>requested</code>), so the assigned numbers - or a rejection - are\ndelivered here later, not in this response. See \"Webhook payloads\"\nabove for the exact body. The same outcome can also be fetched from\n<code>GET /numbers/orders/{id}</code>.</p>\n","value":"https://your-app.example/hooks/number-order","disabled":true},{"key":"order_id","type":"text","description":"<p>Optional customer reference (any short string, max 64 chars).\nEchoed back in the response, in <code>GET /numbers/orders/{id}</code>, and\nat the top level of the asynchronous webhook payload as\n<code>order_id</code> (the webhook body is the same order object). If\nomitted, the upstream provider generates one and we backfill it\non your row.</p>\n","value":"po-2026-00042","disabled":true},{"key":"kyc","type":"text","description":"<p>KYC documents, one entry per <code>documentType</code> returned by\n<code>POST /numbers/orders/check</code> for the country. Send file documents\nas a file part <code>kyc[&lt;documentType&gt;]</code> and identifier-only documents\nas a form field <code>kyc[&lt;documentType&gt;]=&lt;value&gt;</code>. Accepted file MIME\ntypes: <code>application/pdf</code>, <code>image/jpeg</code>, <code>image/png</code>. Example shape:</p>\n<ul>\n<li><code>kyc[utility_bill]</code> - file part carrying <code>bill.pdf</code></li>\n<li><code>kyc[id_document]</code> - file part carrying <code>passport.jpg</code></li>\n<li><code>kyc[business_registration_number]=BE-12345</code> - form field</li>\n</ul>\n<p>For an OR group returned by the check endpoint (an array of types),\nprovide any one of the listed <code>documentType</code>s.</p>\n","value":"","disabled":true}]},"url":"{{baseUrl}}/{{version}}/numbers/orders","description":"<p>Submit a phone number order. Must be called as <code>multipart/form-data</code> because\nKYC document files are part of the request. Call <code>POST /numbers/orders/check</code>\nfirst to obtain the address-specific <code>kycRequirements</code>.</p>\n<p>You may attach your own <code>order_id</code> (any short string, max 64 chars) - it\nwill be echoed back to you in the response, in <code>GET /numbers/orders/{id}</code>,\nand in the asynchronous webhook payload below. If you omit it, the upstream\nprovider will generate one and we'll backfill it on your row.</p>\n<p>Order fulfilment is asynchronous. This endpoint returns <code>201</code> as soon as the\norder is accepted upstream. The final outcome (success or rejection) will be\ndelivered to your <code>webhook</code> URL (if provided) and is queryable via\n<code>GET /numbers/orders/{id}</code>.</p>\n<h3 id=\"webhook-payload\">Webhook payload</h3>\n<p>When the order reaches its final state we POST to your <code>webhook</code> URL the\n<strong>exact same body</strong> as <code>GET /numbers/orders/{id}</code> (the schema below). Read\nthe <code>status</code> field to tell success from rejection:</p>\n<ul>\n<li><code>status: \"success\"</code> - <code>numbers</code> and <code>phone_numbers</code> are populated.</li>\n<li><code>status: \"error\"</code> - <code>error_message</code> carries the rejection reason.</li>\n</ul>\n<hr />\n<h2 id=\"request\">Request</h2>\n<p><strong>Request body</strong> — <code>multipart/form-data</code>  <em>(required)</em></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>customer_name</code></td>\n<td>string</td>\n<td>yes</td>\n<td>maxLength: <code>255</code></td>\n<td>Legal name of the customer the numbers are ordered for. Required;<br />forwarded to the carrier, which records and may validate it.<br /></td>\n</tr>\n<tr>\n<td><code>street</code></td>\n<td>string</td>\n<td>yes</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>street_number</code></td>\n<td>string</td>\n<td>yes</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>postal_code</code></td>\n<td>string</td>\n<td>yes</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>city</code></td>\n<td>string</td>\n<td>yes</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>area_code</code></td>\n<td>string</td>\n<td>no</td>\n<td>maxLength: <code>16</code>; nullable</td>\n<td>Country-conditional. Required for some countries (e.g. Switzerland,<br /><code>CH</code>, where it would be something like <code>43</code>) and rejected (422) for<br />others - it is <code>null</code> for the <code>DE</code> example here. Use the same value<br />you sent to <code>POST /numbers/orders/check</code>.<br /></td>\n</tr>\n<tr>\n<td><code>country</code></td>\n<td>string</td>\n<td>yes</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>integer</td>\n<td>yes</td>\n<td>minimum: <code>1</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>webhook</code></td>\n<td>string</td>\n<td>no</td>\n<td>format: <code>uri</code>; maxLength: <code>500</code>; nullable</td>\n<td>Optional URL we POST to once the order is fulfilled. The order is<br />accepted asynchronously (this endpoint returns <code>201</code> with status<br /><code>requested</code>), so the assigned numbers - or a rejection - are<br />delivered here later, not in this response. See \"Webhook payloads\"<br />above for the exact body. The same outcome can also be fetched from<br /><code>GET /numbers/orders/{id}</code>.<br /></td>\n</tr>\n<tr>\n<td><code>order_id</code></td>\n<td>string</td>\n<td>no</td>\n<td>maxLength: <code>64</code>; nullable</td>\n<td>Optional customer reference (any short string, max 64 chars).<br />Echoed back in the response, in <code>GET /numbers/orders/{id}</code>, and<br />at the top level of the asynchronous webhook payload as<br /><code>order_id</code> (the webhook body is the same order object). If<br />omitted, the upstream provider generates one and we backfill it<br />on your row.<br /></td>\n</tr>\n<tr>\n<td><code>kyc</code></td>\n<td>object</td>\n<td>no</td>\n<td>—</td>\n<td>KYC documents, one entry per <code>documentType</code> returned by<br /><code>POST /numbers/orders/check</code> for the country. Send file documents<br />as a file part <code>kyc[&lt;documentType&gt;]</code> and identifier-only documents<br />as a form field <code>kyc[&lt;documentType&gt;]=&lt;value&gt;</code>. Accepted file MIME<br />types: <code>application/pdf</code>, <code>image/jpeg</code>, <code>image/png</code>. Example shape:<br /><br />  * <code>kyc[utility_bill]</code> - file part carrying <code>bill.pdf</code><br />  * <code>kyc[id_document]</code> - file part carrying <code>passport.jpg</code><br />  * <code>kyc[business_registration_number]=BE-12345</code> - form field<br /><br />For an OR group returned by the check endpoint (an array of types),<br />provide any one of the listed <code>documentType</code>s.<br /></td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"responses\">Responses</h2>\n<h3 id=\"201--order-accepted-upstream-and-persisted-on-our-side\"><code>201</code> — Order accepted upstream and persisted on our side.</h3>\n<p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>Internal order id assigned by us. Use this with <code>GET /numbers/orders/{id}</code><br />to fetch the latest state. NOT the value echoed in the asynchronous<br />webhook payload - that one is <code>order_id</code> (your own reference).<br /></td>\n</tr>\n<tr>\n<td><code>order_id</code></td>\n<td>string</td>\n<td>maxLength: <code>64</code>; nullable</td>\n<td>Your customer reference, supplied via the <code>order_id</code> field in<br /><code>POST /numbers/orders</code> (or <code>POST /numbers/orders/{id}</code>). Echoed back here,<br />in <code>GET /numbers/orders/{id}</code>, and at the top level of the asynchronous<br />webhook payload (which is this same object) as <code>order_id</code>.<br /></td>\n</tr>\n<tr>\n<td><code>customer_name</code></td>\n<td>string</td>\n<td>—</td>\n<td>Legal name of the customer the numbers were ordered for, as supplied on<br />create (and editable on retry).<br /></td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>enum: <code>created</code>, <code>requested</code>, <code>submission_failed</code>, <code>processing</code>, <code>success</code>, <code>error</code>, <code>processing_failed</code></td>\n<td>Lifecycle state of this order.<br /> * <code>requested</code> — sent upstream, awaiting fulfilment.<br /> * <code>submission_failed</code> — rejected during synchronous submission; editable + retryable.<br /> * <code>processing</code> — async success callback received; provisioning in progress.<br /> * <code>success</code> — provisioning complete; <code>numbers</code> is populated.<br /> * <code>error</code> — async rejection; terminal.<br /> * <code>processing_failed</code> — internal processing exhausted retries; admin-only retry.<br /></td>\n</tr>\n<tr>\n<td><code>address</code></td>\n<td>object</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.street</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.street_number</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.postal_code</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.city</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.area_code</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Country-conditional (e.g. set for CH); null otherwise.</td>\n</tr>\n<tr>\n<td><code>address.country</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>formatted_address</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Single-line, comma-separated address derived from the persisted<br />components (street + number, postal code + city, country). Empty<br />components are dropped.<br /></td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>integer</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>prefix</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Dial prefix in E.164 (country + area code if applicable).</td>\n</tr>\n<tr>\n<td><code>numbers</code></td>\n<td>array</td>\n<td>—</td>\n<td>E.164-formatted numbers assigned to this order. Empty (<code>[]</code>) until the<br />order reaches <code>success</code> - they are never returned synchronously by<br /><code>POST /numbers/orders</code> (which only ever returns <code>requested</code>); they arrive<br />later via the webhook and then appear here on <code>GET /numbers/orders/{id}</code>.<br /></td>\n</tr>\n<tr>\n<td><code>phone_numbers</code></td>\n<td>array</td>\n<td>—</td>\n<td>The assigned numbers, in the same shape as <code>GET /numbers</code><br />(id, number, name, is_active, call_flow), so you can read each number's id<br />and current call flow and act on it directly (e.g. <code>PUT /numbers/{id}/call-flow</code>).<br />Populated once the order reaches <code>success</code>.<br /></td>\n</tr>\n<tr>\n<td><code>phone_numbers[].id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].number</code></td>\n<td>string</td>\n<td>—</td>\n<td>Phone number in E.164 format.</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].name</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].is_active</code></td>\n<td>boolean</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].call_flow_id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code>; nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].call_flow</code></td>\n<td>object</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].call_flow.id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].call_flow.name</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].call_flow.enabled</code></td>\n<td>boolean</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>error_message</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Short error reason when status is <code>error</code> or <code>submission_failed</code>.</td>\n</tr>\n<tr>\n<td><code>webhook_url</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>The webhook URL we will POST the final outcome to.</td>\n</tr>\n<tr>\n<td><code>webhook_status</code></td>\n<td>string</td>\n<td>enum: <code>not_required</code>, <code>pending</code>, <code>retrying</code>, <code>delivered</code>, <code>failed</code>, <code>cancelled</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>webhook_next_retry_at</code></td>\n<td>string</td>\n<td>format: <code>date-time</code>; nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>created_at</code></td>\n<td>string</td>\n<td>format: <code>date-time</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>updated_at</code></td>\n<td>string</td>\n<td>format: <code>date-time</code></td>\n<td>—</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"401--authorization-token-missing-this-error-is-returned-when-the-authorization-token-is-missing\"><code>401</code> — Authorization Token Missing <br />This error is returned when the authorization token is missing.</h3>\n<p><strong>Headers</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Type</th>\n<th>Example</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Cache-Control</code></td>\n<td>string</td>\n<td><code>private, must-revalidate</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Connection</code></td>\n<td>string</td>\n<td><code>keep-alive</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td>string</td>\n<td><code>application/json</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Vary</code></td>\n<td>string</td>\n<td><code>Origin</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Limit</code></td>\n<td>integer</td>\n<td><code>60</code></td>\n<td>Max requests allowed in the current rate-limit window.</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Remaining</code></td>\n<td>integer</td>\n<td><code>57</code></td>\n<td>Requests remaining in the current rate-limit window.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>error</code></td>\n<td>string</td>\n<td>—</td>\n<td>Error message</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"422--validation-failed-errors-maps-each-rejected-field-to-its-messages\"><code>422</code> — Validation failed. <code>errors</code> maps each rejected field to its messages.</h3>\n<p>Validation failed. <code>errors</code> maps each rejected field to its messages.</p>\n<p>If the order reached the carrier and was rejected there, it is persisted\nas a retryable <code>submission_failed</code> order and returned in <code>data</code> (the full\norder, same shape as <code>GET /numbers/orders/{id}</code>); use <code>data.id</code> to edit +\nretry it via <code>POST /numbers/orders/{id}</code>. When <code>data</code> is absent, no order\nwas created.</p>\n<p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>message</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>errors</code></td>\n<td>object</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data</code></td>\n<td>object</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>Internal order id assigned by us. Use this with <code>GET /numbers/orders/{id}</code><br />to fetch the latest state. NOT the value echoed in the asynchronous<br />webhook payload - that one is <code>order_id</code> (your own reference).<br /></td>\n</tr>\n<tr>\n<td><code>data.order_id</code></td>\n<td>string</td>\n<td>maxLength: <code>64</code>; nullable</td>\n<td>Your customer reference, supplied via the <code>order_id</code> field in<br /><code>POST /numbers/orders</code> (or <code>POST /numbers/orders/{id}</code>). Echoed back here,<br />in <code>GET /numbers/orders/{id}</code>, and at the top level of the asynchronous<br />webhook payload (which is this same object) as <code>order_id</code>.<br /></td>\n</tr>\n<tr>\n<td><code>data.customer_name</code></td>\n<td>string</td>\n<td>—</td>\n<td>Legal name of the customer the numbers were ordered for, as supplied on<br />create (and editable on retry).<br /></td>\n</tr>\n<tr>\n<td><code>data.status</code></td>\n<td>string</td>\n<td>enum: <code>created</code>, <code>requested</code>, <code>submission_failed</code>, <code>processing</code>, <code>success</code>, <code>error</code>, <code>processing_failed</code></td>\n<td>Lifecycle state of this order.<br /> * <code>requested</code> — sent upstream, awaiting fulfilment.<br /> * <code>submission_failed</code> — rejected during synchronous submission; editable + retryable.<br /> * <code>processing</code> — async success callback received; provisioning in progress.<br /> * <code>success</code> — provisioning complete; <code>numbers</code> is populated.<br /> * <code>error</code> — async rejection; terminal.<br /> * <code>processing_failed</code> — internal processing exhausted retries; admin-only retry.<br /></td>\n</tr>\n<tr>\n<td><code>data.address</code></td>\n<td>object</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.address.street</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.address.street_number</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.address.postal_code</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.address.city</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.address.area_code</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Country-conditional (e.g. set for CH); null otherwise.</td>\n</tr>\n<tr>\n<td><code>data.address.country</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.formatted_address</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Single-line, comma-separated address derived from the persisted<br />components (street + number, postal code + city, country). Empty<br />components are dropped.<br /></td>\n</tr>\n<tr>\n<td><code>data.quantity</code></td>\n<td>integer</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.prefix</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Dial prefix in E.164 (country + area code if applicable).</td>\n</tr>\n<tr>\n<td><code>data.numbers</code></td>\n<td>array</td>\n<td>—</td>\n<td>E.164-formatted numbers assigned to this order. Empty (<code>[]</code>) until the<br />order reaches <code>success</code> - they are never returned synchronously by<br /><code>POST /numbers/orders</code> (which only ever returns <code>requested</code>); they arrive<br />later via the webhook and then appear here on <code>GET /numbers/orders/{id}</code>.<br /></td>\n</tr>\n<tr>\n<td><code>data.phone_numbers</code></td>\n<td>array</td>\n<td>—</td>\n<td>The assigned numbers, in the same shape as <code>GET /numbers</code><br />(id, number, name, is_active, call_flow), so you can read each number's id<br />and current call flow and act on it directly (e.g. <code>PUT /numbers/{id}/call-flow</code>).<br />Populated once the order reaches <code>success</code>.<br /></td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].number</code></td>\n<td>string</td>\n<td>—</td>\n<td>Phone number in E.164 format.</td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].name</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].is_active</code></td>\n<td>boolean</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].call_flow_id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code>; nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].call_flow</code></td>\n<td>object</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].call_flow.id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].call_flow.name</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].call_flow.enabled</code></td>\n<td>boolean</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.error_message</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Short error reason when status is <code>error</code> or <code>submission_failed</code>.</td>\n</tr>\n<tr>\n<td><code>data.webhook_url</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>The webhook URL we will POST the final outcome to.</td>\n</tr>\n<tr>\n<td><code>data.webhook_status</code></td>\n<td>string</td>\n<td>enum: <code>not_required</code>, <code>pending</code>, <code>retrying</code>, <code>delivered</code>, <code>failed</code>, <code>cancelled</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.webhook_next_retry_at</code></td>\n<td>string</td>\n<td>format: <code>date-time</code>; nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.created_at</code></td>\n<td>string</td>\n<td>format: <code>date-time</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.updated_at</code></td>\n<td>string</td>\n<td>format: <code>date-time</code></td>\n<td>—</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["{{version}}","numbers","orders"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"8cc56bbb-e12a-4633-9cc9-8a4ccf468a78","name":"201 — Order accepted upstream and persisted on our side.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"customer_name","type":"text","description":"Legal name of the customer the numbers are ordered for. Required;\nforwarded to the carrier, which records and may validate it.\n","value":"ACME GmbH"},{"key":"street","type":"text","value":"Adenauerallee"},{"key":"street_number","type":"text","value":"1"},{"key":"postal_code","type":"text","value":"53113"},{"key":"city","type":"text","value":"Bonn"},{"key":"area_code","type":"text","description":"Country-conditional. Required for some countries (e.g. Switzerland,\n`CH`, where it would be something like `43`) and rejected (422) for\nothers - it is `null` for the `DE` example here. Use the same value\nyou sent to `POST /numbers/orders/check`.\n","value":"","disabled":true},{"key":"country","type":"text","value":"DE"},{"key":"quantity","type":"text","value":"1"},{"key":"webhook","type":"text","description":"Optional URL we POST to once the order is fulfilled. The order is\naccepted asynchronously (this endpoint returns `201` with status\n`requested`), so the assigned numbers - or a rejection - are\ndelivered here later, not in this response. See \"Webhook payloads\"\nabove for the exact body. The same outcome can also be fetched from\n`GET /numbers/orders/{id}`.\n","value":"https://your-app.example/hooks/number-order","disabled":true},{"key":"order_id","type":"text","description":"Optional customer reference (any short string, max 64 chars).\nEchoed back in the response, in `GET /numbers/orders/{id}`, and\nat the top level of the asynchronous webhook payload as\n`order_id` (the webhook body is the same order object). If\nomitted, the upstream provider generates one and we backfill it\non your row.\n","value":"po-2026-00042","disabled":true},{"key":"kyc","type":"text","description":"KYC documents, one entry per `documentType` returned by\n`POST /numbers/orders/check` for the country. Send file documents\nas a file part `kyc[<documentType>]` and identifier-only documents\nas a form field `kyc[<documentType>]=<value>`. Accepted file MIME\ntypes: `application/pdf`, `image/jpeg`, `image/png`. Example shape:\n\n  * `kyc[utility_bill]` - file part carrying `bill.pdf`\n  * `kyc[id_document]` - file part carrying `passport.jpg`\n  * `kyc[business_registration_number]=BE-12345` - form field\n\nFor an OR group returned by the check endpoint (an array of types),\nprovide any one of the listed `documentType`s.\n","value":"","disabled":true}]},"url":"{{baseUrl}}/{{version}}/numbers/orders","description":"Submit a phone number order. Must be called as `multipart/form-data` because\nKYC document files are part of the request. Call `POST /numbers/orders/check`\nfirst to obtain the address-specific `kycRequirements`.\n\nYou may attach your own `order_id` (any short string, max 64 chars) - it\nwill be echoed back to you in the response, in `GET /numbers/orders/{id}`,\nand in the asynchronous webhook payload below. If you omit it, the upstream\nprovider will generate one and we'll backfill it on your row.\n\nOrder fulfilment is asynchronous. This endpoint returns `201` as soon as the\norder is accepted upstream. The final outcome (success or rejection) will be\ndelivered to your `webhook` URL (if provided) and is queryable via\n`GET /numbers/orders/{id}`.\n\n### Webhook payload\n\nWhen the order reaches its final state we POST to your `webhook` URL the\n**exact same body** as `GET /numbers/orders/{id}` (the schema below). Read\nthe `status` field to tell success from rejection:\n\n  * `status: \"success\"` - `numbers` and `phone_numbers` are populated.\n  * `status: \"error\"` - `error_message` carries the rejection reason.\n"},"status":"Created","code":201,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"order_id\": \"po-2026-00042\",\n  \"customer_name\": \"ACME GmbH\",\n  \"status\": \"requested\",\n  \"address\": {\n    \"street\": \"Adenauerallee\",\n    \"street_number\": \"1\",\n    \"postal_code\": \"53113\",\n    \"city\": \"Bonn\",\n    \"area_code\": null,\n    \"country\": \"DE\"\n  },\n  \"formatted_address\": \"Adenauerallee 1, 53113 Bonn, DE\",\n  \"quantity\": 1,\n  \"prefix\": \"+49228\",\n  \"numbers\": [],\n  \"phone_numbers\": [],\n  \"error_message\": null,\n  \"webhook_url\": \"https://your-app.example/hooks/number-order\",\n  \"webhook_status\": \"pending\",\n  \"webhook_next_retry_at\": null,\n  \"created_at\": \"2026-05-12T10:36:47+00:00\",\n  \"updated_at\": \"2026-05-12T10:36:47+00:00\"\n}"},{"id":"7347106a-364d-491f-bd6d-14c697f1e691","name":"401 — Authorization Token Missing This error is returned when the authorization token is missing.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"customer_name","type":"text","description":"Legal name of the customer the numbers are ordered for. Required;\nforwarded to the carrier, which records and may validate it.\n","value":"ACME GmbH"},{"key":"street","type":"text","value":"Adenauerallee"},{"key":"street_number","type":"text","value":"1"},{"key":"postal_code","type":"text","value":"53113"},{"key":"city","type":"text","value":"Bonn"},{"key":"area_code","type":"text","description":"Country-conditional. Required for some countries (e.g. Switzerland,\n`CH`, where it would be something like `43`) and rejected (422) for\nothers - it is `null` for the `DE` example here. Use the same value\nyou sent to `POST /numbers/orders/check`.\n","value":"","disabled":true},{"key":"country","type":"text","value":"DE"},{"key":"quantity","type":"text","value":"1"},{"key":"webhook","type":"text","description":"Optional URL we POST to once the order is fulfilled. The order is\naccepted asynchronously (this endpoint returns `201` with status\n`requested`), so the assigned numbers - or a rejection - are\ndelivered here later, not in this response. See \"Webhook payloads\"\nabove for the exact body. The same outcome can also be fetched from\n`GET /numbers/orders/{id}`.\n","value":"https://your-app.example/hooks/number-order","disabled":true},{"key":"order_id","type":"text","description":"Optional customer reference (any short string, max 64 chars).\nEchoed back in the response, in `GET /numbers/orders/{id}`, and\nat the top level of the asynchronous webhook payload as\n`order_id` (the webhook body is the same order object). If\nomitted, the upstream provider generates one and we backfill it\non your row.\n","value":"po-2026-00042","disabled":true},{"key":"kyc","type":"text","description":"KYC documents, one entry per `documentType` returned by\n`POST /numbers/orders/check` for the country. Send file documents\nas a file part `kyc[<documentType>]` and identifier-only documents\nas a form field `kyc[<documentType>]=<value>`. Accepted file MIME\ntypes: `application/pdf`, `image/jpeg`, `image/png`. Example shape:\n\n  * `kyc[utility_bill]` - file part carrying `bill.pdf`\n  * `kyc[id_document]` - file part carrying `passport.jpg`\n  * `kyc[business_registration_number]=BE-12345` - form field\n\nFor an OR group returned by the check endpoint (an array of types),\nprovide any one of the listed `documentType`s.\n","value":"","disabled":true}]},"url":"{{baseUrl}}/{{version}}/numbers/orders","description":"Submit a phone number order. Must be called as `multipart/form-data` because\nKYC document files are part of the request. Call `POST /numbers/orders/check`\nfirst to obtain the address-specific `kycRequirements`.\n\nYou may attach your own `order_id` (any short string, max 64 chars) - it\nwill be echoed back to you in the response, in `GET /numbers/orders/{id}`,\nand in the asynchronous webhook payload below. If you omit it, the upstream\nprovider will generate one and we'll backfill it on your row.\n\nOrder fulfilment is asynchronous. This endpoint returns `201` as soon as the\norder is accepted upstream. The final outcome (success or rejection) will be\ndelivered to your `webhook` URL (if provided) and is queryable via\n`GET /numbers/orders/{id}`.\n\n### Webhook payload\n\nWhen the order reaches its final state we POST to your `webhook` URL the\n**exact same body** as `GET /numbers/orders/{id}` (the schema below). Read\nthe `status` field to tell success from rejection:\n\n  * `status: \"success\"` - `numbers` and `phone_numbers` are populated.\n  * `status: \"error\"` - `error_message` carries the rejection reason.\n"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Cache-Control","value":"private, must-revalidate","description":""},{"key":"Connection","value":"keep-alive","description":""},{"key":"Vary","value":"Origin","description":""},{"key":"X-RateLimit-Limit","value":"60","description":"Max requests allowed in the current rate-limit window."},{"key":"X-RateLimit-Remaining","value":"57","description":"Requests remaining in the current rate-limit window."}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Authorization Token is missing\"\n}"},{"id":"8547f16d-f93d-4e23-96fa-d0f7718e74e4","name":"422 — Local validation - one or more fields invalid","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"customer_name","type":"text","description":"Legal name of the customer the numbers are ordered for. Required;\nforwarded to the carrier, which records and may validate it.\n","value":"ACME GmbH"},{"key":"street","type":"text","value":"Adenauerallee"},{"key":"street_number","type":"text","value":"1"},{"key":"postal_code","type":"text","value":"53113"},{"key":"city","type":"text","value":"Bonn"},{"key":"area_code","type":"text","description":"Country-conditional. Required for some countries (e.g. Switzerland,\n`CH`, where it would be something like `43`) and rejected (422) for\nothers - it is `null` for the `DE` example here. Use the same value\nyou sent to `POST /numbers/orders/check`.\n","value":"","disabled":true},{"key":"country","type":"text","value":"DE"},{"key":"quantity","type":"text","value":"1"},{"key":"webhook","type":"text","description":"Optional URL we POST to once the order is fulfilled. The order is\naccepted asynchronously (this endpoint returns `201` with status\n`requested`), so the assigned numbers - or a rejection - are\ndelivered here later, not in this response. See \"Webhook payloads\"\nabove for the exact body. The same outcome can also be fetched from\n`GET /numbers/orders/{id}`.\n","value":"https://your-app.example/hooks/number-order","disabled":true},{"key":"order_id","type":"text","description":"Optional customer reference (any short string, max 64 chars).\nEchoed back in the response, in `GET /numbers/orders/{id}`, and\nat the top level of the asynchronous webhook payload as\n`order_id` (the webhook body is the same order object). If\nomitted, the upstream provider generates one and we backfill it\non your row.\n","value":"po-2026-00042","disabled":true},{"key":"kyc","type":"text","description":"KYC documents, one entry per `documentType` returned by\n`POST /numbers/orders/check` for the country. Send file documents\nas a file part `kyc[<documentType>]` and identifier-only documents\nas a form field `kyc[<documentType>]=<value>`. Accepted file MIME\ntypes: `application/pdf`, `image/jpeg`, `image/png`. Example shape:\n\n  * `kyc[utility_bill]` - file part carrying `bill.pdf`\n  * `kyc[id_document]` - file part carrying `passport.jpg`\n  * `kyc[business_registration_number]=BE-12345` - form field\n\nFor an OR group returned by the check endpoint (an array of types),\nprovide any one of the listed `documentType`s.\n","value":"","disabled":true}]},"url":"{{baseUrl}}/{{version}}/numbers/orders","description":"Submit a phone number order. Must be called as `multipart/form-data` because\nKYC document files are part of the request. Call `POST /numbers/orders/check`\nfirst to obtain the address-specific `kycRequirements`.\n\nYou may attach your own `order_id` (any short string, max 64 chars) - it\nwill be echoed back to you in the response, in `GET /numbers/orders/{id}`,\nand in the asynchronous webhook payload below. If you omit it, the upstream\nprovider will generate one and we'll backfill it on your row.\n\nOrder fulfilment is asynchronous. This endpoint returns `201` as soon as the\norder is accepted upstream. The final outcome (success or rejection) will be\ndelivered to your `webhook` URL (if provided) and is queryable via\n`GET /numbers/orders/{id}`.\n\n### Webhook payload\n\nWhen the order reaches its final state we POST to your `webhook` URL the\n**exact same body** as `GET /numbers/orders/{id}` (the schema below). Read\nthe `status` field to tell success from rejection:\n\n  * `status: \"success\"` - `numbers` and `phone_numbers` are populated.\n  * `status: \"error\"` - `error_message` carries the rejection reason.\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"The customer name field is required. (and 9 more errors)\",\n  \"errors\": {\n    \"customer_name\": [\n      \"The customer name field is required.\"\n    ],\n    \"street\": [\n      \"The street field is required.\"\n    ],\n    \"street_number\": [\n      \"The street number field is required.\"\n    ],\n    \"postal_code\": [\n      \"The postal code field is required.\"\n    ],\n    \"city\": [\n      \"The city field is required.\"\n    ],\n    \"country\": [\n      \"The country field is required.\"\n    ],\n    \"area_code\": [\n      \"The area code field is required.\"\n    ],\n    \"quantity\": [\n      \"The quantity field must be at least 1.\"\n    ],\n    \"webhook\": [\n      \"The webhook field must be a valid URL.\"\n    ],\n    \"order_id\": [\n      \"The order id field must not be greater than 64 characters.\"\n    ]\n  }\n}"},{"id":"ea3c15dd-7c15-4a49-8c83-38cb1a2daa70","name":"422 — Carrier rejected the order (mapped to your fields)","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"customer_name","type":"text","description":"Legal name of the customer the numbers are ordered for. Required;\nforwarded to the carrier, which records and may validate it.\n","value":"ACME GmbH"},{"key":"street","type":"text","value":"Adenauerallee"},{"key":"street_number","type":"text","value":"1"},{"key":"postal_code","type":"text","value":"53113"},{"key":"city","type":"text","value":"Bonn"},{"key":"area_code","type":"text","description":"Country-conditional. Required for some countries (e.g. Switzerland,\n`CH`, where it would be something like `43`) and rejected (422) for\nothers - it is `null` for the `DE` example here. Use the same value\nyou sent to `POST /numbers/orders/check`.\n","value":"","disabled":true},{"key":"country","type":"text","value":"DE"},{"key":"quantity","type":"text","value":"1"},{"key":"webhook","type":"text","description":"Optional URL we POST to once the order is fulfilled. The order is\naccepted asynchronously (this endpoint returns `201` with status\n`requested`), so the assigned numbers - or a rejection - are\ndelivered here later, not in this response. See \"Webhook payloads\"\nabove for the exact body. The same outcome can also be fetched from\n`GET /numbers/orders/{id}`.\n","value":"https://your-app.example/hooks/number-order","disabled":true},{"key":"order_id","type":"text","description":"Optional customer reference (any short string, max 64 chars).\nEchoed back in the response, in `GET /numbers/orders/{id}`, and\nat the top level of the asynchronous webhook payload as\n`order_id` (the webhook body is the same order object). If\nomitted, the upstream provider generates one and we backfill it\non your row.\n","value":"po-2026-00042","disabled":true},{"key":"kyc","type":"text","description":"KYC documents, one entry per `documentType` returned by\n`POST /numbers/orders/check` for the country. Send file documents\nas a file part `kyc[<documentType>]` and identifier-only documents\nas a form field `kyc[<documentType>]=<value>`. Accepted file MIME\ntypes: `application/pdf`, `image/jpeg`, `image/png`. Example shape:\n\n  * `kyc[utility_bill]` - file part carrying `bill.pdf`\n  * `kyc[id_document]` - file part carrying `passport.jpg`\n  * `kyc[business_registration_number]=BE-12345` - form field\n\nFor an OR group returned by the check endpoint (an array of types),\nprovide any one of the listed `documentType`s.\n","value":"","disabled":true}]},"url":"{{baseUrl}}/{{version}}/numbers/orders","description":"Submit a phone number order. Must be called as `multipart/form-data` because\nKYC document files are part of the request. Call `POST /numbers/orders/check`\nfirst to obtain the address-specific `kycRequirements`.\n\nYou may attach your own `order_id` (any short string, max 64 chars) - it\nwill be echoed back to you in the response, in `GET /numbers/orders/{id}`,\nand in the asynchronous webhook payload below. If you omit it, the upstream\nprovider will generate one and we'll backfill it on your row.\n\nOrder fulfilment is asynchronous. This endpoint returns `201` as soon as the\norder is accepted upstream. The final outcome (success or rejection) will be\ndelivered to your `webhook` URL (if provided) and is queryable via\n`GET /numbers/orders/{id}`.\n\n### Webhook payload\n\nWhen the order reaches its final state we POST to your `webhook` URL the\n**exact same body** as `GET /numbers/orders/{id}` (the schema below). Read\nthe `status` field to tell success from rejection:\n\n  * `status: \"success\"` - `numbers` and `phone_numbers` are populated.\n  * `status: \"error\"` - `error_message` carries the rejection reason.\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"This value is too short. It should have 3 characters or more. (and 1 more error)\",\n  \"errors\": {\n    \"customer_name\": [\n      \"This value is too short. It should have 3 characters or more.\"\n    ],\n    \"city\": [\n      \"The city does not match the provided postal code.\"\n    ]\n  },\n  \"data\": {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"order_id\": \"po-2026-00042\",\n    \"customer_name\": \"ACME GmbH\",\n    \"status\": \"submission_failed\",\n    \"address\": {\n      \"street\": \"Adenauerallee\",\n      \"street_number\": \"1\",\n      \"postal_code\": \"53113\",\n      \"city\": \"Bonn\",\n      \"area_code\": null,\n      \"country\": \"DE\"\n    },\n    \"formatted_address\": \"Adenauerallee 1, 53113 Bonn, DE\",\n    \"quantity\": 1,\n    \"prefix\": null,\n    \"numbers\": [],\n    \"phone_numbers\": [],\n    \"error_message\": \"Nexus rejected the request with status 422\",\n    \"webhook_url\": \"https://your-app.example/hooks/number-order\",\n    \"webhook_status\": \"not_required\",\n    \"webhook_next_retry_at\": null,\n    \"created_at\": \"2026-05-12T10:36:47+00:00\",\n    \"updated_at\": \"2026-05-12T10:36:47+00:00\"\n  }\n}"}],"_postman_id":"d03c2a12-9987-426f-b765-8c4901fd8bf3"},{"name":"Get a phone number order","id":"93d80c3b-274d-462d-846a-38a5913872b9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":"{{baseUrl}}/{{version}}/numbers/orders/:id","description":"<p>Retrieve the current state of a phone number order. The order outcome\n(assigned numbers on success, or the rejection reason) can be fetched here\nif you cannot accept the webhook callback, and it also lets you inspect a\npast order's audit trail.</p>\n<hr />\n<h2 id=\"request\">Request</h2>\n<p><strong>Path parameters</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Required</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>yes</td>\n<td>format: <code>uuid</code></td>\n<td>Order UUID returned by <code>POST /numbers/orders</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"responses\">Responses</h2>\n<h3 id=\"200--ok\"><code>200</code> — OK</h3>\n<p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>Internal order id assigned by us. Use this with <code>GET /numbers/orders/{id}</code><br />to fetch the latest state. NOT the value echoed in the asynchronous<br />webhook payload - that one is <code>order_id</code> (your own reference).<br /></td>\n</tr>\n<tr>\n<td><code>order_id</code></td>\n<td>string</td>\n<td>maxLength: <code>64</code>; nullable</td>\n<td>Your customer reference, supplied via the <code>order_id</code> field in<br /><code>POST /numbers/orders</code> (or <code>POST /numbers/orders/{id}</code>). Echoed back here,<br />in <code>GET /numbers/orders/{id}</code>, and at the top level of the asynchronous<br />webhook payload (which is this same object) as <code>order_id</code>.<br /></td>\n</tr>\n<tr>\n<td><code>customer_name</code></td>\n<td>string</td>\n<td>—</td>\n<td>Legal name of the customer the numbers were ordered for, as supplied on<br />create (and editable on retry).<br /></td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>enum: <code>created</code>, <code>requested</code>, <code>submission_failed</code>, <code>processing</code>, <code>success</code>, <code>error</code>, <code>processing_failed</code></td>\n<td>Lifecycle state of this order.<br /> * <code>requested</code> — sent upstream, awaiting fulfilment.<br /> * <code>submission_failed</code> — rejected during synchronous submission; editable + retryable.<br /> * <code>processing</code> — async success callback received; provisioning in progress.<br /> * <code>success</code> — provisioning complete; <code>numbers</code> is populated.<br /> * <code>error</code> — async rejection; terminal.<br /> * <code>processing_failed</code> — internal processing exhausted retries; admin-only retry.<br /></td>\n</tr>\n<tr>\n<td><code>address</code></td>\n<td>object</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.street</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.street_number</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.postal_code</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.city</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.area_code</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Country-conditional (e.g. set for CH); null otherwise.</td>\n</tr>\n<tr>\n<td><code>address.country</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>formatted_address</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Single-line, comma-separated address derived from the persisted<br />components (street + number, postal code + city, country). Empty<br />components are dropped.<br /></td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>integer</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>prefix</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Dial prefix in E.164 (country + area code if applicable).</td>\n</tr>\n<tr>\n<td><code>numbers</code></td>\n<td>array</td>\n<td>—</td>\n<td>E.164-formatted numbers assigned to this order. Empty (<code>[]</code>) until the<br />order reaches <code>success</code> - they are never returned synchronously by<br /><code>POST /numbers/orders</code> (which only ever returns <code>requested</code>); they arrive<br />later via the webhook and then appear here on <code>GET /numbers/orders/{id}</code>.<br /></td>\n</tr>\n<tr>\n<td><code>phone_numbers</code></td>\n<td>array</td>\n<td>—</td>\n<td>The assigned numbers, in the same shape as <code>GET /numbers</code><br />(id, number, name, is_active, call_flow), so you can read each number's id<br />and current call flow and act on it directly (e.g. <code>PUT /numbers/{id}/call-flow</code>).<br />Populated once the order reaches <code>success</code>.<br /></td>\n</tr>\n<tr>\n<td><code>phone_numbers[].id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].number</code></td>\n<td>string</td>\n<td>—</td>\n<td>Phone number in E.164 format.</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].name</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].is_active</code></td>\n<td>boolean</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].call_flow_id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code>; nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].call_flow</code></td>\n<td>object</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].call_flow.id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].call_flow.name</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].call_flow.enabled</code></td>\n<td>boolean</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>error_message</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Short error reason when status is <code>error</code> or <code>submission_failed</code>.</td>\n</tr>\n<tr>\n<td><code>webhook_url</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>The webhook URL we will POST the final outcome to.</td>\n</tr>\n<tr>\n<td><code>webhook_status</code></td>\n<td>string</td>\n<td>enum: <code>not_required</code>, <code>pending</code>, <code>retrying</code>, <code>delivered</code>, <code>failed</code>, <code>cancelled</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>webhook_next_retry_at</code></td>\n<td>string</td>\n<td>format: <code>date-time</code>; nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>created_at</code></td>\n<td>string</td>\n<td>format: <code>date-time</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>updated_at</code></td>\n<td>string</td>\n<td>format: <code>date-time</code></td>\n<td>—</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"401--authorization-token-missing-this-error-is-returned-when-the-authorization-token-is-missing\"><code>401</code> — Authorization Token Missing <br />This error is returned when the authorization token is missing.</h3>\n<p><strong>Headers</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Type</th>\n<th>Example</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Cache-Control</code></td>\n<td>string</td>\n<td><code>private, must-revalidate</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Connection</code></td>\n<td>string</td>\n<td><code>keep-alive</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td>string</td>\n<td><code>application/json</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Vary</code></td>\n<td>string</td>\n<td><code>Origin</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Limit</code></td>\n<td>integer</td>\n<td><code>60</code></td>\n<td>Max requests allowed in the current rate-limit window.</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Remaining</code></td>\n<td>integer</td>\n<td><code>57</code></td>\n<td>Requests remaining in the current rate-limit window.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>error</code></td>\n<td>string</td>\n<td>—</td>\n<td>Error message</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"404--order-not-found-in-the-callers-pbx\"><code>404</code> — Order not found in the caller's PBX.</h3>\n","urlObject":{"path":["{{version}}","numbers","orders",":id"],"host":["{{baseUrl}}"],"query":[],"variable":[{"id":"eb16512e-ec6f-42fc-9c3c-cbcd03aafcf7","description":{"content":"<p>Order UUID returned by <code>POST /numbers/orders</code>.</p>\n","type":"text/plain"},"type":"any","value":"550e8400-e29b-41d4-a716-446655440000","key":"id"}]}},"response":[{"id":"e789b7a8-1103-421c-b267-f4a09ae427ef","name":"200 — OK","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/{{version}}/numbers/orders/:id","host":["{{baseUrl}}"],"path":["{{version}}","numbers","orders",":id"],"variable":[{"key":"id","value":"550e8400-e29b-41d4-a716-446655440000","description":"Order UUID returned by `POST /numbers/orders`."}]},"description":"Retrieve the current state of a phone number order. The order outcome\n(assigned numbers on success, or the rejection reason) can be fetched here\nif you cannot accept the webhook callback, and it also lets you inspect a\npast order's audit trail.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"order_id\": \"po-2026-00042\",\n  \"customer_name\": \"ACME GmbH\",\n  \"status\": \"requested\",\n  \"address\": {\n    \"street\": \"Adenauerallee\",\n    \"street_number\": \"1\",\n    \"postal_code\": \"53113\",\n    \"city\": \"Bonn\",\n    \"area_code\": null,\n    \"country\": \"DE\"\n  },\n  \"formatted_address\": \"Adenauerallee 1, 53113 Bonn, DE\",\n  \"quantity\": 1,\n  \"prefix\": \"+49228\",\n  \"numbers\": [\n    \"+4922812345678\"\n  ],\n  \"phone_numbers\": [\n    {\n      \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n      \"number\": \"+12125550100\",\n      \"name\": \"Customer Support\",\n      \"is_active\": true,\n      \"call_flow_id\": \"550e8400-e29b-41d4-a716-446655440100\",\n      \"call_flow\": {\n        \"id\": null,\n        \"name\": null,\n        \"enabled\": null\n      }\n    }\n  ],\n  \"error_message\": null,\n  \"webhook_url\": null,\n  \"webhook_status\": null,\n  \"webhook_next_retry_at\": null,\n  \"created_at\": null,\n  \"updated_at\": null\n}"},{"id":"cab85653-a46c-47f5-b543-3185326109e5","name":"401 — Authorization Token Missing This error is returned when the authorization token is missing.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/{{version}}/numbers/orders/:id","host":["{{baseUrl}}"],"path":["{{version}}","numbers","orders",":id"],"variable":[{"key":"id","value":"550e8400-e29b-41d4-a716-446655440000","description":"Order UUID returned by `POST /numbers/orders`."}]},"description":"Retrieve the current state of a phone number order. The order outcome\n(assigned numbers on success, or the rejection reason) can be fetched here\nif you cannot accept the webhook callback, and it also lets you inspect a\npast order's audit trail.\n"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Cache-Control","value":"private, must-revalidate","description":""},{"key":"Connection","value":"keep-alive","description":""},{"key":"Vary","value":"Origin","description":""},{"key":"X-RateLimit-Limit","value":"60","description":"Max requests allowed in the current rate-limit window."},{"key":"X-RateLimit-Remaining","value":"57","description":"Requests remaining in the current rate-limit window."}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Authorization Token is missing\"\n}"},{"id":"476bc57f-df8d-4384-83bd-a03de0ad57ea","name":"404 — Order not found in the caller's PBX.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/{{version}}/numbers/orders/:id","host":["{{baseUrl}}"],"path":["{{version}}","numbers","orders",":id"],"variable":[{"key":"id","value":"550e8400-e29b-41d4-a716-446655440000","description":"Order UUID returned by `POST /numbers/orders`."}]},"description":"Retrieve the current state of a phone number order. The order outcome\n(assigned numbers on success, or the rejection reason) can be fetched here\nif you cannot accept the webhook callback, and it also lets you inspect a\npast order's audit trail.\n"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"text/plain"}],"cookie":[],"responseTime":null,"body":"Order not found in the caller's PBX."}],"_postman_id":"93d80c3b-274d-462d-846a-38a5913872b9"},{"name":"Edit and retry a failed phone number order","id":"55f645f8-5842-4456-a83c-3bd37441e6fe","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"customer_name","type":"text","description":"<p>Legal name of the customer. Required and editable on retry;\nforwarded to the carrier, which may validate it.</p>\n","value":"ACME GmbH"},{"key":"street","type":"text","value":""},{"key":"street_number","type":"text","value":""},{"key":"postal_code","type":"text","value":""},{"key":"city","type":"text","value":""},{"key":"area_code","type":"text","description":"<p>Country-conditional. Required when the order's (locked) country\nneeds it - e.g. Switzerland (<code>CH</code>), where it would be something like\n<code>43</code> - and rejected (422) otherwise.</p>\n","value":"","disabled":true},{"key":"quantity","type":"text","value":""},{"key":"webhook","type":"text","value":"","disabled":true},{"key":"order_id","type":"text","description":"<p>Optional customer reference (max 64 chars). Editable on retry -\nsend a new value to change it, or an empty string to clear it.\nEchoed back in the response, in <code>GET /numbers/orders/{id}</code>, and\nat the top level of the asynchronous webhook payload as <code>order_id</code>\n(the webhook body is the same order object).</p>\n","value":"po-2026-00042","disabled":true},{"key":"kyc","type":"text","description":"<p>KYC documents, one entry per <code>documentType</code> returned by\n<code>POST /numbers/orders/check</code> for the country. Send file documents\nas a file part <code>kyc[&lt;documentType&gt;]</code> and identifier-only documents\nas a form field <code>kyc[&lt;documentType&gt;]=&lt;value&gt;</code>. Accepted file MIME\ntypes: <code>application/pdf</code>, <code>image/jpeg</code>, <code>image/png</code>. Example shape:</p>\n<ul>\n<li><code>kyc[utility_bill]</code> - file part carrying <code>bill.pdf</code></li>\n<li><code>kyc[id_document]</code> - file part carrying <code>passport.jpg</code></li>\n<li><code>kyc[business_registration_number]=BE-12345</code> - form field</li>\n</ul>\n<p>For an OR group returned by the check endpoint (an array of types),\nprovide any one of the listed <code>documentType</code>s. Re-send the KYC\ndocuments you want on the retried order; on submission_failed\nretries the carrier re-validates them.</p>\n","value":"","disabled":true}]},"url":"{{baseUrl}}/{{version}}/numbers/orders/:id","description":"<p>Edit selected fields of a <code>submission_failed</code> order and re-submit it\nupstream. Same multipart contract as <code>POST /numbers/orders</code>.</p>\n<p>Uses <code>POST</code> (not <code>PUT</code>) on purpose: the body is <code>multipart/form-data</code>, and\nmany server runtimes only parse a multipart body when the method is <code>POST</code> -\non <code>PUT</code> the fields and files arrive empty. Send this edit as a plain <code>POST</code>.</p>\n<p>Constraints:</p>\n<ul>\n<li>Only orders with status <code>submission_failed</code> can be edited.</li>\n<li><code>country</code> is frozen. You may re-send it with the same value (handy when\nyou echo back the whole order), but <em>changing</em> it returns <code>422</code> - order in\na different country by creating a new order. Omitting it is also fine.</li>\n</ul>\n<p><code>customer_name</code> and <code>order_id</code> are editable here: send new values to change\nthem, or send an empty <code>order_id</code> to clear your reference.</p>\n<p>If the edited address yields different KYC requirements upstream, the\nresponse will be <code>422</code> carrying the new requirements; resubmit again with\nthe matching KYC fields.</p>\n<hr />\n<h2 id=\"request\">Request</h2>\n<p><strong>Path parameters</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Type</th>\n<th>Required</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>yes</td>\n<td>format: <code>uuid</code></td>\n<td>—</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Request body</strong> — <code>multipart/form-data</code>  <em>(required)</em></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>customer_name</code></td>\n<td>string</td>\n<td>yes</td>\n<td>maxLength: <code>255</code></td>\n<td>Legal name of the customer. Required and editable on retry;<br />forwarded to the carrier, which may validate it.<br /></td>\n</tr>\n<tr>\n<td><code>street</code></td>\n<td>string</td>\n<td>yes</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>street_number</code></td>\n<td>string</td>\n<td>yes</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>postal_code</code></td>\n<td>string</td>\n<td>yes</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>city</code></td>\n<td>string</td>\n<td>yes</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>area_code</code></td>\n<td>string</td>\n<td>no</td>\n<td>maxLength: <code>16</code>; nullable</td>\n<td>Country-conditional. Required when the order's (locked) country<br />needs it - e.g. Switzerland (<code>CH</code>), where it would be something like<br /><code>43</code> - and rejected (422) otherwise.<br /></td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>integer</td>\n<td>yes</td>\n<td>minimum: <code>1</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>webhook</code></td>\n<td>string</td>\n<td>no</td>\n<td>format: <code>uri</code>; nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>order_id</code></td>\n<td>string</td>\n<td>no</td>\n<td>maxLength: <code>64</code>; nullable</td>\n<td>Optional customer reference (max 64 chars). Editable on retry -<br />send a new value to change it, or an empty string to clear it.<br />Echoed back in the response, in <code>GET /numbers/orders/{id}</code>, and<br />at the top level of the asynchronous webhook payload as <code>order_id</code><br />(the webhook body is the same order object).<br /></td>\n</tr>\n<tr>\n<td><code>kyc</code></td>\n<td>object</td>\n<td>no</td>\n<td>—</td>\n<td>KYC documents, one entry per <code>documentType</code> returned by<br /><code>POST /numbers/orders/check</code> for the country. Send file documents<br />as a file part <code>kyc[&lt;documentType&gt;]</code> and identifier-only documents<br />as a form field <code>kyc[&lt;documentType&gt;]=&lt;value&gt;</code>. Accepted file MIME<br />types: <code>application/pdf</code>, <code>image/jpeg</code>, <code>image/png</code>. Example shape:<br /><br />  * <code>kyc[utility_bill]</code> - file part carrying <code>bill.pdf</code><br />  * <code>kyc[id_document]</code> - file part carrying <code>passport.jpg</code><br />  * <code>kyc[business_registration_number]=BE-12345</code> - form field<br /><br />For an OR group returned by the check endpoint (an array of types),<br />provide any one of the listed <code>documentType</code>s. Re-send the KYC<br />documents you want on the retried order; on submission_failed<br />retries the carrier re-validates them.<br /></td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h2 id=\"responses\">Responses</h2>\n<h3 id=\"200--order-re-submitted-upstream-successfully\"><code>200</code> — Order re-submitted upstream successfully.</h3>\n<p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>Internal order id assigned by us. Use this with <code>GET /numbers/orders/{id}</code><br />to fetch the latest state. NOT the value echoed in the asynchronous<br />webhook payload - that one is <code>order_id</code> (your own reference).<br /></td>\n</tr>\n<tr>\n<td><code>order_id</code></td>\n<td>string</td>\n<td>maxLength: <code>64</code>; nullable</td>\n<td>Your customer reference, supplied via the <code>order_id</code> field in<br /><code>POST /numbers/orders</code> (or <code>POST /numbers/orders/{id}</code>). Echoed back here,<br />in <code>GET /numbers/orders/{id}</code>, and at the top level of the asynchronous<br />webhook payload (which is this same object) as <code>order_id</code>.<br /></td>\n</tr>\n<tr>\n<td><code>customer_name</code></td>\n<td>string</td>\n<td>—</td>\n<td>Legal name of the customer the numbers were ordered for, as supplied on<br />create (and editable on retry).<br /></td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>enum: <code>created</code>, <code>requested</code>, <code>submission_failed</code>, <code>processing</code>, <code>success</code>, <code>error</code>, <code>processing_failed</code></td>\n<td>Lifecycle state of this order.<br /> * <code>requested</code> — sent upstream, awaiting fulfilment.<br /> * <code>submission_failed</code> — rejected during synchronous submission; editable + retryable.<br /> * <code>processing</code> — async success callback received; provisioning in progress.<br /> * <code>success</code> — provisioning complete; <code>numbers</code> is populated.<br /> * <code>error</code> — async rejection; terminal.<br /> * <code>processing_failed</code> — internal processing exhausted retries; admin-only retry.<br /></td>\n</tr>\n<tr>\n<td><code>address</code></td>\n<td>object</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.street</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.street_number</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.postal_code</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.city</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>address.area_code</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Country-conditional (e.g. set for CH); null otherwise.</td>\n</tr>\n<tr>\n<td><code>address.country</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>formatted_address</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Single-line, comma-separated address derived from the persisted<br />components (street + number, postal code + city, country). Empty<br />components are dropped.<br /></td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>integer</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>prefix</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Dial prefix in E.164 (country + area code if applicable).</td>\n</tr>\n<tr>\n<td><code>numbers</code></td>\n<td>array</td>\n<td>—</td>\n<td>E.164-formatted numbers assigned to this order. Empty (<code>[]</code>) until the<br />order reaches <code>success</code> - they are never returned synchronously by<br /><code>POST /numbers/orders</code> (which only ever returns <code>requested</code>); they arrive<br />later via the webhook and then appear here on <code>GET /numbers/orders/{id}</code>.<br /></td>\n</tr>\n<tr>\n<td><code>phone_numbers</code></td>\n<td>array</td>\n<td>—</td>\n<td>The assigned numbers, in the same shape as <code>GET /numbers</code><br />(id, number, name, is_active, call_flow), so you can read each number's id<br />and current call flow and act on it directly (e.g. <code>PUT /numbers/{id}/call-flow</code>).<br />Populated once the order reaches <code>success</code>.<br /></td>\n</tr>\n<tr>\n<td><code>phone_numbers[].id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].number</code></td>\n<td>string</td>\n<td>—</td>\n<td>Phone number in E.164 format.</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].name</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].is_active</code></td>\n<td>boolean</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].call_flow_id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code>; nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].call_flow</code></td>\n<td>object</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].call_flow.id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].call_flow.name</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone_numbers[].call_flow.enabled</code></td>\n<td>boolean</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>error_message</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Short error reason when status is <code>error</code> or <code>submission_failed</code>.</td>\n</tr>\n<tr>\n<td><code>webhook_url</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>The webhook URL we will POST the final outcome to.</td>\n</tr>\n<tr>\n<td><code>webhook_status</code></td>\n<td>string</td>\n<td>enum: <code>not_required</code>, <code>pending</code>, <code>retrying</code>, <code>delivered</code>, <code>failed</code>, <code>cancelled</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>webhook_next_retry_at</code></td>\n<td>string</td>\n<td>format: <code>date-time</code>; nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>created_at</code></td>\n<td>string</td>\n<td>format: <code>date-time</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>updated_at</code></td>\n<td>string</td>\n<td>format: <code>date-time</code></td>\n<td>—</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"401--authorization-token-missing-this-error-is-returned-when-the-authorization-token-is-missing\"><code>401</code> — Authorization Token Missing <br />This error is returned when the authorization token is missing.</h3>\n<p><strong>Headers</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Type</th>\n<th>Example</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Cache-Control</code></td>\n<td>string</td>\n<td><code>private, must-revalidate</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Connection</code></td>\n<td>string</td>\n<td><code>keep-alive</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td>string</td>\n<td><code>application/json</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>Vary</code></td>\n<td>string</td>\n<td><code>Origin</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Limit</code></td>\n<td>integer</td>\n<td><code>60</code></td>\n<td>Max requests allowed in the current rate-limit window.</td>\n</tr>\n<tr>\n<td><code>X-RateLimit-Remaining</code></td>\n<td>integer</td>\n<td><code>57</code></td>\n<td>Requests remaining in the current rate-limit window.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>error</code></td>\n<td>string</td>\n<td>—</td>\n<td>Error message</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"403--the-order-was-created-from-a-different-source-eg-the-cockpit-ui-and\"><code>403</code> — The order was created from a different source (e.g. the Cockpit UI) and</h3>\n<p>The order was created from a different source (e.g. the Cockpit UI) and\ncannot be retried via the API. Not field-specific, so the body is just a\n<code>message</code>.</p>\n<p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>message</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"404--order-not-found-in-the-callers-pbx\"><code>404</code> — Order not found in the caller's PBX.</h3>\n<h3 id=\"409--the-order-is-not-in-submission_failed-state-so-it-cannot-be-edited-or\"><code>409</code> — The order is not in <code>submission_failed</code> state, so it cannot be edited or</h3>\n<p>The order is not in <code>submission_failed</code> state, so it cannot be edited or\nretried. Not field-specific, so the body is just a <code>message</code> (the current\nstatus is included in it).</p>\n<p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>message</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"422--validation-failed-errors-maps-each-rejected-field-to-its-messages\"><code>422</code> — Validation failed. <code>errors</code> maps each rejected field to its messages</h3>\n<p>Validation failed. <code>errors</code> maps each rejected field to its messages\n(including an attempt to <em>change</em> the locked <code>country</code>).</p>\n<p>If the carrier rejected the retried order, it stays as a retryable\n<code>submission_failed</code> order and is returned in <code>data</code> (the full order, same\nshape as <code>GET /numbers/orders/{id}</code>); use <code>data.id</code> to edit + retry it via\n<code>POST /numbers/orders/{id}</code>. When <code>data</code> is absent, the failure was local\nvalidation only.</p>\n<p><strong>Body</strong> — <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Constraints</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>message</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>errors</code></td>\n<td>object</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data</code></td>\n<td>object</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>Internal order id assigned by us. Use this with <code>GET /numbers/orders/{id}</code><br />to fetch the latest state. NOT the value echoed in the asynchronous<br />webhook payload - that one is <code>order_id</code> (your own reference).<br /></td>\n</tr>\n<tr>\n<td><code>data.order_id</code></td>\n<td>string</td>\n<td>maxLength: <code>64</code>; nullable</td>\n<td>Your customer reference, supplied via the <code>order_id</code> field in<br /><code>POST /numbers/orders</code> (or <code>POST /numbers/orders/{id}</code>). Echoed back here,<br />in <code>GET /numbers/orders/{id}</code>, and at the top level of the asynchronous<br />webhook payload (which is this same object) as <code>order_id</code>.<br /></td>\n</tr>\n<tr>\n<td><code>data.customer_name</code></td>\n<td>string</td>\n<td>—</td>\n<td>Legal name of the customer the numbers were ordered for, as supplied on<br />create (and editable on retry).<br /></td>\n</tr>\n<tr>\n<td><code>data.status</code></td>\n<td>string</td>\n<td>enum: <code>created</code>, <code>requested</code>, <code>submission_failed</code>, <code>processing</code>, <code>success</code>, <code>error</code>, <code>processing_failed</code></td>\n<td>Lifecycle state of this order.<br /> * <code>requested</code> — sent upstream, awaiting fulfilment.<br /> * <code>submission_failed</code> — rejected during synchronous submission; editable + retryable.<br /> * <code>processing</code> — async success callback received; provisioning in progress.<br /> * <code>success</code> — provisioning complete; <code>numbers</code> is populated.<br /> * <code>error</code> — async rejection; terminal.<br /> * <code>processing_failed</code> — internal processing exhausted retries; admin-only retry.<br /></td>\n</tr>\n<tr>\n<td><code>data.address</code></td>\n<td>object</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.address.street</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.address.street_number</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.address.postal_code</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.address.city</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.address.area_code</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Country-conditional (e.g. set for CH); null otherwise.</td>\n</tr>\n<tr>\n<td><code>data.address.country</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.formatted_address</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Single-line, comma-separated address derived from the persisted<br />components (street + number, postal code + city, country). Empty<br />components are dropped.<br /></td>\n</tr>\n<tr>\n<td><code>data.quantity</code></td>\n<td>integer</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.prefix</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Dial prefix in E.164 (country + area code if applicable).</td>\n</tr>\n<tr>\n<td><code>data.numbers</code></td>\n<td>array</td>\n<td>—</td>\n<td>E.164-formatted numbers assigned to this order. Empty (<code>[]</code>) until the<br />order reaches <code>success</code> - they are never returned synchronously by<br /><code>POST /numbers/orders</code> (which only ever returns <code>requested</code>); they arrive<br />later via the webhook and then appear here on <code>GET /numbers/orders/{id}</code>.<br /></td>\n</tr>\n<tr>\n<td><code>data.phone_numbers</code></td>\n<td>array</td>\n<td>—</td>\n<td>The assigned numbers, in the same shape as <code>GET /numbers</code><br />(id, number, name, is_active, call_flow), so you can read each number's id<br />and current call flow and act on it directly (e.g. <code>PUT /numbers/{id}/call-flow</code>).<br />Populated once the order reaches <code>success</code>.<br /></td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].number</code></td>\n<td>string</td>\n<td>—</td>\n<td>Phone number in E.164 format.</td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].name</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].is_active</code></td>\n<td>boolean</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].call_flow_id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code>; nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].call_flow</code></td>\n<td>object</td>\n<td>nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].call_flow.id</code></td>\n<td>string</td>\n<td>format: <code>uuid</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].call_flow.name</code></td>\n<td>string</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.phone_numbers[].call_flow.enabled</code></td>\n<td>boolean</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.error_message</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>Short error reason when status is <code>error</code> or <code>submission_failed</code>.</td>\n</tr>\n<tr>\n<td><code>data.webhook_url</code></td>\n<td>string</td>\n<td>nullable</td>\n<td>The webhook URL we will POST the final outcome to.</td>\n</tr>\n<tr>\n<td><code>data.webhook_status</code></td>\n<td>string</td>\n<td>enum: <code>not_required</code>, <code>pending</code>, <code>retrying</code>, <code>delivered</code>, <code>failed</code>, <code>cancelled</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.webhook_next_retry_at</code></td>\n<td>string</td>\n<td>format: <code>date-time</code>; nullable</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.created_at</code></td>\n<td>string</td>\n<td>format: <code>date-time</code></td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>data.updated_at</code></td>\n<td>string</td>\n<td>format: <code>date-time</code></td>\n<td>—</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["{{version}}","numbers","orders",":id"],"host":["{{baseUrl}}"],"query":[],"variable":[{"id":"114465aa-54c3-4c3a-92be-82480178324c","type":"any","value":"550e8400-e29b-41d4-a716-446655440000","key":"id"}]}},"response":[{"id":"a9e69ce5-61c6-40fd-b7f3-f5faeb953480","name":"200 — Order re-submitted upstream successfully.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"customer_name","type":"text","description":"Legal name of the customer. Required and editable on retry;\nforwarded to the carrier, which may validate it.\n","value":"ACME GmbH"},{"key":"street","type":"text","value":""},{"key":"street_number","type":"text","value":""},{"key":"postal_code","type":"text","value":""},{"key":"city","type":"text","value":""},{"key":"area_code","type":"text","description":"Country-conditional. Required when the order's (locked) country\nneeds it - e.g. Switzerland (`CH`), where it would be something like\n`43` - and rejected (422) otherwise.\n","value":"","disabled":true},{"key":"quantity","type":"text","value":""},{"key":"webhook","type":"text","value":"","disabled":true},{"key":"order_id","type":"text","description":"Optional customer reference (max 64 chars). Editable on retry -\nsend a new value to change it, or an empty string to clear it.\nEchoed back in the response, in `GET /numbers/orders/{id}`, and\nat the top level of the asynchronous webhook payload as `order_id`\n(the webhook body is the same order object).\n","value":"po-2026-00042","disabled":true},{"key":"kyc","type":"text","description":"KYC documents, one entry per `documentType` returned by\n`POST /numbers/orders/check` for the country. Send file documents\nas a file part `kyc[<documentType>]` and identifier-only documents\nas a form field `kyc[<documentType>]=<value>`. Accepted file MIME\ntypes: `application/pdf`, `image/jpeg`, `image/png`. Example shape:\n\n  * `kyc[utility_bill]` - file part carrying `bill.pdf`\n  * `kyc[id_document]` - file part carrying `passport.jpg`\n  * `kyc[business_registration_number]=BE-12345` - form field\n\nFor an OR group returned by the check endpoint (an array of types),\nprovide any one of the listed `documentType`s. Re-send the KYC\ndocuments you want on the retried order; on submission_failed\nretries the carrier re-validates them.\n","value":"","disabled":true}]},"url":{"raw":"{{baseUrl}}/{{version}}/numbers/orders/:id","host":["{{baseUrl}}"],"path":["{{version}}","numbers","orders",":id"],"variable":[{"key":"id","value":"550e8400-e29b-41d4-a716-446655440000"}]},"description":"Edit selected fields of a `submission_failed` order and re-submit it\nupstream. Same multipart contract as `POST /numbers/orders`.\n\nUses `POST` (not `PUT`) on purpose: the body is `multipart/form-data`, and\nmany server runtimes only parse a multipart body when the method is `POST` -\non `PUT` the fields and files arrive empty. Send this edit as a plain `POST`.\n\nConstraints:\n- Only orders with status `submission_failed` can be edited.\n- `country` is frozen. You may re-send it with the same value (handy when\n  you echo back the whole order), but *changing* it returns `422` - order in\n  a different country by creating a new order. Omitting it is also fine.\n\n`customer_name` and `order_id` are editable here: send new values to change\nthem, or send an empty `order_id` to clear your reference.\n\nIf the edited address yields different KYC requirements upstream, the\nresponse will be `422` carrying the new requirements; resubmit again with\nthe matching KYC fields.\n"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"order_id\": \"po-2026-00042\",\n  \"customer_name\": \"ACME GmbH\",\n  \"status\": \"requested\",\n  \"address\": {\n    \"street\": \"Adenauerallee\",\n    \"street_number\": \"1\",\n    \"postal_code\": \"53113\",\n    \"city\": \"Bonn\",\n    \"area_code\": null,\n    \"country\": \"DE\"\n  },\n  \"formatted_address\": \"Adenauerallee 1, 53113 Bonn, DE\",\n  \"quantity\": 1,\n  \"prefix\": \"+49228\",\n  \"numbers\": [\n    \"+4922812345678\"\n  ],\n  \"phone_numbers\": [\n    {\n      \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n      \"number\": \"+12125550100\",\n      \"name\": \"Customer Support\",\n      \"is_active\": true,\n      \"call_flow_id\": \"550e8400-e29b-41d4-a716-446655440100\",\n      \"call_flow\": {\n        \"id\": null,\n        \"name\": null,\n        \"enabled\": null\n      }\n    }\n  ],\n  \"error_message\": null,\n  \"webhook_url\": null,\n  \"webhook_status\": null,\n  \"webhook_next_retry_at\": null,\n  \"created_at\": null,\n  \"updated_at\": null\n}"},{"id":"3d60bb3b-e5af-4acc-8768-1c5a295ea678","name":"401 — Authorization Token Missing This error is returned when the authorization token is missing.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"customer_name","type":"text","description":"Legal name of the customer. Required and editable on retry;\nforwarded to the carrier, which may validate it.\n","value":"ACME GmbH"},{"key":"street","type":"text","value":""},{"key":"street_number","type":"text","value":""},{"key":"postal_code","type":"text","value":""},{"key":"city","type":"text","value":""},{"key":"area_code","type":"text","description":"Country-conditional. Required when the order's (locked) country\nneeds it - e.g. Switzerland (`CH`), where it would be something like\n`43` - and rejected (422) otherwise.\n","value":"","disabled":true},{"key":"quantity","type":"text","value":""},{"key":"webhook","type":"text","value":"","disabled":true},{"key":"order_id","type":"text","description":"Optional customer reference (max 64 chars). Editable on retry -\nsend a new value to change it, or an empty string to clear it.\nEchoed back in the response, in `GET /numbers/orders/{id}`, and\nat the top level of the asynchronous webhook payload as `order_id`\n(the webhook body is the same order object).\n","value":"po-2026-00042","disabled":true},{"key":"kyc","type":"text","description":"KYC documents, one entry per `documentType` returned by\n`POST /numbers/orders/check` for the country. Send file documents\nas a file part `kyc[<documentType>]` and identifier-only documents\nas a form field `kyc[<documentType>]=<value>`. Accepted file MIME\ntypes: `application/pdf`, `image/jpeg`, `image/png`. Example shape:\n\n  * `kyc[utility_bill]` - file part carrying `bill.pdf`\n  * `kyc[id_document]` - file part carrying `passport.jpg`\n  * `kyc[business_registration_number]=BE-12345` - form field\n\nFor an OR group returned by the check endpoint (an array of types),\nprovide any one of the listed `documentType`s. Re-send the KYC\ndocuments you want on the retried order; on submission_failed\nretries the carrier re-validates them.\n","value":"","disabled":true}]},"url":{"raw":"{{baseUrl}}/{{version}}/numbers/orders/:id","host":["{{baseUrl}}"],"path":["{{version}}","numbers","orders",":id"],"variable":[{"key":"id","value":"550e8400-e29b-41d4-a716-446655440000"}]},"description":"Edit selected fields of a `submission_failed` order and re-submit it\nupstream. Same multipart contract as `POST /numbers/orders`.\n\nUses `POST` (not `PUT`) on purpose: the body is `multipart/form-data`, and\nmany server runtimes only parse a multipart body when the method is `POST` -\non `PUT` the fields and files arrive empty. Send this edit as a plain `POST`.\n\nConstraints:\n- Only orders with status `submission_failed` can be edited.\n- `country` is frozen. You may re-send it with the same value (handy when\n  you echo back the whole order), but *changing* it returns `422` - order in\n  a different country by creating a new order. Omitting it is also fine.\n\n`customer_name` and `order_id` are editable here: send new values to change\nthem, or send an empty `order_id` to clear your reference.\n\nIf the edited address yields different KYC requirements upstream, the\nresponse will be `422` carrying the new requirements; resubmit again with\nthe matching KYC fields.\n"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"key":"Cache-Control","value":"private, must-revalidate","description":""},{"key":"Connection","value":"keep-alive","description":""},{"key":"Vary","value":"Origin","description":""},{"key":"X-RateLimit-Limit","value":"60","description":"Max requests allowed in the current rate-limit window."},{"key":"X-RateLimit-Remaining","value":"57","description":"Requests remaining in the current rate-limit window."}],"cookie":[],"responseTime":null,"body":"{\n  \"error\": \"Authorization Token is missing\"\n}"},{"id":"b8240699-e8fe-428e-b528-e9c15cf00778","name":"403 — The order was created from a different source (e.g. the Cockpit UI) and cannot be retried via the API. Not field-specific, so the body is just a `message`.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"customer_name","type":"text","description":"Legal name of the customer. Required and editable on retry;\nforwarded to the carrier, which may validate it.\n","value":"ACME GmbH"},{"key":"street","type":"text","value":""},{"key":"street_number","type":"text","value":""},{"key":"postal_code","type":"text","value":""},{"key":"city","type":"text","value":""},{"key":"area_code","type":"text","description":"Country-conditional. Required when the order's (locked) country\nneeds it - e.g. Switzerland (`CH`), where it would be something like\n`43` - and rejected (422) otherwise.\n","value":"","disabled":true},{"key":"quantity","type":"text","value":""},{"key":"webhook","type":"text","value":"","disabled":true},{"key":"order_id","type":"text","description":"Optional customer reference (max 64 chars). Editable on retry -\nsend a new value to change it, or an empty string to clear it.\nEchoed back in the response, in `GET /numbers/orders/{id}`, and\nat the top level of the asynchronous webhook payload as `order_id`\n(the webhook body is the same order object).\n","value":"po-2026-00042","disabled":true},{"key":"kyc","type":"text","description":"KYC documents, one entry per `documentType` returned by\n`POST /numbers/orders/check` for the country. Send file documents\nas a file part `kyc[<documentType>]` and identifier-only documents\nas a form field `kyc[<documentType>]=<value>`. Accepted file MIME\ntypes: `application/pdf`, `image/jpeg`, `image/png`. Example shape:\n\n  * `kyc[utility_bill]` - file part carrying `bill.pdf`\n  * `kyc[id_document]` - file part carrying `passport.jpg`\n  * `kyc[business_registration_number]=BE-12345` - form field\n\nFor an OR group returned by the check endpoint (an array of types),\nprovide any one of the listed `documentType`s. Re-send the KYC\ndocuments you want on the retried order; on submission_failed\nretries the carrier re-validates them.\n","value":"","disabled":true}]},"url":{"raw":"{{baseUrl}}/{{version}}/numbers/orders/:id","host":["{{baseUrl}}"],"path":["{{version}}","numbers","orders",":id"],"variable":[{"key":"id","value":"550e8400-e29b-41d4-a716-446655440000"}]},"description":"Edit selected fields of a `submission_failed` order and re-submit it\nupstream. Same multipart contract as `POST /numbers/orders`.\n\nUses `POST` (not `PUT`) on purpose: the body is `multipart/form-data`, and\nmany server runtimes only parse a multipart body when the method is `POST` -\non `PUT` the fields and files arrive empty. Send this edit as a plain `POST`.\n\nConstraints:\n- Only orders with status `submission_failed` can be edited.\n- `country` is frozen. You may re-send it with the same value (handy when\n  you echo back the whole order), but *changing* it returns `422` - order in\n  a different country by creating a new order. Omitting it is also fine.\n\n`customer_name` and `order_id` are editable here: send new values to change\nthem, or send an empty `order_id` to clear your reference.\n\nIf the edited address yields different KYC requirements upstream, the\nresponse will be `422` carrying the new requirements; resubmit again with\nthe matching KYC fields.\n"},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"This order was not created via the API; retries must be initiated from the Cockpit UI.\"\n}"},{"id":"7b9ed291-98c4-4a68-aef1-3680e847afb0","name":"404 — Order not found in the caller's PBX.","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"customer_name","type":"text","description":"Legal name of the customer. Required and editable on retry;\nforwarded to the carrier, which may validate it.\n","value":"ACME GmbH"},{"key":"street","type":"text","value":""},{"key":"street_number","type":"text","value":""},{"key":"postal_code","type":"text","value":""},{"key":"city","type":"text","value":""},{"key":"area_code","type":"text","description":"Country-conditional. Required when the order's (locked) country\nneeds it - e.g. Switzerland (`CH`), where it would be something like\n`43` - and rejected (422) otherwise.\n","value":"","disabled":true},{"key":"quantity","type":"text","value":""},{"key":"webhook","type":"text","value":"","disabled":true},{"key":"order_id","type":"text","description":"Optional customer reference (max 64 chars). Editable on retry -\nsend a new value to change it, or an empty string to clear it.\nEchoed back in the response, in `GET /numbers/orders/{id}`, and\nat the top level of the asynchronous webhook payload as `order_id`\n(the webhook body is the same order object).\n","value":"po-2026-00042","disabled":true},{"key":"kyc","type":"text","description":"KYC documents, one entry per `documentType` returned by\n`POST /numbers/orders/check` for the country. Send file documents\nas a file part `kyc[<documentType>]` and identifier-only documents\nas a form field `kyc[<documentType>]=<value>`. Accepted file MIME\ntypes: `application/pdf`, `image/jpeg`, `image/png`. Example shape:\n\n  * `kyc[utility_bill]` - file part carrying `bill.pdf`\n  * `kyc[id_document]` - file part carrying `passport.jpg`\n  * `kyc[business_registration_number]=BE-12345` - form field\n\nFor an OR group returned by the check endpoint (an array of types),\nprovide any one of the listed `documentType`s. Re-send the KYC\ndocuments you want on the retried order; on submission_failed\nretries the carrier re-validates them.\n","value":"","disabled":true}]},"url":{"raw":"{{baseUrl}}/{{version}}/numbers/orders/:id","host":["{{baseUrl}}"],"path":["{{version}}","numbers","orders",":id"],"variable":[{"key":"id","value":"550e8400-e29b-41d4-a716-446655440000"}]},"description":"Edit selected fields of a `submission_failed` order and re-submit it\nupstream. Same multipart contract as `POST /numbers/orders`.\n\nUses `POST` (not `PUT`) on purpose: the body is `multipart/form-data`, and\nmany server runtimes only parse a multipart body when the method is `POST` -\non `PUT` the fields and files arrive empty. Send this edit as a plain `POST`.\n\nConstraints:\n- Only orders with status `submission_failed` can be edited.\n- `country` is frozen. You may re-send it with the same value (handy when\n  you echo back the whole order), but *changing* it returns `422` - order in\n  a different country by creating a new order. Omitting it is also fine.\n\n`customer_name` and `order_id` are editable here: send new values to change\nthem, or send an empty `order_id` to clear your reference.\n\nIf the edited address yields different KYC requirements upstream, the\nresponse will be `422` carrying the new requirements; resubmit again with\nthe matching KYC fields.\n"},"status":"Not Found","code":404,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"text/plain"}],"cookie":[],"responseTime":null,"body":"Order not found in the caller's PBX."},{"id":"a6b41774-c50a-4c26-8463-e289debf857f","name":"409 — The order is not in `submission_failed` state, so it cannot be edited or retried. Not field-specific, so the body is just a `message` (the current status is included in it).","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"customer_name","type":"text","description":"Legal name of the customer. Required and editable on retry;\nforwarded to the carrier, which may validate it.\n","value":"ACME GmbH"},{"key":"street","type":"text","value":""},{"key":"street_number","type":"text","value":""},{"key":"postal_code","type":"text","value":""},{"key":"city","type":"text","value":""},{"key":"area_code","type":"text","description":"Country-conditional. Required when the order's (locked) country\nneeds it - e.g. Switzerland (`CH`), where it would be something like\n`43` - and rejected (422) otherwise.\n","value":"","disabled":true},{"key":"quantity","type":"text","value":""},{"key":"webhook","type":"text","value":"","disabled":true},{"key":"order_id","type":"text","description":"Optional customer reference (max 64 chars). Editable on retry -\nsend a new value to change it, or an empty string to clear it.\nEchoed back in the response, in `GET /numbers/orders/{id}`, and\nat the top level of the asynchronous webhook payload as `order_id`\n(the webhook body is the same order object).\n","value":"po-2026-00042","disabled":true},{"key":"kyc","type":"text","description":"KYC documents, one entry per `documentType` returned by\n`POST /numbers/orders/check` for the country. Send file documents\nas a file part `kyc[<documentType>]` and identifier-only documents\nas a form field `kyc[<documentType>]=<value>`. Accepted file MIME\ntypes: `application/pdf`, `image/jpeg`, `image/png`. Example shape:\n\n  * `kyc[utility_bill]` - file part carrying `bill.pdf`\n  * `kyc[id_document]` - file part carrying `passport.jpg`\n  * `kyc[business_registration_number]=BE-12345` - form field\n\nFor an OR group returned by the check endpoint (an array of types),\nprovide any one of the listed `documentType`s. Re-send the KYC\ndocuments you want on the retried order; on submission_failed\nretries the carrier re-validates them.\n","value":"","disabled":true}]},"url":{"raw":"{{baseUrl}}/{{version}}/numbers/orders/:id","host":["{{baseUrl}}"],"path":["{{version}}","numbers","orders",":id"],"variable":[{"key":"id","value":"550e8400-e29b-41d4-a716-446655440000"}]},"description":"Edit selected fields of a `submission_failed` order and re-submit it\nupstream. Same multipart contract as `POST /numbers/orders`.\n\nUses `POST` (not `PUT`) on purpose: the body is `multipart/form-data`, and\nmany server runtimes only parse a multipart body when the method is `POST` -\non `PUT` the fields and files arrive empty. Send this edit as a plain `POST`.\n\nConstraints:\n- Only orders with status `submission_failed` can be edited.\n- `country` is frozen. You may re-send it with the same value (handy when\n  you echo back the whole order), but *changing* it returns `422` - order in\n  a different country by creating a new order. Omitting it is also fine.\n\n`customer_name` and `order_id` are editable here: send new values to change\nthem, or send an empty `order_id` to clear your reference.\n\nIf the edited address yields different KYC requirements upstream, the\nresponse will be `422` carrying the new requirements; resubmit again with\nthe matching KYC fields.\n"},"status":"Conflict","code":409,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"Only orders with status submission_failed can be edited and retried (current status: requested).\"\n}"},{"id":"9c13254c-1267-4941-b932-07a65e17579a","name":"422 — Local validation - one or more fields invalid","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"customer_name","type":"text","description":"Legal name of the customer. Required and editable on retry;\nforwarded to the carrier, which may validate it.\n","value":"ACME GmbH"},{"key":"street","type":"text","value":""},{"key":"street_number","type":"text","value":""},{"key":"postal_code","type":"text","value":""},{"key":"city","type":"text","value":""},{"key":"area_code","type":"text","description":"Country-conditional. Required when the order's (locked) country\nneeds it - e.g. Switzerland (`CH`), where it would be something like\n`43` - and rejected (422) otherwise.\n","value":"","disabled":true},{"key":"quantity","type":"text","value":""},{"key":"webhook","type":"text","value":"","disabled":true},{"key":"order_id","type":"text","description":"Optional customer reference (max 64 chars). Editable on retry -\nsend a new value to change it, or an empty string to clear it.\nEchoed back in the response, in `GET /numbers/orders/{id}`, and\nat the top level of the asynchronous webhook payload as `order_id`\n(the webhook body is the same order object).\n","value":"po-2026-00042","disabled":true},{"key":"kyc","type":"text","description":"KYC documents, one entry per `documentType` returned by\n`POST /numbers/orders/check` for the country. Send file documents\nas a file part `kyc[<documentType>]` and identifier-only documents\nas a form field `kyc[<documentType>]=<value>`. Accepted file MIME\ntypes: `application/pdf`, `image/jpeg`, `image/png`. Example shape:\n\n  * `kyc[utility_bill]` - file part carrying `bill.pdf`\n  * `kyc[id_document]` - file part carrying `passport.jpg`\n  * `kyc[business_registration_number]=BE-12345` - form field\n\nFor an OR group returned by the check endpoint (an array of types),\nprovide any one of the listed `documentType`s. Re-send the KYC\ndocuments you want on the retried order; on submission_failed\nretries the carrier re-validates them.\n","value":"","disabled":true}]},"url":{"raw":"{{baseUrl}}/{{version}}/numbers/orders/:id","host":["{{baseUrl}}"],"path":["{{version}}","numbers","orders",":id"],"variable":[{"key":"id","value":"550e8400-e29b-41d4-a716-446655440000"}]},"description":"Edit selected fields of a `submission_failed` order and re-submit it\nupstream. Same multipart contract as `POST /numbers/orders`.\n\nUses `POST` (not `PUT`) on purpose: the body is `multipart/form-data`, and\nmany server runtimes only parse a multipart body when the method is `POST` -\non `PUT` the fields and files arrive empty. Send this edit as a plain `POST`.\n\nConstraints:\n- Only orders with status `submission_failed` can be edited.\n- `country` is frozen. You may re-send it with the same value (handy when\n  you echo back the whole order), but *changing* it returns `422` - order in\n  a different country by creating a new order. Omitting it is also fine.\n\n`customer_name` and `order_id` are editable here: send new values to change\nthem, or send an empty `order_id` to clear your reference.\n\nIf the edited address yields different KYC requirements upstream, the\nresponse will be `422` carrying the new requirements; resubmit again with\nthe matching KYC fields.\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"The street field is required. (and 4 more errors)\",\n  \"errors\": {\n    \"customer_name\": [\n      \"The customer name field is required.\"\n    ],\n    \"street\": [\n      \"The street field is required.\"\n    ],\n    \"street_number\": [\n      \"The street number field is required.\"\n    ],\n    \"postal_code\": [\n      \"The postal code field is required.\"\n    ],\n    \"city\": [\n      \"The city field is required.\"\n    ],\n    \"area_code\": [\n      \"The area code field is required.\"\n    ],\n    \"quantity\": [\n      \"The quantity field must be at least 1.\"\n    ],\n    \"country\": [\n      \"Country cannot be changed - create a new request if you need to order in a different country.\"\n    ],\n    \"order_id\": [\n      \"The order id field must not be greater than 64 characters.\"\n    ]\n  }\n}"},{"id":"c92888c3-3b21-4eaa-9079-309a150ae9a6","name":"422 — Carrier rejected the retried order (mapped to your fields)","originalRequest":{"auth":{"type":"bearer","bearer":{"token":""}},"method":"POST","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"customer_name","type":"text","description":"Legal name of the customer. Required and editable on retry;\nforwarded to the carrier, which may validate it.\n","value":"ACME GmbH"},{"key":"street","type":"text","value":""},{"key":"street_number","type":"text","value":""},{"key":"postal_code","type":"text","value":""},{"key":"city","type":"text","value":""},{"key":"area_code","type":"text","description":"Country-conditional. Required when the order's (locked) country\nneeds it - e.g. Switzerland (`CH`), where it would be something like\n`43` - and rejected (422) otherwise.\n","value":"","disabled":true},{"key":"quantity","type":"text","value":""},{"key":"webhook","type":"text","value":"","disabled":true},{"key":"order_id","type":"text","description":"Optional customer reference (max 64 chars). Editable on retry -\nsend a new value to change it, or an empty string to clear it.\nEchoed back in the response, in `GET /numbers/orders/{id}`, and\nat the top level of the asynchronous webhook payload as `order_id`\n(the webhook body is the same order object).\n","value":"po-2026-00042","disabled":true},{"key":"kyc","type":"text","description":"KYC documents, one entry per `documentType` returned by\n`POST /numbers/orders/check` for the country. Send file documents\nas a file part `kyc[<documentType>]` and identifier-only documents\nas a form field `kyc[<documentType>]=<value>`. Accepted file MIME\ntypes: `application/pdf`, `image/jpeg`, `image/png`. Example shape:\n\n  * `kyc[utility_bill]` - file part carrying `bill.pdf`\n  * `kyc[id_document]` - file part carrying `passport.jpg`\n  * `kyc[business_registration_number]=BE-12345` - form field\n\nFor an OR group returned by the check endpoint (an array of types),\nprovide any one of the listed `documentType`s. Re-send the KYC\ndocuments you want on the retried order; on submission_failed\nretries the carrier re-validates them.\n","value":"","disabled":true}]},"url":{"raw":"{{baseUrl}}/{{version}}/numbers/orders/:id","host":["{{baseUrl}}"],"path":["{{version}}","numbers","orders",":id"],"variable":[{"key":"id","value":"550e8400-e29b-41d4-a716-446655440000"}]},"description":"Edit selected fields of a `submission_failed` order and re-submit it\nupstream. Same multipart contract as `POST /numbers/orders`.\n\nUses `POST` (not `PUT`) on purpose: the body is `multipart/form-data`, and\nmany server runtimes only parse a multipart body when the method is `POST` -\non `PUT` the fields and files arrive empty. Send this edit as a plain `POST`.\n\nConstraints:\n- Only orders with status `submission_failed` can be edited.\n- `country` is frozen. You may re-send it with the same value (handy when\n  you echo back the whole order), but *changing* it returns `422` - order in\n  a different country by creating a new order. Omitting it is also fine.\n\n`customer_name` and `order_id` are editable here: send new values to change\nthem, or send an empty `order_id` to clear your reference.\n\nIf the edited address yields different KYC requirements upstream, the\nresponse will be `422` carrying the new requirements; resubmit again with\nthe matching KYC fields.\n"},"status":"Unprocessable Entity","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"This value is too short. It should have 3 characters or more. (and 1 more error)\",\n  \"errors\": {\n    \"customer_name\": [\n      \"This value is too short. It should have 3 characters or more.\"\n    ],\n    \"city\": [\n      \"The city does not match the provided postal code.\"\n    ]\n  },\n  \"data\": {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"order_id\": \"po-2026-00042\",\n    \"customer_name\": \"ACME GmbH\",\n    \"status\": \"submission_failed\",\n    \"address\": {\n      \"street\": \"Adenauerallee\",\n      \"street_number\": \"1\",\n      \"postal_code\": \"53113\",\n      \"city\": \"Bonn\",\n      \"area_code\": null,\n      \"country\": \"DE\"\n    },\n    \"formatted_address\": \"Adenauerallee 1, 53113 Bonn, DE\",\n    \"quantity\": 1,\n    \"prefix\": null,\n    \"numbers\": [],\n    \"phone_numbers\": [],\n    \"error_message\": \"Nexus rejected the request with status 422\",\n    \"webhook_url\": \"https://your-app.example/hooks/number-order\",\n    \"webhook_status\": \"not_required\",\n    \"webhook_next_retry_at\": null,\n    \"created_at\": \"2026-05-12T10:36:47+00:00\",\n    \"updated_at\": \"2026-05-12T11:02:13+00:00\"\n  }\n}"}],"_postman_id":"55f645f8-5842-4456-a83c-3bd37441e6fe"}],"id":"229092f1-677c-41de-9841-50339a77d81a","description":"<p>Customer-facing endpoints for the Nexus number-order proxy. Use these to\ncheck whether a phone number can be provisioned at a given address, place\nan order (with KYC documents attached), retrieve an order's status, edit\nand retry an order that failed submission, list the phone numbers already\nowned by the PBX, and attach a call flow to a specific number.</p>\n<p>Authentication is the PBX API key (one token per PBX); every response is\nscoped to that PBX.</p>\n","_postman_id":"229092f1-677c-41de-9841-50339a77d81a"},{"name":"Calls","item":[{"name":"Start new call","id":"e270171b-8a5a-4faa-b47b-88945179bad0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{cockpit_auth}}"}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"targets\": { // One of the target needed to be passed\n    \"sip_devices\": [],\n    \"webrtc\": false, // default false if not passed\n    \"twinning\": true,  // default false if not passed\n    \"teams\": false  // default false if not passed\n  },\n  \"destination\": \"+352661579000\", // required\n  \"caller_identity\": \"13e0ed05-c7aa-4ea3-ab41-c005fcbc822e\" // Required\n}","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/calls/new","description":"<h2 id=\"start-a-new-call\">Start a New Call</h2>\n<p>Start a new call to a destination from a User or Device.</p>\n<ul>\n<li><p><strong>DialBack mode</strong>:<br />  We first dial the <em>targets</em> (user devices, WebRTC, Teams, etc.). As soon as one of them answers, we dial the <strong>destination</strong>. This allows the user to choose which device will be used to start the call.</p>\n</li>\n<li><p>When <strong>no targets</strong> are specified, we dial <strong>all linked devices for the user</strong> in DialBack mode.</p>\n</li>\n<li><p>When the <strong>source</strong> parameter is defined, we dial the <strong>source number</strong> in DialBack mode and ignore all other targets.</p>\n</li>\n<li><p>When only <strong>one</strong> <code>targets.sip_devices</code> (and no other targets) is specified, we try to start the call via the <strong>Phone API</strong>; if that fails, we fall back to dialing the device directly.</p>\n</li>\n</ul>\n<hr />\n<h3 id=\"http-request\">HTTP Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">POST {{baseUrl}}/{{version}}/calls/new\nContent-Type: application/json\nAuthorization: Bearer {{cockpit_auth}}\n\n</code></pre>\n<blockquote>\n<p>Note: Even though this is currently configured as a GET request in Postman, this operation semantically behaves as a <strong>create/start</strong> action and is typically implemented as <strong>POST</strong> with a JSON body. Ensure your method matches the backend implementation. </p>\n</blockquote>\n<hr />\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires authentication.</p>\n<ul>\n<li><p><strong>Type</strong>: Bearer token</p>\n</li>\n<li><p><strong>Header</strong>:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-http\">    Authorization: Bearer {{cockpit_auth}}\n\n</code></pre>\n</li>\n<li><p><code>{{cockpit_auth}}</code> should contain a valid access token (for the authenticated Cockpit user) in the active environment (for example: <code>[PROD] cockpit.voxbi.com</code>).</p>\n</li>\n</ul>\n<p>If the token is invalid or missing, the API will return an authorization error (e.g., 401/403).</p>\n<hr />\n<h3 id=\"request-body\">Request Body</h3>\n<p><strong>Content-Type</strong>: <code>application/json</code></p>\n<h4 id=\"example-with-inline-comments\">Example (with inline comments)</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"targets\": { // If no pass all will ring\n    \"sip_devices\": [ // default null\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\" // Your choosen sip device ID which you want to use to make call\n    ],\n    \"webrtc\": true, // default false if not passed\n    \"twinning\": true,  // default false if not passed\n    \"teams\": true  // default false if not passed\n  },\n  \"destination\": \"0035220333300\", // required\n  \"caller_identity\": \"905a334f-5bf6-4ebc-85d3-2d5411187f68\" // Required\n}\n\n</code></pre>\n<h4 id=\"properties\">Properties</h4>\n<ul>\n<li><p><code>targets</code> (object, optional)<br />  Which targets to start the call from.</p>\n<ul>\n<li><p>If <strong>multiple targets</strong> are specified, the PBX will call each target <strong>in DialBack mode</strong>.</p>\n</li>\n<li><p>If <strong>no targets</strong> are specified, all devices linked to the user will be dialed in DialBack mode.</p>\n</li>\n<li><p><code>targets.sip_devices</code> (array of strings, optional): List of SIP device IDs to be used as call sources. Default: <code>null</code>.</p>\n</li>\n<li><p><code>targets.webrtc</code> (boolean, optional): Whether to include the WebRTC client as a possible source. Default: <code>false</code>.</p>\n</li>\n<li><p><code>targets.twinning</code> (boolean, optional): Whether to include twinned devices. Default: <code>false</code>.</p>\n</li>\n<li><p><code>targets.teams</code> (boolean, optional): Whether to include Microsoft Teams as a possible source. Default: <code>false</code>.</p>\n</li>\n</ul>\n</li>\n<li><p><code>destination</code> (string, required)<br />  The phone number (or extension) to call. Must be a valid, dialable number in E.164 or PBX-compatible format.</p>\n</li>\n<li><p><code>caller_identity</code> (string, required)<br />  Identifier of the calling user or device (e.g., user UUID or device UUID) that will be used to determine available targets and call permissions.</p>\n</li>\n</ul>\n<hr />\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<p>This endpoint does not define specific query parameters by default. Any additional query parameters should be considered advanced options and may not be supported across all deployments.</p>\n<hr />\n<h3 id=\"responses\">Responses</h3>\n<h4 id=\"200-ok--call-started--dialback-initiated\">200 OK — Call Started / DialBack Initiated</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"success\": true,\n  \"data\": {\n    \"call_id\": \"f4e1b7f2-5b3e-4f9c-9a3d-2a1c0b9d1234\",\n    \"destination\": \"0035220333300\",\n    \"caller_identity\": \"905a334f-5bf6-4ebc-85d3-2d5411187f68\",\n    \"mode\": \"dialback\",\n    \"targets\": {\n      \"sip_devices\": [\"a469de67-b79a-4dea-87d2-9a15858f10cd\"],\n      \"webrtc\": true,\n      \"twinning\": true,\n      \"teams\": true\n    },\n    \"status\": \"initiated\",\n    \"created_at\": \"2024-01-01T12:00:00Z\"\n  }\n}\n\n</code></pre>\n<h4 id=\"400-bad-request--generic-validation--payload-error\">400 Bad Request — Generic Validation / Payload Error</h4>\n<p>Returned when the request payload is syntactically correct JSON but fails basic validation (missing required fields, wrong types, invalid format, etc.). Uses a standard Laravel-style error structure.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"The given data was invalid.\",\n  \"errors\": {\n    \"destination\": [\n      \"The destination field is required.\",\n      \"The destination must be a valid phone number.\"\n    ],\n    \"caller_identity\": [\n      \"The caller identity field is required.\"\n    ]\n  }\n}\n\n</code></pre>\n<h4 id=\"422-unprocessable-entity--business-rule--domain-validation-error\">422 Unprocessable Entity — Business Rule / Domain Validation Error</h4>\n<p>Returned when the payload is structurally valid but violates domain/business rules (for example, user not allowed to call this destination, no active devices found, or features not enabled for the account). Also uses a standard Laravel-style error response.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"The given data was invalid.\",\n  \"errors\": {\n    \"destination\": [\n      \"Calls to this destination are not allowed for the current user.\"\n    ],\n    \"targets.sip_devices\": [\n      \"At least one active SIP device is required to start a call.\"\n    ],\n    \"targets.webrtc\": [\n      \"WebRTC is not enabled for this account.\"\n    ]\n  }\n}\n\n</code></pre>\n","urlObject":{"path":["{{version}}","calls","new"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"a921ea07-1edd-4e2b-9ad3-f618be719f55","name":"200 OK - Call Started","originalRequest":{"method":"GET","header":[{"key":"Content-Type","value":"application/json"}],"url":"{{baseUrl}}/{{version}}/calls/new"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\\n  \"success\": true,\\n  \"data\": {\\n    \"call_id\": \"aabbccdd-1234-4567-8901-112233445566\",\\n    \"destination\": \"+352201234567\",\\n    \"caller_identity\": \"87654321-dcba-4fed-2109-654321fedcba\",\\n    \"mode\": \"dialback\",\\n    \"targets\": {\\n      \"sip_devices\": [\"12345678-abcd-4def-9012-abcdef123456\"],\\n      \"webrtc\": true,\\n      \"twinning\": true,\\n      \"teams\": true\\n    },\\n    \"status\": \"initiated\",\\n    \"created_at\": \"2024-01-15T10:30:00Z\"\\n  }\\n}"}],"_postman_id":"e270171b-8a5a-4faa-b47b-88945179bad0"},{"name":"Calls History","id":"0ff79e47-8f70-4b59-bafd-169f69fb0a2a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{cockpit_auth}}"}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/cdrs-utility/cdrs?extras=true&start_time=2026-06-01 00:00:00&end_time=2026-06-12 23:50:59&page=1&page_size=5","description":"<h3 id=\"description\">Description</h3>\n<p>This API endpoint retrieves the call history of the user based on the provided filters.</p>\n<h4 id=\"request\">Request</h4>\n<h5 id=\"query-parameters\">Query Parameters</h5>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>extras</td>\n<td>boolean</td>\n<td>Whether to include additional computed data and metadata in the response. Usually <code>false</code> for basic listings.</td>\n</tr>\n<tr>\n<td>call_type[]</td>\n<td>string</td>\n<td>Filter by one or more call types (e.g., <code>incoming</code>, <code>outgoing</code>, <code>missed</code>, or <code>all</code>). When omitted, all types may be returned.</td>\n</tr>\n<tr>\n<td>start_time</td>\n<td>datetime</td>\n<td>Start of the time window to filter the call history, in <code>YYYY-MM-DD HH:MM:SS</code> format.</td>\n</tr>\n<tr>\n<td>end_time</td>\n<td>datetime</td>\n<td>End of the time window to filter the call history, in <code>YYYY-MM-DD HH:MM:SS</code> format.</td>\n</tr>\n<tr>\n<td>search</td>\n<td>string</td>\n<td>Free-text search across caller/callee names or numbers.</td>\n</tr>\n<tr>\n<td>id</td>\n<td>integer</td>\n<td>Filter by a specific CDR identifier. Useful to retrieve or debug a particular record.</td>\n</tr>\n<tr>\n<td>page</td>\n<td>integer</td>\n<td>Page number for pagination (1-based index).</td>\n</tr>\n<tr>\n<td>page_size</td>\n<td>integer</td>\n<td>Number of items per page for pagination.</td>\n</tr>\n<tr>\n<td>remote_extension_number</td>\n<td>string</td>\n<td>Filter by the remote party’s extension or phone number.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"response\">Response</h4>\n<h5 id=\"response-fields\">Response Fields</h5>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td>int</td>\n<td>The unique identifier of the CDR.</td>\n</tr>\n<tr>\n<td>caller_number</td>\n<td>string</td>\n<td>The caller's phone number.</td>\n</tr>\n<tr>\n<td>callee_number</td>\n<td>string</td>\n<td>The callee's phone number.</td>\n</tr>\n<tr>\n<td>start_time</td>\n<td>datetime</td>\n<td>The start time of the call.</td>\n</tr>\n<tr>\n<td>end_time</td>\n<td>datetime</td>\n<td>The end time of the call.</td>\n</tr>\n<tr>\n<td>call_type</td>\n<td>string</td>\n<td>The type of the call (e.g., \"incoming\").</td>\n</tr>\n<tr>\n<td>recording_file_path</td>\n<td>string</td>\n<td>The file path to the call recording.</td>\n</tr>\n<tr>\n<td>transcription</td>\n<td>string</td>\n<td>The transcribed text of the conversation.</td>\n</tr>\n<tr>\n<td>summary</td>\n<td>string</td>\n<td>The summary of the conversation.</td>\n</tr>\n<tr>\n<td>translation</td>\n<td>string</td>\n<td>The translated text of the conversation.</td>\n</tr>\n<tr>\n<td>topic</td>\n<td>string</td>\n<td>The topic of the conversation.</td>\n</tr>\n<tr>\n<td>keywords</td>\n<td>array</td>\n<td>The keywords associated with the conversation.</td>\n</tr>\n<tr>\n<td>language</td>\n<td>string</td>\n<td>The language of the conversation.</td>\n</tr>\n<tr>\n<td>pagin.</td>\n<td></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n</div><h5 id=\"response-example\">Response Example</h5>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"data\": [\n    {\n      \"cdr_id\": 24904193,\n      \"pbx_user_id\": \"eb2109dd-adc7-455b-bc33-e92fcac4bf38\",\n      \"pbx_profile_id\": null,\n      \"customer_pid\": null,\n      \"type\": \"INCOMING\",\n      \"is_missed_call\": true,\n      \"is_answered\": false,\n      \"remote_person_id\": \"83ea7fdc-8942-49e4-9a87-1bb7bf73f77b\",\n      \"remote_person_name\": \"MATHIEU DEROUCK\",\n      \"remote_person_number\": \"2041\",\n      \"via_id\": \"83ea7fdc-8942-49e4-9a87-1bb7bf73f77b\",\n      \"via_name\": \"MATHIEU DEROUCK\",\n      \"via_number\": \"2041\",\n      \"date\": \"2026-01-12\",\n      \"start_time\": \"2026-01-12 15:50:19\",\n      \"answer_time\": null,\n      \"end_time\": \"2026-01-12 15:50:25\",\n      \"duration\": 6,\n      \"billsec\": 0,\n      \"is_transfer_call\": false,\n      \"is_conference_call\": false,\n      \"is_recorded\": false,\n      \"notes_count\": 0,\n      \"transcriptions_available\": false,\n      \"extras\": []\n    }\n    // ... more CDRs\n  ],\n  \"pagination\": {\n    \"current_page\": 1,\n    \"per_page\": 5,\n    \"total\": 515\n    // ... other pagination fields\n  },\n  \"cache_hit\": false,\n  \"status\": true,\n  \"message\": \"CDRs retrieved successfully.\"\n}\n</code></pre>\n","urlObject":{"path":["{{version}}","cdrs-utility","cdrs"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>true will send detailed response containing AI transcription and call timelines</p>\n","type":"text/plain"},"key":"extras","value":"true"},{"disabled":true,"description":{"content":"<p>answered, missed, all, incoming, outgoing</p>\n","type":"text/plain"},"key":"call_type[]","value":"incoming"},{"disabled":true,"key":"call_type[]","value":"all"},{"description":{"content":"<p>start date from where u want calls</p>\n","type":"text/plain"},"key":"start_time","value":"2026-06-01 00:00:00"},{"description":{"content":"<p>end date until how long u want calls</p>\n","type":"text/plain"},"key":"end_time","value":"2026-06-12 23:50:59"},{"disabled":true,"description":{"content":"<p>you can search anything and we get martched records (full text search)</p>\n","type":"text/plain"},"key":"search","value":"umair"},{"disabled":true,"description":{"content":"<p>if ID passed we will return calls &gt; that ID (we use this id to get calls only newer to that id for less load and fast response)</p>\n","type":"text/plain"},"key":"id","value":"18457973"},{"description":{"content":"<p>page number</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>page size</p>\n","type":"text/plain"},"key":"page_size","value":"5"},{"disabled":true,"description":{"content":"<p>// remote person numbver or extensioon can be passed for filter</p>\n","type":"text/plain"},"key":"remote_extension_number","value":"2041"}],"variable":[]}},"response":[{"id":"3ac12f48-49e7-44b2-9dc4-1f4e0258b3f6","name":"Calls History 200 OK","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/{{version}}/cdrs-utility/cdrs?extras=false&start_time=2025-01-01 00:00:00&end_time=2026-01-12 23:50:59&page=1&page_size=5","host":["{{baseUrl}}"],"path":["{{version}}","cdrs-utility","cdrs"],"query":[{"key":"extras","value":"false","description":"true will send detailed response containing AI transcription and call timelines"},{"key":"call_type[]","value":"incoming","description":"answered, missed, all, incoming, outgoing","disabled":true},{"key":"call_type[]","value":"all","type":"text","disabled":true},{"key":"start_time","value":"2025-01-01 00:00:00","description":"start date from where u want calls"},{"key":"end_time","value":"2026-01-12 23:50:59","description":"end date until how long u want calls"},{"key":"search","value":"umair","description":"you can search anything and we get martched records (full text search)","type":"text","disabled":true},{"key":"id","value":"18457973","description":"if ID passed we will return calls > that ID (we use this id to get calls only newer to that id for less load and fast response)","disabled":true},{"key":"page","value":"1","description":"page number"},{"key":"page_size","value":"5","description":"page size"},{"key":"remote_extension_number","value":"2041","description":"// remote person numbver or extensioon can be passed for filter","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Host","value":"localhost:8083"},{"key":"Connection","value":"close"},{"key":"X-Powered-By","value":"PHP/8.2.24"},{"key":"Content-Type","value":"application/json"},{"key":"Cache-Control","value":"no-cache, private"},{"key":"Date","value":"Mon, 19 Jan 2026 10:53:07 GMT"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"59"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"Last-Modified","value":"Mon, 19 Jan 2026 10:53:07 GMT"},{"key":"ETag","value":"bb295e4c3746aa9c290aaa5481da8378"},{"key":"phpdebugbar-id","value":"01KFAY65GTGXW46Z5HBRQQ7BQ6"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"}],"cookie":[],"responseTime":null,"body":"{\n  \"data\": [\n    {\n      \"cdr_id\": \"***\",\n      \"pbx_user_id\": \"***\",\n      \"pbx_profile_id\": null,\n      \"customer_pid\": null,\n      \"type\": \"INCOMING\",\n      \"is_missed_call\": true,\n      \"is_answered\": false,\n      \"remote_person_id\": \"***\",\n      \"remote_person_name\": \"***\",\n      \"remote_person_number\": \"***\",\n      \"via_id\": \"***\",\n      \"via_name\": \"***\",\n      \"via_number\": \"***\",\n      \"date\": \"2026-01-12\",\n      \"start_time\": \"2026-01-12 15:50:19\",\n      \"answer_time\": null,\n      \"end_time\": \"2026-01-12 15:50:25\",\n      \"duration\": 6,\n      \"billsec\": 0,\n      \"is_transfer_call\": false,\n      \"is_conference_call\": false,\n      \"is_recorded\": false,\n      \"notes_count\": 0,\n      \"transcriptions_available\": false,\n      \"extras\": []\n    },\n    {\n      \"cdr_id\": \"***\",\n      \"pbx_user_id\": \"***\",\n      \"pbx_profile_id\": null,\n      \"customer_pid\": null,\n      \"type\": \"INCOMING\",\n      \"is_missed_call\": true,\n      \"is_answered\": false,\n      \"remote_person_id\": \"***\",\n      \"remote_person_name\": \"***\",\n      \"remote_person_number\": \"***\",\n      \"via_id\": \"***\",\n      \"via_name\": \"***\",\n      \"via_number\": \"***\",\n      \"date\": \"2026-01-08\",\n      \"start_time\": \"2026-01-08 10:33:03\",\n      \"answer_time\": \"***\",\n      \"end_time\": \"2026-01-08 10:38:40\",\n      \"duration\": 337,\n      \"billsec\": 0,\n      \"is_transfer_call\": false,\n      \"is_conference_call\": false,\n      \"is_recorded\": false,\n      \"notes_count\": 0,\n      \"transcriptions_available\": false,\n      \"extras\": []\n    },\n    {\n      \"cdr_id\": \"***\",\n      \"pbx_user_id\": \"***\",\n      \"pbx_profile_id\": null,\n      \"customer_pid\": null,\n      \"type\": \"INCOMING\",\n      \"is_missed_call\": true,\n      \"is_answered\": false,\n      \"remote_person_id\": \"***\",\n      \"remote_person_name\": \"***\",\n      \"remote_person_number\": \"***\",\n      \"via_id\": \"***\",\n      \"via_name\": \"***\",\n      \"via_number\": \"***\",\n      \"date\": \"2026-01-08\",\n      \"start_time\": \"2026-01-08 10:21:29\",\n      \"answer_time\": \"***\",\n      \"end_time\": \"2026-01-08 10:32:40\",\n      \"duration\": 671,\n      \"billsec\": 0,\n      \"is_transfer_call\": false,\n      \"is_conference_call\": false,\n      \"is_recorded\": false,\n      \"notes_count\": 0,\n      \"transcriptions_available\": false,\n      \"extras\": []\n    },\n    {\n      \"cdr_id\": \"***\",\n      \"pbx_user_id\": \"***\",\n      \"pbx_profile_id\": null,\n      \"customer_pid\": null,\n      \"type\": \"INCOMING\",\n      \"is_missed_call\": false,\n      \"is_answered\": true,\n      \"remote_person_id\": \"***\",\n      \"remote_person_name\": \"***\",\n      \"remote_person_number\": \"***\",\n      \"via_id\": \"***\",\n      \"via_name\": \"***\",\n      \"via_number\": \"***\",\n      \"date\": \"2026-01-08\",\n      \"start_time\": \"2026-01-08 09:36:45\",\n      \"answer_time\": \"***\",\n      \"end_time\": \"2026-01-08 09:37:36\",\n      \"duration\": 51,\n      \"billsec\": 30,\n      \"is_transfer_call\": false,\n      \"is_conference_call\": false,\n      \"is_recorded\": false,\n      \"notes_count\": 0,\n      \"transcriptions_available\": false,\n      \"extras\": []\n    },\n    {\n      \"cdr_id\": \"***\",\n      \"pbx_user_id\": \"***\",\n      \"pbx_profile_id\": null,\n      \"customer_pid\": null,\n      \"type\": \"OUTGOING\",\n      \"is_missed_call\": false,\n      \"is_answered\": true,\n      \"remote_person_id\": \"***\",\n      \"remote_person_name\": \"***\",\n      \"remote_person_number\": \"***\",\n      \"via_id\": \"***\",\n      \"via_name\": \"***\",\n      \"via_number\": \"***\",\n      \"date\": \"2026-01-05\",\n      \"start_time\": \"2026-01-05 15:33:09\",\n      \"answer_time\": \"***\",\n      \"end_time\": \"2026-01-05 15:38:02\",\n      \"duration\": 293,\n      \"billsec\": 293,\n      \"is_transfer_call\": false,\n      \"is_conference_call\": false,\n      \"is_recorded\": true,\n      \"notes_count\": 0,\n      \"transcriptions_available\": true,\n      \"extras\": []\n    }\n  ],\n  \"pagination\": {\n    \"current_page\": 1,\n    \"first_page_url\": \"***\",\n    \"prev_page_url\": null,\n    \"next_page_url\": \"***\",\n    \"last_page_url\": \"***\",\n    \"last_page\": 103,\n    \"per_page\": 5,\n    \"total\": 515,\n    \"path\": \"***\"\n  },\n  \"cache_hit\": false,\n  \"status\": true,\n  \"message\": \"CDRs retrieved successfully.\"\n}\n"}],"_postman_id":"0ff79e47-8f70-4b59-bafd-169f69fb0a2a"},{"name":"Call History Detail","id":"e912ddb4-9d32-44aa-bad3-0cca6ea48f2b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{cockpit_auth}}"}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{baseUrl}}/{{version}}/cdrs-utility/cdrs/detail/37419234","description":"<p>Get call details by passing call ID.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns detailed information for a single call, including caller, receivers, call flow events, recording metadata, and AI processing fields.</p>\n<h3 id=\"field-behavior\">Field behavior</h3>\n<ul>\n<li><p><code>is_missed_call</code></p>\n<ul>\n<li><code>true</code> when the call was never answered by any party (no receiver leg has a non-null <code>answer_time</code> with <code>billsec &gt; 0</code>).</li>\n</ul>\n</li>\n<li><p><code>is_answered</code></p>\n<ul>\n<li><code>true</code> when at least one leg of the call is answered (at least one receiver has a non-null <code>answer_time</code> and <code>billsec &gt; 0</code>).</li>\n</ul>\n</li>\n<li><p><code>duration</code> vs <code>billsec</code></p>\n<ul>\n<li><p><code>duration</code> represents the overall call length in seconds (from call start to call end) and can be greater than 0 even if the call was never billed.</p>\n</li>\n<li><p><code>billsec</code> represents the billed seconds and may be <code>0</code> even when <code>duration &gt; 0</code> (for missed calls or calls that are not billed).</p>\n</li>\n</ul>\n</li>\n<li><p>Recording flags</p>\n<ul>\n<li><p><code>is_recording_file_exists</code> indicates whether a full-call recording is available for this call.</p>\n</li>\n<li><p><code>recording_file_path_caller</code> and <code>recording_file_path_callee</code> indicate whether separate caller/callee leg recordings exist; their <code>path</code>/<code>download_url</code> will be <code>null</code> or empty when the respective leg was not recorded.</p>\n</li>\n</ul>\n</li>\n<li><p>AI processing fields</p>\n<ul>\n<li><code>transcriptions</code> and <code>ai_processing_errors</code> are populated only when AI processing has been attempted for this call; they will typically be <code>null</code> or empty for calls that have not undergone AI processing.</li>\n</ul>\n</li>\n</ul>\n","urlObject":{"path":["{{version}}","cdrs-utility","cdrs","detail","37419234"],"host":["{{baseUrl}}"],"query":[{"disabled":true,"description":{"content":"<p>answered, missed, all, incoming, outgoing</p>\n","type":"text/plain"},"key":"call_type[]","value":"incoming"},{"disabled":true,"key":"call_type[]","value":"all"},{"disabled":true,"key":"search","value":"umair"},{"disabled":true,"key":"id","value":"18457973"},{"disabled":true,"key":"page","value":"100"},{"disabled":true,"key":"remote_extension_number","value":"2041"}],"variable":[]}},"response":[{"id":"f9b1acc5-3ed3-421f-b9ce-1783b6177475","name":"Call History Detail","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json","type":"text"}],"url":{"raw":"{{baseUrl}}/{{version}}/cdrs-utility/cdrs/detail/24904193","host":["{{baseUrl}}"],"path":["{{version}}","cdrs-utility","cdrs","detail","24904193"],"query":[{"key":"call_type[]","value":"incoming","description":"answered, missed, all, incoming, outgoing","disabled":true},{"key":"call_type[]","value":"all","type":"text","disabled":true},{"key":"search","value":"umair","type":"text","disabled":true},{"key":"id","value":"18457973","disabled":true},{"key":"page","value":"100","disabled":true},{"key":"remote_extension_number","value":"2041","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Host","value":"localhost:8083"},{"key":"Connection","value":"close"},{"key":"X-Powered-By","value":"PHP/8.2.24"},{"key":"Content-Type","value":"application/json"},{"key":"Cache-Control","value":"no-cache, private"},{"key":"Date","value":"Mon, 19 Jan 2026 10:53:32 GMT"},{"key":"X-RateLimit-Limit","value":"60"},{"key":"X-RateLimit-Remaining","value":"60"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"Last-Modified","value":"Mon, 19 Jan 2026 10:53:32 GMT"},{"key":"ETag","value":"54878b360d5769f656c287d2377990c7"},{"key":"phpdebugbar-id","value":"01KFAY6WZZJKAYJGJGCTSEWYDR"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"}],"cookie":[],"responseTime":null,"body":"{\n    \"data\": {\n        \"id\": 24904193,\n        \"company_id\": \"eb2109dd-adc7-455b-bc33-e92fcac4bf38\",\n        \"type\": \"OUTGOING\",\n        \"date\": \"2026-01-12\",\n        \"start_time\": \"2026-01-12 15:50:19\",\n        \"answer_time\": null,\n        \"end_time\": \"2026-01-12 15:50:25\",\n        \"duration\": 6,\n        \"billsec\": 0,\n        \"is_transfer_call\": false,\n        \"is_internal\": true,\n        \"is_conference_call\": false,\n        \"conference\": [],\n        \"is_recording_file_exists\": false,\n        \"recording_file\": {\n            \"name\": \"\",\n            \"path\": null,\n            \"download_url\": null,\n            \"hint\": \"This recording file is for the entire call, including both caller and callee recordings. You can only download using your Brear token\"\n        },\n        \"recording_file_path_caller\": {\n            \"name\": \"\",\n            \"path\": null,\n            \"download_url\": null,\n            \"hint\": \"This recording file is for the caller part of the call. You can only download using your Brear token\"\n        },\n        \"recording_file_path_callee\": {\n            \"name\": \"\",\n            \"path\": null,\n            \"download_url\": null,\n            \"hint\": \"This recording file is for the callee (receivers who received the call) part of the call. You can only download using your Brear token\"\n        },\n        \"caller\": {\n            \"id\": \"83ea7fdc-8942-49e4-9a87-1bb7bf73f77b\",\n            \"name\": \"MATHIEU DEROUCK\",\n            \"number\": \"2041\"\n        },\n        \"receivers\": [\n            {\n                \"id\": \"6aa692be-d4d3-4689-af39-98197e0a2ea9\",\n                \"status\": \"TRIGGERED\",\n                \"name\": \"UMAIR ALI\",\n                \"number\": \"2039\",\n                \"start_time\": \"2026-01-12 15:50:19\",\n                \"answer_time\": \"2026-01-12 15:50:19\",\n                \"end_time\": \"2026-01-12 15:50:25\",\n                \"duration\": 6,\n                \"billsec\": 6,\n                \"via_id\": \"83ea7fdc-8942-49e4-9a87-1bb7bf73f77b\",\n                \"via_name\": \"MATHIEU DEROUCK\",\n                \"via_number\": \"2041\",\n                \"via_type\": \"CALL_FLOW\"\n            },\n            {\n                \"id\": \"6aa692be-d4d3-4689-af39-98197e0a2ea9\",\n                \"status\": \"MISSED\",\n                \"name\": \"UMAIR ALI\",\n                \"number\": \"2039\",\n                \"start_time\": \"2026-01-12 15:50:20\",\n                \"answer_time\": null,\n                \"end_time\": \"2026-01-12 15:50:25\",\n                \"duration\": 6,\n                \"billsec\": 0,\n                \"via_id\": \"83ea7fdc-8942-49e4-9a87-1bb7bf73f77b\",\n                \"via_name\": \"MATHIEU DEROUCK\",\n                \"via_number\": \"2041\",\n                \"via_type\": null\n            },\n            {\n                \"id\": \"a091ab6b-4ce0-4039-9278-9b0854617f6f\",\n                \"status\": \"MISSED\",\n                \"name\": \"\",\n                \"number\": \"+352661579000\",\n                \"start_time\": \"2026-01-12 15:50:21\",\n                \"answer_time\": null,\n                \"end_time\": \"2026-01-12 15:50:25\",\n                \"duration\": 6,\n                \"billsec\": 0,\n                \"via_id\": \"83ea7fdc-8942-49e4-9a87-1bb7bf73f77b\",\n                \"via_name\": \"MATHIEU DEROUCK\",\n                \"via_number\": \"2041\",\n                \"via_type\": \"TWINNING\"\n            }\n        ],\n        \"call_flow\": [\n            {\n                \"color\": \"info\",\n                \"text\": \"OUTGOING - Call started by MATHIEU DEROUCK (2041)\",\n                \"sub_text\": null,\n                \"time\": \"2026-01-12 15:50:19\"\n            },\n            {\n                \"color\": \"secondary\",\n                \"text\": \"Triggered UMAIR ALI (2039)\",\n                \"sub_text\": \"Via [CALL_FLOW] - MATHIEU DEROUCK (2041)\",\n                \"time\": \"2026-01-12 15:50:19\"\n            },\n            {\n                \"color\": \"danger\",\n                \"text\": \"Missed by UMAIR ALI (2039)\",\n                \"sub_text\": \"Via MATHIEU DEROUCK (2041)\",\n                \"time\": \"2026-01-12 15:50:20\"\n            },\n            {\n                \"color\": \"info\",\n                \"text\": \"Call Finished\",\n                \"sub_text\": null,\n                \"time\": \"2026-01-12 15:50:25\"\n            }\n        ],\n        \"notes\": [],\n        \"transcriptions\": null,\n        \"ai_processing_errors\": []\n    },\n    \"status\": true,\n    \"message\": \"CDRs #24904193 detail retrieved successfully.\"\n}"}],"_postman_id":"e912ddb4-9d32-44aa-bad3-0cca6ea48f2b"},{"name":"Get Call Recording","id":"71f41eb0-b650-4248-a3a0-1259710b6eb1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{cockpit_auth}}"}]},"isInherited":false},"method":"GET","header":[],"body":{"mode":"formdata","formdata":[]},"url":"{{baseUrl}}/{{version}}/cdrs-utility/call-recording?id=37048552","description":"<h4 id=\"description\">Description</h4>\n<p>This API endpoint retrieves the recording file of a call based on the provided CDR ID.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"path-parameters\">Path Parameters</h5>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td>integer</td>\n<td>The ID of the CDR to retrieve.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"response\">Response</h4>\n<h5 id=\"success-response-200-ok\"><strong>Success Response (200 OK)</strong></h5>\n<p>The response will be the audio file in WAV format.</p>\n<h5 id=\"error-responses\"><strong>Error Responses</strong></h5>\n<h6 id=\"validation-error-422-unprocessable-entity\">Validation Error (422 Unprocessable Entity)</h6>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n    \"errors\": {\n        \"id\": [\"The id field is required.\"]\n    }\n}\n\n</code></pre><h6 id=\"recording-not-found-404-not-found\">Recording Not Found (404 Not Found)</h6>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n    \"message\": \"Recording file not found.\"\n}\n\n</code></pre><h6 id=\"voip-user-not-found-404-not-found\">VoIP User Not Found (404 Not Found)</h6>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n    \"message\": \"Voip user not found.\"\n}\n\n</code></pre>","urlObject":{"path":["{{version}}","cdrs-utility","call-recording"],"host":["{{baseUrl}}"],"query":[{"key":"id","value":"37048552"}],"variable":[]}},"response":[],"_postman_id":"71f41eb0-b650-4248-a3a0-1259710b6eb1"},{"name":"Get Call Recording with Path","id":"538da82e-2342-4e14-8c1b-f61dbaaeab32","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{cockpit_auth}}"}]},"isInherited":false},"method":"GET","header":[],"body":{"mode":"formdata","formdata":[]},"url":"{{baseUrl}}/{{version}}/cdrs-utility/call-recording?id=37373662&path=/mnt/hdd/recordings/spool/gdelagardelle_USR_9f8f5d47-1ed7-40b5-8037-7b634a2868ad_1782811837.48389.TX.wav","description":"<h4 id=\"description\">Description</h4>\n<p>This API endpoint retrieves the recording file of a call based on the provided CDR ID. We have 3 recordings per call (combined, caller, callee) by passing call id and path of file you can get specific file.</p>\n<h3 id=\"request\">Request</h3>\n<h5 id=\"path-parameters\">Path Parameters</h5>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id</td>\n<td>integer</td>\n<td>The ID of the CDR to retrieve.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"response\">Response</h4>\n<h5 id=\"success-response-200-ok\"><strong>Success Response (200 OK)</strong></h5>\n<p>The response will be the audio file in WAV format.</p>\n<h5 id=\"error-responses\"><strong>Error Responses</strong></h5>\n<h6 id=\"validation-error-422-unprocessable-entity\">Validation Error (422 Unprocessable Entity)</h6>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n    \"errors\": {\n        \"id\": [\"The id field is required.\"]\n    }\n}\n\n</code></pre><h6 id=\"recording-not-found-404-not-found\">Recording Not Found (404 Not Found)</h6>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n    \"message\": \"Recording file not found.\"\n}\n\n</code></pre><h6 id=\"voip-user-not-found-404-not-found\">VoIP User Not Found (404 Not Found)</h6>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n    \"message\": \"Voip user not found.\"\n}\n\n</code></pre>","urlObject":{"path":["{{version}}","cdrs-utility","call-recording"],"host":["{{baseUrl}}"],"query":[{"key":"id","value":"37373662"},{"description":{"content":"<p>get path from details api or list api when u pass extras: true</p>\n","type":"text/plain"},"key":"path","value":"/mnt/hdd/recordings/spool/gdelagardelle_USR_9f8f5d47-1ed7-40b5-8037-7b634a2868ad_1782811837.48389.TX.wav"}],"variable":[]}},"response":[],"_postman_id":"538da82e-2342-4e14-8c1b-f61dbaaeab32"}],"id":"ce92af22-86fd-4591-aa7f-9f7052236518","_postman_id":"ce92af22-86fd-4591-aa7f-9f7052236518","description":""}],"id":"7b60e856-1093-4aae-a376-288e7a9d984c","description":"<p><strong>Base URL</strong><br />All endpoints in this collection are relative to:</p>\n<p><code>https://cockpit.voxbi.com/</code></p>\n<p>Version: v1<br />API Prefix : api</p>\n<p>Complete URL: <a href=\"https://cockpit.voxbi.com/v1/api\">https://cockpit.voxbi.com/v1/api</a></p>\n<hr />\n<p>This collection exposes the <strong>public Cockpit APIs</strong> used to authenticate a user, fetch their PBX context, discover their devices, and control calls.</p>\n<p>At a high level, you will find:</p>\n<ul>\n<li><p><strong>Authentication flows</strong><br />  Support for both classic <strong>email + password login</strong> and <strong>passwordless email/code flows</strong>. Use these endpoints to obtain a <code>cockpit_auth</code> access token, which must be sent as a <code>Bearer</code> token in the <code>Authorization</code> header for protected routes.</p>\n</li>\n<li><p><strong>User + PBX context (<strong><strong><code>/me</code></strong></strong>)</strong><br />  The <code>/me</code> endpoint returns the authenticated user’s profile together with their PBX context: extensions, groups, WebRTC configuration, available caller identities, and more. Call this right after login to bootstrap your client with everything it needs for that user.</p>\n</li>\n<li><p><strong>Twinnings and SIP Devices</strong><br />  Endpoints to list and inspect a user’s <strong>twinnings</strong> (logical devices/routes) and <strong>SIP devices</strong>. These describe <strong>where and how calls can be made or received</strong> (for example, specific SIP phones, WebRTC clients, or forwarding rules) and provide the identifiers you will reference when placing calls.</p>\n</li>\n<li><p><strong>Call control</strong><br />  Endpoints such as <strong>Start New Call</strong> let you initiate outbound calls using the user’s configured devices and dial strategies.</p>\n</li>\n</ul>\n<p>All paths documented here should be understood as relative to <code>https://cockpit.voxbi.com/v1/api</code> (for example, <code>GET /me</code>, <code>GET /twinnings</code>, <code>POST /passwordless/login</code>, <code>GET /calls/new</code>).</p>\n","_postman_id":"7b60e856-1093-4aae-a376-288e7a9d984c"},{"name":"PBX APIs","item":[{"name":"V1","item":[{"name":"Start new call","id":"ad6e9358-dbfc-4dbf-a11e-bff233331c37","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{basicAuthUsername}}"},{"key":"password","value":"{{basicAuthPassword}}"}]},"isInherited":false},"method":"GET","header":[],"url":"{{baseUrl}}/calls/new/tapi?debugAmiTrace=true&destination=20333300&targets=a469de67-b79a-4dea-87d2-9a15858f10cd,webrtc,twinning,teams&caller_identity=905a334f-5bf6-4ebc-85d3-2d5411187f68&autoAnswer=false&forceDialBack=false&anonymous=false","description":"<h1 id=\"start-a-new-call-to-a-destination-from-a-user-using-the-xtelsio-tapi\">Start a new call to a destination from a User using the <a href=\"https://www.xtelsio.com/en/products/ast_tsp/tapi_for_asterisk.htm\">xtelsio Tapi</a></h1>\n<p>DialBack mode: we dial first the targets and once one of those has answered we dial the destination. This allows the user to select which device will be used to start a new call<br />When no targets are specified we dial all linked device for the user in DialBack mode.<br />When only one target.sip_devices (and no other targets) is specified we try to start the call via the Phone api if this fails we dial the device\nWhen the target is webrtc and we only have one instance of voxbi open we don't use DialBack mode</p>\n","urlObject":{"path":["calls","new","tapi"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Display the debug trace from asterisk manager</p>\n","type":"text/plain"},"key":"debugAmiTrace","value":"true"},{"description":{"content":"<p>Destination number to dial</p>\n","type":"text/plain"},"key":"destination","value":"20333300"},{"description":{"content":"<p>Target device used to start the call</p>\n","type":"text/plain"},"key":"targets","value":"a469de67-b79a-4dea-87d2-9a15858f10cd,webrtc,twinning,teams"},{"description":{"content":"<p>Specify the caller identity of the call</p>\n","type":"text/plain"},"key":"caller_identity","value":"905a334f-5bf6-4ebc-85d3-2d5411187f68"},{"description":{"content":"<p>Auto Answer the call on the src device (default: false) (overrides default behaviors)</p>\n","type":"text/plain"},"key":"autoAnswer","value":"false"},{"description":{"content":"<p>Forces the pbx to start a call in DialBack mode (default: false) (overrides default behaviors)</p>\n","type":"text/plain"},"key":"forceDialBack","value":"false"},{"description":{"content":"<p>Should the call be anonymous (default: false)</p>\n","type":"text/plain"},"key":"anonymous","value":"false"}],"variable":[]}},"response":[{"id":"8133b744-ab80-424c-b93d-563346e3396a","name":"Call Started","originalRequest":{"method":"GET","header":[{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"url":{"raw":"{{baseUrl}}/calls/new/tapi?debugAmiTrace=true&destination=20333300&targets=a469de67-b79a-4dea-87d2-9a15858f10cd,webrtc,twinning,teams&caller_identity=905a334f-5bf6-4ebc-85d3-2d5411187f68&autoAnswer=false&forceDialBack=false&anonymous=false","host":["{{baseUrl}}"],"path":["calls","new","tapi"],"query":[{"description":"Display the debug trace from asterisk manager","key":"debugAmiTrace","value":"true"},{"description":"Destination number to dial","key":"destination","value":"20333300"},{"description":"Target device used to start the call","key":"targets","value":"a469de67-b79a-4dea-87d2-9a15858f10cd,webrtc,twinning,teams"},{"description":"Specify the caller identity of the call","key":"caller_identity","value":"905a334f-5bf6-4ebc-85d3-2d5411187f68"},{"description":"Auto Answer the call on the src device (default: false) (overrides default behaviors)","key":"autoAnswer","value":"false"},{"description":"Forces the pbx to start a call in DialBack mode (default: false) (overrides default behaviors)","key":"forceDialBack","value":"false"},{"description":"Should the call be anonymous (default: false)","key":"anonymous","value":"false"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"ad6e9358-dbfc-4dbf-a11e-bff233331c37"},{"name":"Start a new multicast announcement","id":"d0f5c7cf-4d3c-4efa-a050-027b71f7a0d9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{bearerToken}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/calls/placemulticast?debugAmiTrace=true&ip=false&emergency=0&soundFile=all-your-base","description":"<p>Start a new multicast announcement</p>\n","urlObject":{"path":["calls","placemulticast"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Display the debug trace from asterisk manager</p>\n","type":"text/plain"},"key":"debugAmiTrace","value":"true"},{"description":{"content":"<p>IP to send the call to</p>\n","type":"text/plain"},"key":"ip","value":"false"},{"description":{"content":"<p>Should the multicast overwrite a call 0 or 1</p>\n","type":"text/plain"},"key":"emergency","value":"0"},{"description":{"content":"<p>Sound file to play</p>\n","type":"text/plain"},"key":"soundFile","value":"all-your-base"}],"variable":[]}},"response":[{"id":"72b1cf80-26c5-4b3d-9c78-e93d5deb129d","name":"Call Started","originalRequest":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"description":"Added as a part of security scheme: bearer","key":"Authorization","value":"Bearer <token>"}],"url":{"raw":"{{baseUrl}}/calls/placemulticast?debugAmiTrace=true&ip=false&emergency=0&soundFile=all-your-base","host":["{{baseUrl}}"],"path":["calls","placemulticast"],"query":[{"description":"Display the debug trace from asterisk manager","key":"debugAmiTrace","value":"true"},{"description":"IP to send the call to","key":"ip","value":"false"},{"description":"Should the multicast overwrite a call 0 or 1","key":"emergency","value":"0"},{"description":"Sound file to play","key":"soundFile","value":"all-your-base"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"ok\",\n  \"device\": {\n    \"number\": \"520\"\n  },\n  \"destination\": \"0035220333000\"\n}"}],"_postman_id":"d0f5c7cf-4d3c-4efa-a050-027b71f7a0d9"},{"name":"Hangup calls","id":"d64f7457-10e9-483d-8cbd-6f3b09011fd1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{basicAuthUsername}}"},{"key":"password","value":"{{basicAuthPassword}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"channels\": [\n    \"string\",\n    \"string\"\n  ]\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/calls/hangup?debugAmiTrace=true","description":"<p>Hangup calls for a user</p>\n","urlObject":{"path":["calls","hangup"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Display the debug trace from asterisk manager</p>\n","type":"text/plain"},"key":"debugAmiTrace","value":"true"}],"variable":[]}},"response":[{"id":"18c1c772-935f-4f92-b27c-204e3d51e6f8","name":"Call has been hangup","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"body":{"mode":"raw","raw":"{\n  \"channels\": [\n    \"string\",\n    \"string\"\n  ]\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":{"raw":"{{baseUrl}}/calls/hangup?debugAmiTrace=true","host":["{{baseUrl}}"],"path":["calls","hangup"],"query":[{"description":"Display the debug trace from asterisk manager","key":"debugAmiTrace","value":"true"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"hungUpChannles\": 1\n}"},{"id":"1ab43408-11aa-4e4d-b035-3e5797ce602b","name":"Bad Request - Request validation failed","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"body":{"mode":"raw","raw":"{\n  \"channels\": [\n    \"string\",\n    \"string\"\n  ]\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":{"raw":"{{baseUrl}}/calls/hangup?debugAmiTrace=true","host":["{{baseUrl}}"],"path":["calls","hangup"],"query":[{"description":"Display the debug trace from asterisk manager","key":"debugAmiTrace","value":"true"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"d64f7457-10e9-483d-8cbd-6f3b09011fd1"},{"name":"Start new call","id":"c739910a-7c6b-49a1-88d6-4245fdaf7805","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{basicAuthUsername}}"},{"key":"password","value":"{{basicAuthPassword}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"destination\": \"0035220333300\",\n  \"targets\": {\n    \"sip_devices\": [\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\",\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\"\n    ],\n    \"webrtc\": true,\n    \"twinning\": true,\n    \"teams\": true,\n    \"flipChannel\": \"Local/905a334f-5bf6-4ebc-85d3-2d5411187f68@C-TW-pbx16dev-00000057;2\"\n  },\n  \"source\": \"2017\",\n  \"caller_identity\": \"905a334f-5bf6-4ebc-85d3-2d5411187f68\",\n  \"tts\": [\n    {\n      \"tag\": \"welcome_message\",\n      \"message\": \"Hello World\"\n    }\n  ],\n  \"options\": {\n    \"dialed_user_id\": \"string\",\n    \"dialed_extension_number\": \"string\"\n  }\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/calls/new?debugAmiTrace=true&autoAnswer=false&forceDialBack=false&anonymous=false","description":"<h1 id=\"start-a-new-call-to-a-destination-from-a-user-or-device\">Start a new call to a destination from a User or Device</h1>\n<p>DialBack mode: we dial first the targets and once one of those has answered we dial the destination. This allows the user to select which device will be used to start a new call<br />When no targets are specified we dial all linked device for the user in DialBack mode.<br />When the source parameter is defined we dial the source number in dial back mode and ignore all the other targets.<br />When only one target.sip_devices (and no other targets) is specified we try to start the call via the Phone api if this fails we dial the device</p>\n","urlObject":{"path":["calls","new"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Display the debug trace from asterisk manager</p>\n","type":"text/plain"},"key":"debugAmiTrace","value":"true"},{"description":{"content":"<p>Auto Answer the call on the src device (default: false) (overrides default behaviors)</p>\n","type":"text/plain"},"key":"autoAnswer","value":"false"},{"description":{"content":"<p>Forces the pbx to start a call in DialBack mode (default: false) (overrides default behaviors)</p>\n","type":"text/plain"},"key":"forceDialBack","value":"false"},{"description":{"content":"<p>Should the call be anonymous (default: false)</p>\n","type":"text/plain"},"key":"anonymous","value":"false"}],"variable":[]}},"response":[{"id":"0de9ad7c-8983-41c0-ac78-f47a438a0de7","name":"Call Started","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"body":{"mode":"raw","raw":"{\n  \"destination\": \"0035220333300\",\n  \"targets\": {\n    \"sip_devices\": [\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\",\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\"\n    ],\n    \"webrtc\": true,\n    \"twinning\": true,\n    \"teams\": true,\n    \"flipChannel\": \"Local/905a334f-5bf6-4ebc-85d3-2d5411187f68@C-TW-pbx16dev-00000057;2\"\n  },\n  \"source\": \"2017\",\n  \"caller_identity\": \"905a334f-5bf6-4ebc-85d3-2d5411187f68\",\n  \"tts\": [\n    {\n      \"tag\": \"welcome_message\",\n      \"message\": \"Hello World\"\n    }\n  ],\n  \"options\": {\n    \"dialed_user_id\": \"string\",\n    \"dialed_extension_number\": \"string\"\n  }\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":{"raw":"{{baseUrl}}/calls/new?debugAmiTrace=true&autoAnswer=false&forceDialBack=false&anonymous=false","host":["{{baseUrl}}"],"path":["calls","new"],"query":[{"description":"Display the debug trace from asterisk manager","key":"debugAmiTrace","value":"true"},{"description":"Auto Answer the call on the src device (default: false) (overrides default behaviors)","key":"autoAnswer","value":"false"},{"description":"Forces the pbx to start a call in DialBack mode (default: false) (overrides default behaviors)","key":"forceDialBack","value":"false"},{"description":"Should the call be anonymous (default: false)","key":"anonymous","value":"false"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"ok\",\n  \"dialBack\": true,\n  \"destination\": \"0035220333000\",\n  \"targets\": {\n    \"sip_devices\": [\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\",\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\"\n    ],\n    \"webrtc\": true,\n    \"twinning\": true,\n    \"teams\": true\n  },\n  \"click2dial_id\": \"936a90653194073f7ce14f80b067186f68ab32749e1f1b8840d49bf6cd5c9e75\"\n}"},{"id":"1683a739-e6e7-4d91-bff3-51aebedc49b8","name":"Bad Request - Request validation failed","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"body":{"mode":"raw","raw":"{\n  \"destination\": \"0035220333300\",\n  \"targets\": {\n    \"sip_devices\": [\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\",\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\"\n    ],\n    \"webrtc\": true,\n    \"twinning\": true,\n    \"teams\": true,\n    \"flipChannel\": \"Local/905a334f-5bf6-4ebc-85d3-2d5411187f68@C-TW-pbx16dev-00000057;2\"\n  },\n  \"source\": \"2017\",\n  \"caller_identity\": \"905a334f-5bf6-4ebc-85d3-2d5411187f68\",\n  \"tts\": [\n    {\n      \"tag\": \"welcome_message\",\n      \"message\": \"Hello World\"\n    }\n  ],\n  \"options\": {\n    \"dialed_user_id\": \"string\",\n    \"dialed_extension_number\": \"string\"\n  }\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":{"raw":"{{baseUrl}}/calls/new?debugAmiTrace=true&autoAnswer=false&forceDialBack=false&anonymous=false","host":["{{baseUrl}}"],"path":["calls","new"],"query":[{"description":"Display the debug trace from asterisk manager","key":"debugAmiTrace","value":"true"},{"description":"Auto Answer the call on the src device (default: false) (overrides default behaviors)","key":"autoAnswer","value":"false"},{"description":"Forces the pbx to start a call in DialBack mode (default: false) (overrides default behaviors)","key":"forceDialBack","value":"false"},{"description":"Should the call be anonymous (default: false)","key":"anonymous","value":"false"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"c739910a-7c6b-49a1-88d6-4245fdaf7805"},{"name":"Deployment for phone","id":"2230768f-0e2e-40e4-be9d-7dc4e07fd919","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{bearerToken}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF","description":"<p>User agent used to determine the vendor and model of the phone</p>\n"}],"url":"{{baseUrl}}/phone/deployment?mac=AABBCCDDEEFF","description":"<p>Main Provisioning for the phones</p>\n","urlObject":{"path":["phone","deployment"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>MAC of the phone to deploy</p>\n","type":"text/plain"},"key":"mac","value":"AABBCCDDEEFF"}],"variable":[]}},"response":[{"id":"c74bcbd8-72d5-4577-ae4a-4e11f179bd13","name":"Phone configuration","originalRequest":{"method":"GET","header":[{"description":"User agent used to determine the vendor and model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"},{"description":"Added as a part of security scheme: bearer","key":"Authorization","value":"Bearer <token>"}],"url":{"raw":"{{baseUrl}}/phone/deployment?mac=AABBCCDDEEFF","host":["{{baseUrl}}"],"path":["phone","deployment"],"query":[{"description":"MAC of the phone to deploy","key":"mac","value":"AABBCCDDEEFF"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"2230768f-0e2e-40e4-be9d-7dc4e07fd919"},{"name":"Get the directory for phones","id":"455eea73-620d-4b7d-ba7c-09cd4b9f06cc","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"username"},{"key":"value","value":"{{apiKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"","description":"<p>User agent used to determine the vendor and model of the phone</p>\n"}],"url":"{{baseUrl}}/phone/directory?user_id=abcd1234&setting=directory","description":"<p>Get the phone directory</p>\n","urlObject":{"path":["phone","directory"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>The user ID</p>\n","type":"text/plain"},"key":"user_id","value":"abcd1234"},{"description":{"content":"<p>Setting to determine directory or super-search</p>\n","type":"text/plain"},"key":"setting","value":"directory"}],"variable":[]}},"response":[{"id":"a2a72845-84c0-4972-b54e-8b8bf4ef90d3","name":"Phone directory","originalRequest":{"method":"GET","header":[{"description":"User agent used to determine the vendor and model of the phone","key":"User-Agent","value":""}],"url":{"raw":"{{baseUrl}}/phone/directory?user_id=abcd1234&setting=directory&username=<API Key>","host":["{{baseUrl}}"],"path":["phone","directory"],"query":[{"description":"The user ID","key":"user_id","value":"abcd1234"},{"description":"Setting to determine directory or super-search","key":"setting","value":"directory"},{"description":"Added as a part of security scheme: apikey","key":"username","value":"<API Key>"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"455eea73-620d-4b7d-ba7c-09cd4b9f06cc"},{"name":"Enable / Disable DND from a phone","id":"b6d7b167-242a-4a5b-8272-59f034380236","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"username"},{"key":"value","value":"{{apiKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF","description":"<p>User agent used to determine the vendor and model of the phone</p>\n"}],"url":"{{baseUrl}}/phone/dnd[/{{status}}]?mac=AABBCCDDEEFF&user_id=123&activeUser=<instance>_<user.id>_<calleridentity.id>","description":"<p>Enable / Disable DND</p>\n","urlObject":{"path":["phone","dnd[","{{status}}]"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>MAC of the phone to deploy</p>\n","type":"text/plain"},"key":"mac","value":"AABBCCDDEEFF"},{"description":{"content":"<p>Id of the user</p>\n","type":"text/plain"},"key":"user_id","value":"123"},{"description":{"content":"<p>Username of the line to activate or deactivate</p>\n","type":"text/plain"},"key":"activeUser","value":"<instance>_<user.id>_<calleridentity.id>"}],"variable":[]}},"response":[{"id":"284d8a72-ab1c-45e5-a4c3-a961400ca5ea","name":"Phone reply","originalRequest":{"method":"GET","header":[{"description":"User agent used to determine the vendor and model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"}],"url":{"raw":"{{baseUrl}}/phone/dnd[/{{status}}]?mac=AABBCCDDEEFF&user_id=123&activeUser=<instance>_<user.id>_<calleridentity.id>&username=<API Key>","host":["{{baseUrl}}"],"path":["phone","dnd[","{{status}}]"],"query":[{"description":"MAC of the phone to deploy","key":"mac","value":"AABBCCDDEEFF"},{"description":"Id of the user","key":"user_id","value":"123"},{"description":"Username of the line to activate or deactivate","key":"activeUser","value":"<instance>_<user.id>_<calleridentity.id>"},{"description":"Added as a part of security scheme: apikey","key":"username","value":"<API Key>"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"b6d7b167-242a-4a5b-8272-59f034380236"},{"name":"Enable / Disable forwards from a phone","id":"cd6e4a27-2a0a-4157-bde1-45e86dbcd09d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"username"},{"key":"value","value":"{{apiKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF","description":"<p>User-Agent used to determine the vendor and the model of the phone</p>\n"}],"url":"{{baseUrl}}/phone/forwards?action=on&event=always&target=20333000&mac=AABBCCDDEEFF&user_id=123&activeUser=<instance>_<user.id>_<calleridentity.id>","description":"<p>Enable / Disable forwards via a phone or button on a phone linked to the user</p>\n","urlObject":{"path":["phone","forwards"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Set the status of the forwards</p>\n","type":"text/plain"},"key":"action","value":"on"},{"description":{"content":"<p>For what event we want to check</p>\n","type":"text/plain"},"key":"event","value":"always"},{"description":{"content":"<p>Forward Target</p>\n","type":"text/plain"},"key":"target","value":"20333000"},{"description":{"content":"<p>MAC of the phone to deploy</p>\n","type":"text/plain"},"key":"mac","value":"AABBCCDDEEFF"},{"description":{"content":"<p>Id of the user</p>\n","type":"text/plain"},"key":"user_id","value":"123"},{"description":{"content":"<p>Username of the line to activate or deactivate</p>\n","type":"text/plain"},"key":"activeUser","value":"<instance>_<user.id>_<calleridentity.id>"}],"variable":[]}},"response":[{"id":"4e39fc9b-f49e-4dcf-bd36-bd576c6a2849","name":"Phone reply","originalRequest":{"method":"GET","header":[{"description":"User-Agent used to determine the vendor and the model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"}],"url":{"raw":"{{baseUrl}}/phone/forwards?action=on&event=always&target=20333000&mac=AABBCCDDEEFF&user_id=123&activeUser=<instance>_<user.id>_<calleridentity.id>&username=<API Key>","host":["{{baseUrl}}"],"path":["phone","forwards"],"query":[{"description":"Set the status of the forwards","key":"action","value":"on"},{"description":"For what event we want to check","key":"event","value":"always"},{"description":"Forward Target","key":"target","value":"20333000"},{"description":"MAC of the phone to deploy","key":"mac","value":"AABBCCDDEEFF"},{"description":"Id of the user","key":"user_id","value":"123"},{"description":"Username of the line to activate or deactivate","key":"activeUser","value":"<instance>_<user.id>_<calleridentity.id>"},{"description":"Added as a part of security scheme: apikey","key":"username","value":"<API Key>"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""},{"id":"78e56b35-7114-48fb-ba95-bb82cb75bb8f","name":"Bad request","originalRequest":{"method":"GET","header":[{"description":"User-Agent used to determine the vendor and the model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"}],"url":{"raw":"{{baseUrl}}/phone/forwards?action=on&event=always&target=20333000&mac=AABBCCDDEEFF&user_id=123&activeUser=<instance>_<user.id>_<calleridentity.id>&username=<API Key>","host":["{{baseUrl}}"],"path":["phone","forwards"],"query":[{"description":"Set the status of the forwards","key":"action","value":"on"},{"description":"For what event we want to check","key":"event","value":"always"},{"description":"Forward Target","key":"target","value":"20333000"},{"description":"MAC of the phone to deploy","key":"mac","value":"AABBCCDDEEFF"},{"description":"Id of the user","key":"user_id","value":"123"},{"description":"Username of the line to activate or deactivate","key":"activeUser","value":"<instance>_<user.id>_<calleridentity.id>"},{"description":"Added as a part of security scheme: apikey","key":"username","value":"<API Key>"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"cd6e4a27-2a0a-4157-bde1-45e86dbcd09d"},{"name":"Enable / Disable forwards for a user via a button","id":"1c7a2052-781f-4f31-9684-2cbe7217b605","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{basicAuthUsername}}"},{"key":"password","value":"{{basicAuthPassword}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF","description":"<p>User-Agent used to determine the vendor and the model of the phone</p>\n"}],"url":"{{baseUrl}}/user/forwards?action=on&event=always&target=20333000","description":"<p>Enable / Disable forwards for a user via a button on a phone not linked to the user</p>\n","urlObject":{"path":["user","forwards"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Set the status of the forwards</p>\n","type":"text/plain"},"key":"action","value":"on"},{"description":{"content":"<p>For what event we want to check</p>\n","type":"text/plain"},"key":"event","value":"always"},{"description":{"content":"<p>Forward Target</p>\n","type":"text/plain"},"key":"target","value":"20333000"}],"variable":[]}},"response":[{"id":"a8711de2-7809-42c7-b3e9-ca34379be6ae","name":"Phone reply","originalRequest":{"method":"GET","header":[{"description":"User-Agent used to determine the vendor and the model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"},{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"url":{"raw":"{{baseUrl}}/user/forwards?action=on&event=always&target=20333000","host":["{{baseUrl}}"],"path":["user","forwards"],"query":[{"description":"Set the status of the forwards","key":"action","value":"on"},{"description":"For what event we want to check","key":"event","value":"always"},{"description":"Forward Target","key":"target","value":"20333000"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""},{"id":"124d3bcb-4c3c-4cb7-921f-1c0a0d6059f4","name":"Bad request","originalRequest":{"method":"GET","header":[{"description":"User-Agent used to determine the vendor and the model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"},{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"url":{"raw":"{{baseUrl}}/user/forwards?action=on&event=always&target=20333000","host":["{{baseUrl}}"],"path":["user","forwards"],"query":[{"description":"Set the status of the forwards","key":"action","value":"on"},{"description":"For what event we want to check","key":"event","value":"always"},{"description":"Forward Target","key":"target","value":"20333000"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"1c7a2052-781f-4f31-9684-2cbe7217b605"},{"name":"Deployment for Gigaset","id":"aa587178-7733-4485-8b16-69f0a0afc6be","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{bearerToken}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Gigaset N870 IP PRO/83.V2.57.0...;589EC65D1E59;Handset=50","description":"<p>User agent sent by the device</p>\n"}],"url":"{{baseUrl}}/phone/deployment/gigaset/:key/:filename","description":"<p>Provisioning endpoint for Gigaset devices</p>\n","urlObject":{"path":["phone","deployment","gigaset",":key",":filename"],"host":["{{baseUrl}}"],"query":[],"variable":[{"id":"d91dcf40-646f-45f0-8974-7c5bbe0f6891","description":{"content":"<p>Instance API key (path param)</p>\n","type":"text/plain"},"type":"any","value":"pbx16dev-...","key":"key"},{"id":"ee05c96e-1b94-4db6-9b94-25ee6c36bc7c","description":{"content":"<p>gigaset addition for autoprov</p>\n","type":"text/plain"},"type":"any","value":"provisioning.xml","key":"filename"}]}},"response":[{"id":"0fca4da5-afeb-41fb-b762-87f0dd4002f2","name":"Gigaset configuration","originalRequest":{"method":"GET","header":[{"description":"User agent sent by the device","key":"User-Agent","value":"Gigaset N870 IP PRO/83.V2.57.0...;589EC65D1E59;Handset=50"},{"description":"Added as a part of security scheme: bearer","key":"Authorization","value":"Bearer <token>"}],"url":{"raw":"{{baseUrl}}/phone/deployment/gigaset/:key/:filename","host":["{{baseUrl}}"],"path":["phone","deployment","gigaset",":key",":filename"],"variable":[{"key":"key","value":"pbx16dev-...","description":"Instance API key (path param)"},{"key":"filename","value":"provisioning.xml","description":"gigaset addition for autoprov"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"aa587178-7733-4485-8b16-69f0a0afc6be"},{"name":"Get the directory for Gigaset devices","id":"fb40579c-34d3-4407-af31-73e4b0b3a5ab","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"username"},{"key":"value","value":"{{apiKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Gigaset N870 IP PRO ...","description":"<p>User agent used to determine vendor/model (if needed)</p>\n"}],"url":"{{baseUrl}}/phone/directory/gigaset/:key","description":"<p>Get the shared Gigaset directory (one directory per DECT manager)</p>\n","urlObject":{"path":["phone","directory","gigaset",":key"],"host":["{{baseUrl}}"],"query":[],"variable":[{"id":"fc7a4a04-0e9b-403f-bbfa-005366597381","type":"any","key":"key"}]}},"response":[{"id":"555d13a5-6f93-4687-a701-47588b04b3d7","name":"Gigaset directory","originalRequest":{"method":"GET","header":[{"description":"User agent used to determine vendor/model (if needed)","key":"User-Agent","value":"Gigaset N870 IP PRO ..."}],"url":{"raw":"{{baseUrl}}/phone/directory/gigaset/:key?username=<API Key>","host":["{{baseUrl}}"],"path":["phone","directory","gigaset",":key"],"query":[{"description":"Added as a part of security scheme: apikey","key":"username","value":"<API Key>"}],"variable":[{"key":"key"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"fb40579c-34d3-4407-af31-73e4b0b3a5ab"},{"name":"Class OptionsController","id":"99e595bc-a7f1-44b4-b019-2e03ca3532dd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"username"},{"key":"value","value":"{{apiKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF","description":"<p>User agent used to determine the vendor and model of the phone</p>\n"}],"url":"{{baseUrl}}/phone/options/info?user_id=123","description":"<p>Get debug infos</p>\n","urlObject":{"path":["phone","options","info"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Id of the user</p>\n","type":"text/plain"},"key":"user_id","value":"123"}],"variable":[]}},"response":[{"id":"69fbeb32-fb78-4c95-8666-7acac061a924","name":"Phone debug info","originalRequest":{"method":"GET","header":[{"description":"User agent used to determine the vendor and model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"}],"url":{"raw":"{{baseUrl}}/phone/options/info?user_id=123&username=<API Key>","host":["{{baseUrl}}"],"path":["phone","options","info"],"query":[{"description":"Id of the user","key":"user_id","value":"123"},{"description":"Added as a part of security scheme: apikey","key":"username","value":"<API Key>"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"99e595bc-a7f1-44b4-b019-2e03ca3532dd"},{"name":"Class SyncController","id":"e386990f-6dc1-4848-8232-b9c869b16d70","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"username"},{"key":"value","value":"{{apiKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF","description":"<p>User agent used to determine the vendor and model of the phone</p>\n"}],"url":"{{baseUrl}}/phone/options/sync?user_id=123","description":"<p>Init config sync</p>\n","urlObject":{"path":["phone","options","sync"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Id of the user</p>\n","type":"text/plain"},"key":"user_id","value":"123"}],"variable":[]}},"response":[{"id":"0ccba2a8-a6fe-4322-b372-55870d4d5d15","name":"Phone config sync reply","originalRequest":{"method":"GET","header":[{"description":"User agent used to determine the vendor and model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"}],"url":{"raw":"{{baseUrl}}/phone/options/sync?user_id=123&username=<API Key>","host":["{{baseUrl}}"],"path":["phone","options","sync"],"query":[{"description":"Id of the user","key":"user_id","value":"123"},{"description":"Added as a part of security scheme: apikey","key":"username","value":"<API Key>"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"e386990f-6dc1-4848-8232-b9c869b16d70"},{"name":"Get options menu for phones","id":"28a9a47b-9203-4cf2-8722-b893a484f27f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"username"},{"key":"value","value":"{{apiKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF","description":"<p>User agent used to determine the vendor and model of the phone</p>\n"}],"url":"{{baseUrl}}/phone/options?user_id=123","description":"<p>Get options menu</p>\n","urlObject":{"path":["phone","options"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Id of the user</p>\n","type":"text/plain"},"key":"user_id","value":"123"}],"variable":[]}},"response":[{"id":"44efde3b-de2f-4d4a-b51c-b7e014aaf4b2","name":"Phone options menu","originalRequest":{"method":"GET","header":[{"description":"User agent used to determine the vendor and model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"}],"url":{"raw":"{{baseUrl}}/phone/options?user_id=123&username=<API Key>","host":["{{baseUrl}}"],"path":["phone","options"],"query":[{"description":"Id of the user","key":"user_id","value":"123"},{"description":"Added as a part of security scheme: apikey","key":"username","value":"<API Key>"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"28a9a47b-9203-4cf2-8722-b893a484f27f"},{"name":"Control your phone","id":"bd82f0dc-9071-493e-8f8b-c5af330b2629","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{basicAuthUsername}}"},{"key":"password","value":"{{basicAuthPassword}}"}]},"isInherited":false},"method":"GET","header":[],"url":"{{baseUrl}}/phoneControl/action?debugAmiTrace=true&action=false&sip_device_id=a469de67-b79a-4dea-87d2-9a15858f10cd","description":"<p>Remotely control your phone</p>\n","urlObject":{"path":["phoneControl","action"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Display the debug trace from asterisk manager</p>\n","type":"text/plain"},"key":"debugAmiTrace","value":"true"},{"description":{"content":"<p>Action to be performed</p>\n","type":"text/plain"},"key":"action","value":"false"},{"description":{"content":"<p>Id of the sip device you want to perform the action from</p>\n","type":"text/plain"},"key":"sip_device_id","value":"a469de67-b79a-4dea-87d2-9a15858f10cd"}],"variable":[]}},"response":[{"id":"e3a91a62-d76b-4a99-9f8e-977357012f69","name":"Action Performed","originalRequest":{"method":"GET","header":[{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"url":{"raw":"{{baseUrl}}/phoneControl/action?debugAmiTrace=true&action=false&sip_device_id=a469de67-b79a-4dea-87d2-9a15858f10cd","host":["{{baseUrl}}"],"path":["phoneControl","action"],"query":[{"description":"Display the debug trace from asterisk manager","key":"debugAmiTrace","value":"true"},{"description":"Action to be performed","key":"action","value":"false"},{"description":"Id of the sip device you want to perform the action from","key":"sip_device_id","value":"a469de67-b79a-4dea-87d2-9a15858f10cd"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""},{"id":"ce765678-2226-486c-83e6-38ebceb01889","name":"Bad Request - Request validation failed","originalRequest":{"method":"GET","header":[{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"url":{"raw":"{{baseUrl}}/phoneControl/action?debugAmiTrace=true&action=false&sip_device_id=a469de67-b79a-4dea-87d2-9a15858f10cd","host":["{{baseUrl}}"],"path":["phoneControl","action"],"query":[{"description":"Display the debug trace from asterisk manager","key":"debugAmiTrace","value":"true"},{"description":"Action to be performed","key":"action","value":"false"},{"description":"Id of the sip device you want to perform the action from","key":"sip_device_id","value":"a469de67-b79a-4dea-87d2-9a15858f10cd"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"bd82f0dc-9071-493e-8f8b-c5af330b2629"},{"name":"Get user info","id":"b4a9d5d6-6e07-4b4e-b969-4e8833332232","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{basicAuthUsername}}"},{"key":"password","value":"{{basicAuthPassword}}"}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/user","description":"<p>Get the all the Phone infos of the currently Authenticated user</p>\n","urlObject":{"path":["user"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"0d7ca011-fa92-4e02-a7ce-4741592a5325","name":"Current user information","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"},{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"url":"{{baseUrl}}/user"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"username\": \"string\",\n  \"pbxInstance\": {\n    \"instanceName\": \"instance\",\n    \"pbxType\": \"VoxbiPBX\"\n  },\n  \"extensions\": [\n    {\n      \"number\": \"1234\",\n      \"devices\": [\n        {\n          \"channelType\": \"PJSIP\",\n          \"number\": \"520\",\n          \"username\": \"devpbx_520\",\n          \"password\": \"foobar123\"\n        },\n        {\n          \"channelType\": \"PJSIP\",\n          \"number\": \"520\",\n          \"username\": \"devpbx_520\",\n          \"password\": \"foobar123\"\n        }\n      ]\n    },\n    {\n      \"number\": \"1234\",\n      \"devices\": [\n        {\n          \"channelType\": \"PJSIP\",\n          \"number\": \"520\",\n          \"username\": \"devpbx_520\",\n          \"password\": \"foobar123\"\n        },\n        {\n          \"channelType\": \"PJSIP\",\n          \"number\": \"520\",\n          \"username\": \"devpbx_520\",\n          \"password\": \"foobar123\"\n        }\n      ]\n    }\n  ]\n}"}],"_postman_id":"b4a9d5d6-6e07-4b4e-b969-4e8833332232"}],"id":"f9abf2f0-935a-4ae9-ac54-d2fac31fcb47","description":"<p>Version 1 of the api</p>\n","_postman_id":"f9abf2f0-935a-4ae9-ac54-d2fac31fcb47"},{"name":"Phone","item":[{"name":"Deployment for phone","id":"0b0dac34-c957-4daa-ae58-24e035ff0f52","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{bearerToken}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF","description":"<p>User agent used to determine the vendor and model of the phone</p>\n"}],"url":"{{baseUrl}}/phone/deployment?mac=AABBCCDDEEFF","description":"<p>Main Provisioning for the phones</p>\n","urlObject":{"path":["phone","deployment"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>MAC of the phone to deploy</p>\n","type":"text/plain"},"key":"mac","value":"AABBCCDDEEFF"}],"variable":[]}},"response":[{"id":"8408a1c3-7c31-4c18-b9ec-761661333200","name":"Phone configuration","originalRequest":{"method":"GET","header":[{"description":"User agent used to determine the vendor and model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"},{"description":"Added as a part of security scheme: bearer","key":"Authorization","value":"Bearer <token>"}],"url":{"raw":"{{baseUrl}}/phone/deployment?mac=AABBCCDDEEFF","host":["{{baseUrl}}"],"path":["phone","deployment"],"query":[{"description":"MAC of the phone to deploy","key":"mac","value":"AABBCCDDEEFF"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"0b0dac34-c957-4daa-ae58-24e035ff0f52"},{"name":"Get the directory for phones","id":"6ef1b125-8583-465f-82cd-20cd6ef6b9d5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"username"},{"key":"value","value":"{{apiKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"","description":"<p>User agent used to determine the vendor and model of the phone</p>\n"}],"url":"{{baseUrl}}/phone/directory?user_id=abcd1234&setting=directory","description":"<p>Get the phone directory</p>\n","urlObject":{"path":["phone","directory"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>The user ID</p>\n","type":"text/plain"},"key":"user_id","value":"abcd1234"},{"description":{"content":"<p>Setting to determine directory or super-search</p>\n","type":"text/plain"},"key":"setting","value":"directory"}],"variable":[]}},"response":[{"id":"e002f7b4-93e8-43f3-825d-df7e196c211e","name":"Phone directory","originalRequest":{"method":"GET","header":[{"description":"User agent used to determine the vendor and model of the phone","key":"User-Agent","value":""}],"url":{"raw":"{{baseUrl}}/phone/directory?user_id=abcd1234&setting=directory&username=<API Key>","host":["{{baseUrl}}"],"path":["phone","directory"],"query":[{"description":"The user ID","key":"user_id","value":"abcd1234"},{"description":"Setting to determine directory or super-search","key":"setting","value":"directory"},{"description":"Added as a part of security scheme: apikey","key":"username","value":"<API Key>"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"6ef1b125-8583-465f-82cd-20cd6ef6b9d5"},{"name":"Enable / Disable DND from a phone","id":"603d28ef-b608-467f-8435-1d61089136fa","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"username"},{"key":"value","value":"{{apiKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF","description":"<p>User agent used to determine the vendor and model of the phone</p>\n"}],"url":"{{baseUrl}}/phone/dnd[/{{status}}]?mac=AABBCCDDEEFF&user_id=123&activeUser=<instance>_<user.id>_<calleridentity.id>","description":"<p>Enable / Disable DND</p>\n","urlObject":{"path":["phone","dnd[","{{status}}]"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>MAC of the phone to deploy</p>\n","type":"text/plain"},"key":"mac","value":"AABBCCDDEEFF"},{"description":{"content":"<p>Id of the user</p>\n","type":"text/plain"},"key":"user_id","value":"123"},{"description":{"content":"<p>Username of the line to activate or deactivate</p>\n","type":"text/plain"},"key":"activeUser","value":"<instance>_<user.id>_<calleridentity.id>"}],"variable":[]}},"response":[{"id":"3a507e6c-b43c-4be9-a20f-f9114f196e36","name":"Phone reply","originalRequest":{"method":"GET","header":[{"description":"User agent used to determine the vendor and model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"}],"url":{"raw":"{{baseUrl}}/phone/dnd[/{{status}}]?mac=AABBCCDDEEFF&user_id=123&activeUser=<instance>_<user.id>_<calleridentity.id>&username=<API Key>","host":["{{baseUrl}}"],"path":["phone","dnd[","{{status}}]"],"query":[{"description":"MAC of the phone to deploy","key":"mac","value":"AABBCCDDEEFF"},{"description":"Id of the user","key":"user_id","value":"123"},{"description":"Username of the line to activate or deactivate","key":"activeUser","value":"<instance>_<user.id>_<calleridentity.id>"},{"description":"Added as a part of security scheme: apikey","key":"username","value":"<API Key>"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"603d28ef-b608-467f-8435-1d61089136fa"},{"name":"Enable / Disable forwards from a phone","id":"f63d1bf2-ba25-4673-8834-937b95d031fd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"username"},{"key":"value","value":"{{apiKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF","description":"<p>User-Agent used to determine the vendor and the model of the phone</p>\n"}],"url":"{{baseUrl}}/phone/forwards?action=on&event=always&target=20333000&mac=AABBCCDDEEFF&user_id=123&activeUser=<instance>_<user.id>_<calleridentity.id>","description":"<p>Enable / Disable forwards via a phone or button on a phone linked to the user</p>\n","urlObject":{"path":["phone","forwards"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Set the status of the forwards</p>\n","type":"text/plain"},"key":"action","value":"on"},{"description":{"content":"<p>For what event we want to check</p>\n","type":"text/plain"},"key":"event","value":"always"},{"description":{"content":"<p>Forward Target</p>\n","type":"text/plain"},"key":"target","value":"20333000"},{"description":{"content":"<p>MAC of the phone to deploy</p>\n","type":"text/plain"},"key":"mac","value":"AABBCCDDEEFF"},{"description":{"content":"<p>Id of the user</p>\n","type":"text/plain"},"key":"user_id","value":"123"},{"description":{"content":"<p>Username of the line to activate or deactivate</p>\n","type":"text/plain"},"key":"activeUser","value":"<instance>_<user.id>_<calleridentity.id>"}],"variable":[]}},"response":[{"id":"98ef405f-88be-4b71-835e-67dd00668994","name":"Phone reply","originalRequest":{"method":"GET","header":[{"description":"User-Agent used to determine the vendor and the model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"}],"url":{"raw":"{{baseUrl}}/phone/forwards?action=on&event=always&target=20333000&mac=AABBCCDDEEFF&user_id=123&activeUser=<instance>_<user.id>_<calleridentity.id>&username=<API Key>","host":["{{baseUrl}}"],"path":["phone","forwards"],"query":[{"description":"Set the status of the forwards","key":"action","value":"on"},{"description":"For what event we want to check","key":"event","value":"always"},{"description":"Forward Target","key":"target","value":"20333000"},{"description":"MAC of the phone to deploy","key":"mac","value":"AABBCCDDEEFF"},{"description":"Id of the user","key":"user_id","value":"123"},{"description":"Username of the line to activate or deactivate","key":"activeUser","value":"<instance>_<user.id>_<calleridentity.id>"},{"description":"Added as a part of security scheme: apikey","key":"username","value":"<API Key>"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""},{"id":"2c116dee-46fe-4514-988c-30103335c2f7","name":"Bad request","originalRequest":{"method":"GET","header":[{"description":"User-Agent used to determine the vendor and the model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"}],"url":{"raw":"{{baseUrl}}/phone/forwards?action=on&event=always&target=20333000&mac=AABBCCDDEEFF&user_id=123&activeUser=<instance>_<user.id>_<calleridentity.id>&username=<API Key>","host":["{{baseUrl}}"],"path":["phone","forwards"],"query":[{"description":"Set the status of the forwards","key":"action","value":"on"},{"description":"For what event we want to check","key":"event","value":"always"},{"description":"Forward Target","key":"target","value":"20333000"},{"description":"MAC of the phone to deploy","key":"mac","value":"AABBCCDDEEFF"},{"description":"Id of the user","key":"user_id","value":"123"},{"description":"Username of the line to activate or deactivate","key":"activeUser","value":"<instance>_<user.id>_<calleridentity.id>"},{"description":"Added as a part of security scheme: apikey","key":"username","value":"<API Key>"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"f63d1bf2-ba25-4673-8834-937b95d031fd"},{"name":"Enable / Disable forwards for a user via a button","id":"61ec4edf-fe5b-4fb0-9bd2-320e1fb0af92","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{basicAuthUsername}}"},{"key":"password","value":"{{basicAuthPassword}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF","description":"<p>User-Agent used to determine the vendor and the model of the phone</p>\n"}],"url":"{{baseUrl}}/user/forwards?action=on&event=always&target=20333000","description":"<p>Enable / Disable forwards for a user via a button on a phone not linked to the user</p>\n","urlObject":{"path":["user","forwards"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Set the status of the forwards</p>\n","type":"text/plain"},"key":"action","value":"on"},{"description":{"content":"<p>For what event we want to check</p>\n","type":"text/plain"},"key":"event","value":"always"},{"description":{"content":"<p>Forward Target</p>\n","type":"text/plain"},"key":"target","value":"20333000"}],"variable":[]}},"response":[{"id":"0e6b8ae3-f508-422a-abcc-ffd62b88ff9f","name":"Phone reply","originalRequest":{"method":"GET","header":[{"description":"User-Agent used to determine the vendor and the model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"},{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"url":{"raw":"{{baseUrl}}/user/forwards?action=on&event=always&target=20333000","host":["{{baseUrl}}"],"path":["user","forwards"],"query":[{"description":"Set the status of the forwards","key":"action","value":"on"},{"description":"For what event we want to check","key":"event","value":"always"},{"description":"Forward Target","key":"target","value":"20333000"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""},{"id":"17ba125f-d89a-4982-bcae-c8b2e9f25a3b","name":"Bad request","originalRequest":{"method":"GET","header":[{"description":"User-Agent used to determine the vendor and the model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"},{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"url":{"raw":"{{baseUrl}}/user/forwards?action=on&event=always&target=20333000","host":["{{baseUrl}}"],"path":["user","forwards"],"query":[{"description":"Set the status of the forwards","key":"action","value":"on"},{"description":"For what event we want to check","key":"event","value":"always"},{"description":"Forward Target","key":"target","value":"20333000"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"61ec4edf-fe5b-4fb0-9bd2-320e1fb0af92"},{"name":"Deployment for Gigaset","id":"2db3b5bc-7396-4580-a621-ca92a10237ff","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{bearerToken}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Gigaset N870 IP PRO/83.V2.57.0...;589EC65D1E59;Handset=50","description":"<p>User agent sent by the device</p>\n"}],"url":"{{baseUrl}}/phone/deployment/gigaset/:key/:filename","description":"<p>Provisioning endpoint for Gigaset devices</p>\n","urlObject":{"path":["phone","deployment","gigaset",":key",":filename"],"host":["{{baseUrl}}"],"query":[],"variable":[{"id":"badfad51-7967-4c75-a94a-7715be152ac2","description":{"content":"<p>Instance API key (path param)</p>\n","type":"text/plain"},"type":"any","value":"pbx16dev-...","key":"key"},{"id":"bdde6edf-36ed-4028-a11d-9865e456a6c8","description":{"content":"<p>gigaset addition for autoprov</p>\n","type":"text/plain"},"type":"any","value":"provisioning.xml","key":"filename"}]}},"response":[{"id":"a91727c4-b6b8-4580-bb17-b2aeb61e23c2","name":"Gigaset configuration","originalRequest":{"method":"GET","header":[{"description":"User agent sent by the device","key":"User-Agent","value":"Gigaset N870 IP PRO/83.V2.57.0...;589EC65D1E59;Handset=50"},{"description":"Added as a part of security scheme: bearer","key":"Authorization","value":"Bearer <token>"}],"url":{"raw":"{{baseUrl}}/phone/deployment/gigaset/:key/:filename","host":["{{baseUrl}}"],"path":["phone","deployment","gigaset",":key",":filename"],"variable":[{"key":"key","value":"pbx16dev-...","description":"Instance API key (path param)"},{"key":"filename","value":"provisioning.xml","description":"gigaset addition for autoprov"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"2db3b5bc-7396-4580-a621-ca92a10237ff"},{"name":"Get the directory for Gigaset devices","id":"1232a24e-4d52-40b1-8ee6-3f5a3494e6a4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"username"},{"key":"value","value":"{{apiKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Gigaset N870 IP PRO ...","description":"<p>User agent used to determine vendor/model (if needed)</p>\n"}],"url":"{{baseUrl}}/phone/directory/gigaset/:key","description":"<p>Get the shared Gigaset directory (one directory per DECT manager)</p>\n","urlObject":{"path":["phone","directory","gigaset",":key"],"host":["{{baseUrl}}"],"query":[],"variable":[{"id":"e872a9ff-eb7a-4ffa-a2e0-0459f5201194","type":"any","key":"key"}]}},"response":[{"id":"b5d437f1-2ff8-45bd-a9be-69f1f3df3878","name":"Gigaset directory","originalRequest":{"method":"GET","header":[{"description":"User agent used to determine vendor/model (if needed)","key":"User-Agent","value":"Gigaset N870 IP PRO ..."}],"url":{"raw":"{{baseUrl}}/phone/directory/gigaset/:key?username=<API Key>","host":["{{baseUrl}}"],"path":["phone","directory","gigaset",":key"],"query":[{"description":"Added as a part of security scheme: apikey","key":"username","value":"<API Key>"}],"variable":[{"key":"key"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"1232a24e-4d52-40b1-8ee6-3f5a3494e6a4"},{"name":"Class OptionsController","id":"1ffe51ff-d822-42b2-a100-ca317280c5d3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"username"},{"key":"value","value":"{{apiKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF","description":"<p>User agent used to determine the vendor and model of the phone</p>\n"}],"url":"{{baseUrl}}/phone/options/info?user_id=123","description":"<p>Get debug infos</p>\n","urlObject":{"path":["phone","options","info"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Id of the user</p>\n","type":"text/plain"},"key":"user_id","value":"123"}],"variable":[]}},"response":[{"id":"23db9d73-13fa-4788-b44a-c81e598712e8","name":"Phone debug info","originalRequest":{"method":"GET","header":[{"description":"User agent used to determine the vendor and model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"}],"url":{"raw":"{{baseUrl}}/phone/options/info?user_id=123&username=<API Key>","host":["{{baseUrl}}"],"path":["phone","options","info"],"query":[{"description":"Id of the user","key":"user_id","value":"123"},{"description":"Added as a part of security scheme: apikey","key":"username","value":"<API Key>"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"1ffe51ff-d822-42b2-a100-ca317280c5d3"},{"name":"Class SyncController","id":"6d3e5567-1de9-4b96-98f9-a7243417f2d5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"username"},{"key":"value","value":"{{apiKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF","description":"<p>User agent used to determine the vendor and model of the phone</p>\n"}],"url":"{{baseUrl}}/phone/options/sync?user_id=123","description":"<p>Init config sync</p>\n","urlObject":{"path":["phone","options","sync"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Id of the user</p>\n","type":"text/plain"},"key":"user_id","value":"123"}],"variable":[]}},"response":[{"id":"87b0f687-2b94-4898-899a-bb4eddca4a69","name":"Phone config sync reply","originalRequest":{"method":"GET","header":[{"description":"User agent used to determine the vendor and model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"}],"url":{"raw":"{{baseUrl}}/phone/options/sync?user_id=123&username=<API Key>","host":["{{baseUrl}}"],"path":["phone","options","sync"],"query":[{"description":"Id of the user","key":"user_id","value":"123"},{"description":"Added as a part of security scheme: apikey","key":"username","value":"<API Key>"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"6d3e5567-1de9-4b96-98f9-a7243417f2d5"},{"name":"Get options menu for phones","id":"65816e98-c0c6-4ffd-85ff-160c8a92f62a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"username"},{"key":"value","value":"{{apiKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF","description":"<p>User agent used to determine the vendor and model of the phone</p>\n"}],"url":"{{baseUrl}}/phone/options?user_id=123","description":"<p>Get options menu</p>\n","urlObject":{"path":["phone","options"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Id of the user</p>\n","type":"text/plain"},"key":"user_id","value":"123"}],"variable":[]}},"response":[{"id":"d7f0f4b8-613b-4dad-8977-dc766e774aed","name":"Phone options menu","originalRequest":{"method":"GET","header":[{"description":"User agent used to determine the vendor and model of the phone","key":"User-Agent","value":"Yealink SIP-T53 XX.XX.YY.ZZ AA:BB:CC:DD:EE:FF"}],"url":{"raw":"{{baseUrl}}/phone/options?user_id=123&username=<API Key>","host":["{{baseUrl}}"],"path":["phone","options"],"query":[{"description":"Id of the user","key":"user_id","value":"123"},{"description":"Added as a part of security scheme: apikey","key":"username","value":"<API Key>"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"65816e98-c0c6-4ffd-85ff-160c8a92f62a"}],"id":"2eed877a-a5ce-40c1-98d3-6351c3d7e12a","description":"<p>Actions used by the phones to interact with the PBX</p>\n","_postman_id":"2eed877a-a5ce-40c1-98d3-6351c3d7e12a"},{"name":"Calls","item":[{"name":"Start new call","id":"ea449bfb-560b-4a01-94f3-462c21b0e8af","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{basicAuthUsername}}"},{"key":"password","value":"{{basicAuthPassword}}"}]},"isInherited":false},"method":"GET","header":[],"url":"{{baseUrl}}/calls/new/tapi?debugAmiTrace=true&destination=20333300&targets=a469de67-b79a-4dea-87d2-9a15858f10cd,webrtc,twinning,teams&caller_identity=905a334f-5bf6-4ebc-85d3-2d5411187f68&autoAnswer=false&forceDialBack=false&anonymous=false","description":"<h1 id=\"start-a-new-call-to-a-destination-from-a-user-using-the-xtelsio-tapi\">Start a new call to a destination from a User using the <a href=\"https://www.xtelsio.com/en/products/ast_tsp/tapi_for_asterisk.htm\">xtelsio Tapi</a></h1>\n<p>DialBack mode: we dial first the targets and once one of those has answered we dial the destination. This allows the user to select which device will be used to start a new call<br />When no targets are specified we dial all linked device for the user in DialBack mode.<br />When only one target.sip_devices (and no other targets) is specified we try to start the call via the Phone api if this fails we dial the device\nWhen the target is webrtc and we only have one instance of voxbi open we don't use DialBack mode</p>\n","urlObject":{"path":["calls","new","tapi"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Display the debug trace from asterisk manager</p>\n","type":"text/plain"},"key":"debugAmiTrace","value":"true"},{"description":{"content":"<p>Destination number to dial</p>\n","type":"text/plain"},"key":"destination","value":"20333300"},{"description":{"content":"<p>Target device used to start the call</p>\n","type":"text/plain"},"key":"targets","value":"a469de67-b79a-4dea-87d2-9a15858f10cd,webrtc,twinning,teams"},{"description":{"content":"<p>Specify the caller identity of the call</p>\n","type":"text/plain"},"key":"caller_identity","value":"905a334f-5bf6-4ebc-85d3-2d5411187f68"},{"description":{"content":"<p>Auto Answer the call on the src device (default: false) (overrides default behaviors)</p>\n","type":"text/plain"},"key":"autoAnswer","value":"false"},{"description":{"content":"<p>Forces the pbx to start a call in DialBack mode (default: false) (overrides default behaviors)</p>\n","type":"text/plain"},"key":"forceDialBack","value":"false"},{"description":{"content":"<p>Should the call be anonymous (default: false)</p>\n","type":"text/plain"},"key":"anonymous","value":"false"}],"variable":[]}},"response":[{"id":"69cbc3b7-9ed5-4f26-b909-cc7354f73575","name":"Call Started","originalRequest":{"method":"GET","header":[{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"url":{"raw":"{{baseUrl}}/calls/new/tapi?debugAmiTrace=true&destination=20333300&targets=a469de67-b79a-4dea-87d2-9a15858f10cd,webrtc,twinning,teams&caller_identity=905a334f-5bf6-4ebc-85d3-2d5411187f68&autoAnswer=false&forceDialBack=false&anonymous=false","host":["{{baseUrl}}"],"path":["calls","new","tapi"],"query":[{"description":"Display the debug trace from asterisk manager","key":"debugAmiTrace","value":"true"},{"description":"Destination number to dial","key":"destination","value":"20333300"},{"description":"Target device used to start the call","key":"targets","value":"a469de67-b79a-4dea-87d2-9a15858f10cd,webrtc,twinning,teams"},{"description":"Specify the caller identity of the call","key":"caller_identity","value":"905a334f-5bf6-4ebc-85d3-2d5411187f68"},{"description":"Auto Answer the call on the src device (default: false) (overrides default behaviors)","key":"autoAnswer","value":"false"},{"description":"Forces the pbx to start a call in DialBack mode (default: false) (overrides default behaviors)","key":"forceDialBack","value":"false"},{"description":"Should the call be anonymous (default: false)","key":"anonymous","value":"false"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"ea449bfb-560b-4a01-94f3-462c21b0e8af"},{"name":"Start new call","id":"5269aa18-1d30-4436-8c90-d9f45b2cf667","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{basicAuthUsername}}"},{"key":"password","value":"{{basicAuthPassword}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"destination\": \"0035220333300\",\n  \"targets\": {\n    \"sip_devices\": [\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\",\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\"\n    ],\n    \"webrtc\": true,\n    \"twinning\": true,\n    \"teams\": true,\n    \"flipChannel\": \"Local/905a334f-5bf6-4ebc-85d3-2d5411187f68@C-TW-pbx16dev-00000057;2\"\n  },\n  \"source\": \"2017\",\n  \"caller_identity\": \"905a334f-5bf6-4ebc-85d3-2d5411187f68\",\n  \"tts\": [\n    {\n      \"tag\": \"welcome_message\",\n      \"message\": \"Hello World\"\n    }\n  ],\n  \"options\": {\n    \"dialed_user_id\": \"string\",\n    \"dialed_extension_number\": \"string\"\n  }\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/calls/new?debugAmiTrace=true&autoAnswer=false&forceDialBack=false&anonymous=false","description":"<h1 id=\"start-a-new-call-to-a-destination-from-a-user-or-device\">Start a new call to a destination from a User or Device</h1>\n<p>DialBack mode: we dial first the targets and once one of those has answered we dial the destination. This allows the user to select which device will be used to start a new call<br />When no targets are specified we dial all linked device for the user in DialBack mode.<br />When the source parameter is defined we dial the source number in dial back mode and ignore all the other targets.<br />When only one target.sip_devices (and no other targets) is specified we try to start the call via the Phone api if this fails we dial the device</p>\n","urlObject":{"path":["calls","new"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Display the debug trace from asterisk manager</p>\n","type":"text/plain"},"key":"debugAmiTrace","value":"true"},{"description":{"content":"<p>Auto Answer the call on the src device (default: false) (overrides default behaviors)</p>\n","type":"text/plain"},"key":"autoAnswer","value":"false"},{"description":{"content":"<p>Forces the pbx to start a call in DialBack mode (default: false) (overrides default behaviors)</p>\n","type":"text/plain"},"key":"forceDialBack","value":"false"},{"description":{"content":"<p>Should the call be anonymous (default: false)</p>\n","type":"text/plain"},"key":"anonymous","value":"false"}],"variable":[]}},"response":[{"id":"0936271b-cbe1-4836-8c73-8aca7cd7aeda","name":"Call Started","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"body":{"mode":"raw","raw":"{\n  \"destination\": \"0035220333300\",\n  \"targets\": {\n    \"sip_devices\": [\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\",\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\"\n    ],\n    \"webrtc\": true,\n    \"twinning\": true,\n    \"teams\": true,\n    \"flipChannel\": \"Local/905a334f-5bf6-4ebc-85d3-2d5411187f68@C-TW-pbx16dev-00000057;2\"\n  },\n  \"source\": \"2017\",\n  \"caller_identity\": \"905a334f-5bf6-4ebc-85d3-2d5411187f68\",\n  \"tts\": [\n    {\n      \"tag\": \"welcome_message\",\n      \"message\": \"Hello World\"\n    }\n  ],\n  \"options\": {\n    \"dialed_user_id\": \"string\",\n    \"dialed_extension_number\": \"string\"\n  }\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":{"raw":"{{baseUrl}}/calls/new?debugAmiTrace=true&autoAnswer=false&forceDialBack=false&anonymous=false","host":["{{baseUrl}}"],"path":["calls","new"],"query":[{"description":"Display the debug trace from asterisk manager","key":"debugAmiTrace","value":"true"},{"description":"Auto Answer the call on the src device (default: false) (overrides default behaviors)","key":"autoAnswer","value":"false"},{"description":"Forces the pbx to start a call in DialBack mode (default: false) (overrides default behaviors)","key":"forceDialBack","value":"false"},{"description":"Should the call be anonymous (default: false)","key":"anonymous","value":"false"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"ok\",\n  \"dialBack\": true,\n  \"destination\": \"0035220333000\",\n  \"targets\": {\n    \"sip_devices\": [\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\",\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\"\n    ],\n    \"webrtc\": true,\n    \"twinning\": true,\n    \"teams\": true\n  },\n  \"click2dial_id\": \"936a90653194073f7ce14f80b067186f68ab32749e1f1b8840d49bf6cd5c9e75\"\n}"},{"id":"3138a1e1-c99b-4fb7-be18-a3564e161dae","name":"Bad Request - Request validation failed","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"body":{"mode":"raw","raw":"{\n  \"destination\": \"0035220333300\",\n  \"targets\": {\n    \"sip_devices\": [\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\",\n      \"a469de67-b79a-4dea-87d2-9a15858f10cd\"\n    ],\n    \"webrtc\": true,\n    \"twinning\": true,\n    \"teams\": true,\n    \"flipChannel\": \"Local/905a334f-5bf6-4ebc-85d3-2d5411187f68@C-TW-pbx16dev-00000057;2\"\n  },\n  \"source\": \"2017\",\n  \"caller_identity\": \"905a334f-5bf6-4ebc-85d3-2d5411187f68\",\n  \"tts\": [\n    {\n      \"tag\": \"welcome_message\",\n      \"message\": \"Hello World\"\n    }\n  ],\n  \"options\": {\n    \"dialed_user_id\": \"string\",\n    \"dialed_extension_number\": \"string\"\n  }\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":{"raw":"{{baseUrl}}/calls/new?debugAmiTrace=true&autoAnswer=false&forceDialBack=false&anonymous=false","host":["{{baseUrl}}"],"path":["calls","new"],"query":[{"description":"Display the debug trace from asterisk manager","key":"debugAmiTrace","value":"true"},{"description":"Auto Answer the call on the src device (default: false) (overrides default behaviors)","key":"autoAnswer","value":"false"},{"description":"Forces the pbx to start a call in DialBack mode (default: false) (overrides default behaviors)","key":"forceDialBack","value":"false"},{"description":"Should the call be anonymous (default: false)","key":"anonymous","value":"false"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"5269aa18-1d30-4436-8c90-d9f45b2cf667"}],"id":"e61b37bb-585f-433d-adcf-1c72165926aa","description":"<p>Actions to handle Calls</p>\n","_postman_id":"e61b37bb-585f-433d-adcf-1c72165926aa"},{"name":"User","item":[{"name":"Get user info","id":"d5eaabba-da4e-49a8-b9b7-064151112b6c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{basicAuthUsername}}"},{"key":"password","value":"{{basicAuthPassword}}"}]},"isInherited":false},"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/user","description":"<p>Get the all the Phone infos of the currently Authenticated user</p>\n","urlObject":{"path":["user"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"db8367a8-79e9-4770-9929-86d29e0ccccc","name":"Current user information","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"},{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"url":"{{baseUrl}}/user"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"username\": \"string\",\n  \"pbxInstance\": {\n    \"instanceName\": \"instance\",\n    \"pbxType\": \"VoxbiPBX\"\n  },\n  \"extensions\": [\n    {\n      \"number\": \"1234\",\n      \"devices\": [\n        {\n          \"channelType\": \"PJSIP\",\n          \"number\": \"520\",\n          \"username\": \"devpbx_520\",\n          \"password\": \"foobar123\"\n        },\n        {\n          \"channelType\": \"PJSIP\",\n          \"number\": \"520\",\n          \"username\": \"devpbx_520\",\n          \"password\": \"foobar123\"\n        }\n      ]\n    },\n    {\n      \"number\": \"1234\",\n      \"devices\": [\n        {\n          \"channelType\": \"PJSIP\",\n          \"number\": \"520\",\n          \"username\": \"devpbx_520\",\n          \"password\": \"foobar123\"\n        },\n        {\n          \"channelType\": \"PJSIP\",\n          \"number\": \"520\",\n          \"username\": \"devpbx_520\",\n          \"password\": \"foobar123\"\n        }\n      ]\n    }\n  ]\n}"}],"_postman_id":"d5eaabba-da4e-49a8-b9b7-064151112b6c"}],"id":"91825d71-46ca-4254-938e-ab174d9c3078","description":"<p>Actions to interact with the Users endpoints</p>\n","_postman_id":"91825d71-46ca-4254-938e-ab174d9c3078"},{"name":"Server","item":[{"name":"System status","id":"54e8fb19-b407-40dd-af17-5505c59a4099","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/","description":"<p>Health Check</p>\n","urlObject":{"path":[""],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"6250d2c9-8b20-43ed-9ef4-5c92e2cb80b6","name":"System Ok","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"code\": 200,\n  \"status\": \"OK\",\n  \"time\": \"1727690094\",\n  \"debug\": \"false\"\n}"}],"_postman_id":"54e8fb19-b407-40dd-af17-5505c59a4099"}],"id":"311570c4-a52a-41d9-9c02-5a0b59cf8718","description":"<p>Actions to interact with the Server endpoints</p>\n","_postman_id":"311570c4-a52a-41d9-9c02-5a0b59cf8718"},{"name":"Cors","item":[{"name":"Cors Options Request","id":"364e55d0-5bfc-4be3-acd2-103fcf61c167","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"OPTIONS","header":[],"url":"{{baseUrl}}/*","description":"<p>Cors Preflight Request</p>\n","urlObject":{"path":["*"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"0de07d93-35d1-4485-9d7e-2f90be8fedc3","name":"Successful Options request for CORS","originalRequest":{"method":"OPTIONS","header":[],"url":"{{baseUrl}}/*"},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"disabled":false,"description":{"content":"Provided Origin header","type":"text/plain"},"key":"Access-Control-Allow-Origin","value":"string"},{"disabled":false,"description":{"content":"Allowed methods","type":"text/plain"},"key":"Access-Control-Allow-Methods","value":"string"},{"disabled":false,"description":{"content":"Allowed Headers","type":"text/plain"},"key":"Access-Control-Allow-Headers","value":"string"},{"disabled":false,"description":{"content":"Max age of the cors request","type":"text/plain"},"key":"Access-Control-Max-Age","value":"string"}],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"364e55d0-5bfc-4be3-acd2-103fcf61c167"}],"id":"a90a473a-7bf0-47d9-9d2d-09773544573b","description":"<p>cors</p>\n","_postman_id":"a90a473a-7bf0-47d9-9d2d-09773544573b"},{"name":"Calls","item":[{"name":"Start a new multicast announcement","id":"244b41e9-24be-4e46-b24c-c1814a67a5c1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{bearerToken}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/calls/placemulticast?debugAmiTrace=true&ip=false&emergency=0&soundFile=all-your-base","description":"<p>Start a new multicast announcement</p>\n","urlObject":{"path":["calls","placemulticast"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Display the debug trace from asterisk manager</p>\n","type":"text/plain"},"key":"debugAmiTrace","value":"true"},{"description":{"content":"<p>IP to send the call to</p>\n","type":"text/plain"},"key":"ip","value":"false"},{"description":{"content":"<p>Should the multicast overwrite a call 0 or 1</p>\n","type":"text/plain"},"key":"emergency","value":"0"},{"description":{"content":"<p>Sound file to play</p>\n","type":"text/plain"},"key":"soundFile","value":"all-your-base"}],"variable":[]}},"response":[{"id":"f9e425f4-6e99-4f78-a742-af8a250fb0ca","name":"Call Started","originalRequest":{"method":"POST","header":[{"key":"Accept","value":"application/json"},{"description":"Added as a part of security scheme: bearer","key":"Authorization","value":"Bearer <token>"}],"url":{"raw":"{{baseUrl}}/calls/placemulticast?debugAmiTrace=true&ip=false&emergency=0&soundFile=all-your-base","host":["{{baseUrl}}"],"path":["calls","placemulticast"],"query":[{"description":"Display the debug trace from asterisk manager","key":"debugAmiTrace","value":"true"},{"description":"IP to send the call to","key":"ip","value":"false"},{"description":"Should the multicast overwrite a call 0 or 1","key":"emergency","value":"0"},{"description":"Sound file to play","key":"soundFile","value":"all-your-base"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"status\": \"ok\",\n  \"device\": {\n    \"number\": \"520\"\n  },\n  \"destination\": \"0035220333000\"\n}"}],"_postman_id":"244b41e9-24be-4e46-b24c-c1814a67a5c1"},{"name":"Hangup calls","id":"26d0af17-b287-4c76-ad65-45b052c27744","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{basicAuthUsername}}"},{"key":"password","value":"{{basicAuthPassword}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"channels\": [\n    \"string\",\n    \"string\"\n  ]\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/calls/hangup?debugAmiTrace=true","description":"<p>Hangup calls for a user</p>\n","urlObject":{"path":["calls","hangup"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Display the debug trace from asterisk manager</p>\n","type":"text/plain"},"key":"debugAmiTrace","value":"true"}],"variable":[]}},"response":[{"id":"e3a1f7d7-7c5e-41c6-9836-20830150e6e8","name":"Call has been hangup","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"body":{"mode":"raw","raw":"{\n  \"channels\": [\n    \"string\",\n    \"string\"\n  ]\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":{"raw":"{{baseUrl}}/calls/hangup?debugAmiTrace=true","host":["{{baseUrl}}"],"path":["calls","hangup"],"query":[{"description":"Display the debug trace from asterisk manager","key":"debugAmiTrace","value":"true"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"hungUpChannles\": 1\n}"},{"id":"56494e10-86e0-4d13-ad54-3c3e85e14610","name":"Bad Request - Request validation failed","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"body":{"mode":"raw","raw":"{\n  \"channels\": [\n    \"string\",\n    \"string\"\n  ]\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":{"raw":"{{baseUrl}}/calls/hangup?debugAmiTrace=true","host":["{{baseUrl}}"],"path":["calls","hangup"],"query":[{"description":"Display the debug trace from asterisk manager","key":"debugAmiTrace","value":"true"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"26d0af17-b287-4c76-ad65-45b052c27744"}],"id":"2587b2e8-6de3-4b92-9382-a9076e8fc0ab","description":"<p>calls</p>\n","_postman_id":"2587b2e8-6de3-4b92-9382-a9076e8fc0ab"},{"name":"Phone Control","item":[{"name":"Control your phone","id":"5081eadd-bcd7-48e8-927e-01fc41efadd4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{basicAuthUsername}}"},{"key":"password","value":"{{basicAuthPassword}}"}]},"isInherited":false},"method":"GET","header":[],"url":"{{baseUrl}}/phoneControl/action?debugAmiTrace=true&action=false&sip_device_id=a469de67-b79a-4dea-87d2-9a15858f10cd","description":"<p>Remotely control your phone</p>\n","urlObject":{"path":["phoneControl","action"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Display the debug trace from asterisk manager</p>\n","type":"text/plain"},"key":"debugAmiTrace","value":"true"},{"description":{"content":"<p>Action to be performed</p>\n","type":"text/plain"},"key":"action","value":"false"},{"description":{"content":"<p>Id of the sip device you want to perform the action from</p>\n","type":"text/plain"},"key":"sip_device_id","value":"a469de67-b79a-4dea-87d2-9a15858f10cd"}],"variable":[]}},"response":[{"id":"80159647-33b0-47dc-86bb-81ca2574b8ff","name":"Action Performed","originalRequest":{"method":"GET","header":[{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"url":{"raw":"{{baseUrl}}/phoneControl/action?debugAmiTrace=true&action=false&sip_device_id=a469de67-b79a-4dea-87d2-9a15858f10cd","host":["{{baseUrl}}"],"path":["phoneControl","action"],"query":[{"description":"Display the debug trace from asterisk manager","key":"debugAmiTrace","value":"true"},{"description":"Action to be performed","key":"action","value":"false"},{"description":"Id of the sip device you want to perform the action from","key":"sip_device_id","value":"a469de67-b79a-4dea-87d2-9a15858f10cd"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""},{"id":"a0d8c0d5-b0c3-4f9a-80b2-4ee5beaf9c6a","name":"Bad Request - Request validation failed","originalRequest":{"method":"GET","header":[{"description":"Added as a part of security scheme: basic","key":"Authorization","value":"Basic <credentials>"}],"url":{"raw":"{{baseUrl}}/phoneControl/action?debugAmiTrace=true&action=false&sip_device_id=a469de67-b79a-4dea-87d2-9a15858f10cd","host":["{{baseUrl}}"],"path":["phoneControl","action"],"query":[{"description":"Display the debug trace from asterisk manager","key":"debugAmiTrace","value":"true"},{"description":"Action to be performed","key":"action","value":"false"},{"description":"Id of the sip device you want to perform the action from","key":"sip_device_id","value":"a469de67-b79a-4dea-87d2-9a15858f10cd"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"5081eadd-bcd7-48e8-927e-01fc41efadd4"}],"id":"043fe283-4c0c-41f3-b779-59566589db65","description":"<p>phoneControl</p>\n","_postman_id":"043fe283-4c0c-41f3-b779-59566589db65"},{"name":"Webhooks","item":[{"name":"Call flow step Webhook Payload","id":"30e2b404-b3c0-40b1-98b0-4f2199a8231e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"instance_name\": \"string\",\n    \"recording\": {\n        \"src\": \"string\",\n        \"dst\": \"string\",\n        \"files\": {\n            \"combined\": \"string\",\n            \"receive\": \"string\",\n            \"transmit\": \"string\"\n        }\n    },\n    \"call\": {\n        \"type\": \"string\",\n        \"direction\": \"string\"\n    },\n    \"routing\": {\n        \"is_vip\": \"string\",\n        \"via_number\": \"string\",\n        \"via_name\": \"string\",\n        \"callflow_id\": \"string\",\n        \"callflow_name\": \"string\"\n    },\n    \"user\": {\n        \"dialed_user_id\": \"string\",\n        \"dialed_exten\": \"string\",\n        \"dialed_exten_id\": \"string\"\n    },\n    \"caller_id\": {\n        \"name\": \"string\",\n        \"number\": \"string\",\n        \"number_international\": \"string\",\n        \"international_prefix\": \"string\"\n    },\n    \"queue\": {\n        \"id\": \"string\",\n        \"name\": \"string\",\n        \"exit_key\": \"string\",\n        \"status\": \"string\",\n        \"position\": \"string\",\n        \"abandoned\": \"string\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"https://your-server.com/webhook-endpoint","description":"<h1 id=\"voxbi-pbx--call-flow-webhook\">Voxbi PBX – Call Flow Webhook</h1>\n<p>The Voxbi PBX supports calling a Web hook during a call flow via the web hook call flow step.<br />The Web hook send a POST request with a JSON body as payload.</p>\n<p>Register your server webhook url at <a href=\"https://cockpit.voxbi.com\">https://cockpit.voxbi.com</a></p>\n<p>Inside callflow edit option.</p>\n<img src=\"https://content.pstmn.io/72c7ae84-768e-406f-bf7a-c2778e8a69be/aW1hZ2UucG5n\" width=\"1610\" height=\"997\" />\n\n<h2 id=\"method\">Method</h2>\n<p><code>POST</code></p>\n<h2 id=\"content-type\">Content-Type</h2>\n<p><code>application/json</code></p>\n<hr />\n<h1 id=\"request-body-schema\">Request Body (Schema)</h1>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"instance_name\": \"string\",\n  \"recording\": {\n    \"src\": \"string\",\n    \"dst\": \"string\",\n    \"files\": {\n      \"combined\": \"string\",\n      \"receive\": \"string\",\n      \"transmit\": \"string\"\n    }\n  },\n  \"call\": {\n    \"type\": \"string\",\n    \"direction\": \"string\"\n  },\n  \"routing\": {\n    \"is_vip\": \"string\",\n    \"via_number\": \"string\",\n    \"via_name\": \"string\",\n    \"callflow_id\": \"string\",\n    \"callflow_name\": \"string\"\n  },\n  \"user\": {\n    \"dialed_user_id\": \"string\",\n    \"dialed_exten\": \"string\",\n    \"dialed_exten_id\": \"string\"\n  },\n  \"caller_id\": {\n    \"name\": \"string\",\n    \"number\": \"string\",\n    \"number_international\": \"string\",\n    \"international_prefix\": \"string\"\n  },\n  \"queue\": {\n    \"id\": \"string\",\n    \"name\": \"string\",\n    \"exit_key\": \"string\",\n    \"status\": \"string\",\n    \"position\": \"string\",\n    \"abandoned\": \"string\"\n  },\n  \"ivr\": {\n     \"id\": \"54374fbc-8a38-4712-b832-97b86bde5e4a\",\n     \"name\": \"Demo IVR\",\n     \"step\": {\n         \"id\": \"54374fbc-8a38-4712-b832-97b86bde5e4a\",\n         \"option\": \"1\"\n        }\n   }\n}\n\n</code></pre>\n<hr />\n<h1 id=\"sample-request-body\">Sample Request Body</h1>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"instance_name\": \"myCoolPbx1234\",\n  \"recording\": {\n    \"src\": \"+3522033332017\",\n    \"dst\": \"+35220602700\",\n    \"files\": {\n      \"combined\": \"/mnt/hdd/recordings/spool/myCoolPbx1234_CF_8a274b6e-d50b-4abd-ad18-fc153898841c_1751009487.68.wav\",\n      \"receive\": \"/mnt/hdd/recordings/spool/myCoolPbx1234_CF_8a274b6e-d50b-4abd-ad18-fc153898841c_1751009487.68.RX.wav\",\n      \"transmit\": \"/mnt/hdd/recordings/spool/myCoolPbx1234_CF_8a274b6e-d50b-4abd-ad18-fc153898841c_1751009487.68.TX.wav\"\n    }\n  },\n  \"call\": {\n    \"type\": \"external\",\n    \"direction\": \"incoming\"\n  },\n  \"routing\": {\n    \"is_vip\": \"TRUE\",\n    \"via_number\": \"1234\",\n    \"via_name\": \"Test 1234\",\n    \"callflow_id\": \"8a274b6e-d50b-4abd-ad18-fc153898841c\",\n    \"callflow_name\": \"Default Call Flow External\"\n  },\n  \"user\": {\n    \"dialed_user_id\": \"8a274b6e-ffff-ffff-ad18-fc153898841c\",\n    \"dialed_exten\": \"1234\",\n    \"dialed_exten_id\": \"8a274b6e-cccc-cccc-ad18-fc153898841c\"\n  },\n  \"caller_id\": {\n    \"name\": \"LAURES Christophe\",\n    \"number\": \"+3522033332017\",\n    \"number_international\": \"+3522033332017\",\n    \"international_prefix\": \"352\"\n  },\n  \"queue\": {\n    \"id\": \"54374fbc-8a38-4712-b832-97b86bde5e4a\",\n    \"name\": \"Demo Q\",\n    \"exit_key\": \"5\",\n    \"status\": \"TIMEOUT\",\n    \"position\": \"1\",\n    \"abandoned\": \"TRUE\"\n  },\n  ,\n  \"ivr\": {\n     \"id\": \"54374fbc-8a38-4712-b832-97b86bde5e4a\",\n     \"name\": \"Demo IVR\",\n     \"step\": {\n         \"id\": \"54374fbc-8a38-4712-b832-97b86bde5e4a\",\n         \"option\": \"1\"\n        }\n   }\n}\n\n</code></pre>\n<hr />\n<h3 id=\"response-body-what-your-webhook-must-return\">Response Body (What Your Webhook Must Return)</h3>\n<h2 id=\"important\">Important</h2>\n<ul>\n<li><p>All response fields are <strong>optional</strong></p>\n</li>\n<li><p>You may return <strong>an empty body</strong></p>\n</li>\n<li><p>Returning <strong>HTTP 200 OK</strong> with no JSON is completely valid</p>\n</li>\n</ul>\n<h3 id=\"sample-response\">Sample Response:</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"hangup\": false,\n  \"vip\": true,\n  \"caller_id\": {\n    \"number\": \"+35220333300\",\n    \"name\": \"My Company\"\n  },\n  \"queue_priority\": 10,\n  \"via\": {\n    \"number\": \"+35220333300\",\n    \"name\": \"Support Line\",\n    \"overwrite\": true\n  },\n  \"transfer\": {\n    \"destination\": \"+35220333300\",\n    \"type\": \"number\",\n    \"caller_identity_id\": \"8a274b6e-cccc-cccc-ad18-fc153898841c\",\n    \"carrier_id\": \"9b385c7f-dddd-dddd-be29-gd264909952d\",\n    \"timeout\": 300\n  }\n}\n\n</code></pre>\n<h3 id=\"sample-response-schemas\">Sample response schemas:</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"hangup\": false,\n  \"vip\": false,\n  \"caller_id\": {\n    \"name\": \"string\",\n    \"number\": \"string\"\n  },\n  \"queue_priority\": 0\n}\n\n</code></pre>\n<hr />\n<h3 id=\"example-response--do-nothing\">Example Response – Do Nothing</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"hangup\": false,\n  \"vip\": false\n}\n\n</code></pre>\n<hr />\n<h3 id=\"example-response--hangup-call\">Example Response – Hangup Call</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"hangup\": true\n}\n\n</code></pre>\n<hr />\n<h3 id=\"example-response--mark-as-vip\">Example Response – Mark as VIP</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"vip\": true\n}\n\n</code></pre>\n<hr />\n<h3 id=\"example-response--change-caller-id\">Example Response – Change Caller ID</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"caller_id\": {\n    \"name\": \"VIP Customer\",\n    \"number\": \"+35299999999\"\n  }\n}\n\n</code></pre>\n<hr />\n<h3 id=\"example-response--increase-queue-priority\">Example Response – Increase Queue Priority</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"queue_priority\": 10\n}\n\n</code></pre>\n<h2 id=\"example-response--change-via-header\">Example Response – Change Via Header</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"via\": {\n    \"number\": \"+1234567890\",\n    \"name\": \"Support Line\",\n    \"overwrite\": true\n  }\n}\n\n</code></pre>\n<h2 id=\"example-response--transfer-call-to-number\">Example Response – Transfer Call to Number</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"transfer\": {\n    \"destination\": \"+1234567890\",\n    \"type\": \"number\",\n    \"caller_identity_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"carrier_id\": \"660e8400-e29b-41d4-a716-446655440111\",\n    \"timeout\": 30\n  }\n}\n\n</code></pre>\n<h2 id=\"example-response--transfer-call-to-sip-uri\">Example Response – Transfer Call to SIP URI</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"transfer\": {\n    \"destination\": \"sip:user@example.com\",\n    \"type\": \"sip\",\n    \"timeout\": 20\n  }\n}\n\n</code></pre>\n<h2 id=\"example-response--transfer-call-to-call-flow\">Example Response – Transfer Call to Call Flow</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"transfer\": {\n    \"destination\": \"880e8400-e29b-41d4-a716-446655440333\",\n    \"type\": \"call_flow\"\n  }\n}\n\n</code></pre>\n<h2 id=\"example-response--transfer-call-to-user\">Example Response – Transfer Call to User</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"transfer\": {\n    \"destination\": \"770e8400-e29b-41d4-a716-446655440222\",\n    \"type\": \"user\"\n  }\n}\n\n</code></pre>\n<h2 id=\"example-response--transfer-call-to-sip-device\">Example Response – Transfer Call to SIP Device</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"transfer\": {\n    \"destination\": \"990e8400-e29b-41d4-a716-446655440444\",\n    \"type\": \"sip_device\"\n  }\n}\n\n</code></pre>\n","urlObject":{"protocol":"https","path":["webhook-endpoint"],"host":["your-server","com"],"query":[],"variable":[]}},"response":[],"_postman_id":"30e2b404-b3c0-40b1-98b0-4f2199a8231e"}],"id":"e393c483-c4b1-404e-b27a-6591943af079","_postman_id":"e393c483-c4b1-404e-b27a-6591943af079","description":""}],"id":"4ceae722-0df3-4e0d-8b69-c46de3cc0139","_postman_id":"4ceae722-0df3-4e0d-8b69-c46de3cc0139","description":""}],"event":[{"listen":"prerequest","script":{"type":"text/javascript","requests":{},"exec":[""],"id":"8bcf8be9-6fbf-43d9-923f-337349043252"}},{"listen":"test","script":{"type":"text/javascript","requests":{},"exec":[""],"id":"c802279c-6717-4ba5-81d3-9d9b666e9a47"}}],"variable":[{"key":"PBX_API_KEY","value":""}]}