{
  "info": {
    "name": "OneVOIPlanet Client API",
    "description": "OneVOIPlanet client API. Set {{baseUrl}} (https://api.onevoiplanet.com/api) and {{token}} (JWT from POST /auth/local or an API token).",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{token}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://api.onevoiplanet.com/api",
      "type": "string"
    },
    {
      "key": "token",
      "value": "",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Account",
      "item": [
        {
          "name": "Auth",
          "description": "Registration, login, password recovery and the current user profile.",
          "item": [
            {
              "name": "Log in (email/username + password)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/auth/local",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "auth",
                    "local"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Authenticates a user by email (or username) and password and returns a JWT together with the user profile.\nPass the JWT in every subsequent request as `Authorization: Bearer <jwt>`.\n\n**Token lifetime:** the JWT is valid for **30 days** (`expiresIn: 30d`). There is **no refresh endpoint** —\nwhen the token expires (401) the client must call `/auth/local` again. `POST /auth/logout` does not revoke the token.\n\nIf the request is sent from a browser whose `Origin` is the official web cabinet, a Google reCAPTCHA v2\nresponse must be passed in `captcha`. Server-to-server integrations (no `Origin` header) do not need it.\n\n\n**Required role:** Public, Employee, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (the login is written to the server log).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"identifier\": \"owner@example.com\",\n  \"password\": \"Secret123\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 JWT and user profile.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/local",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "local"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Authenticates a user by email (or username) and password and returns a JWT together with the user profile.\nPass the JWT in every subsequent request as `Authorization: Bearer <jwt>`.\n\n**Token lifetime:** the JWT is valid for **30 days** (`expiresIn: 30d`). There is **no refresh endpoint** —\nwhen the token expires (401) the client must call `/auth/local` again. `POST /auth/logout` does not revoke the token.\n\nIf the request is sent from a browser whose `Origin` is the official web cabinet, a Google reCAPTCHA v2\nresponse must be passed in `captcha`. Server-to-server integrations (no `Origin` header) do not need it.\n\n\n**Required role:** Public, Employee, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (the login is written to the server log).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"identifier\": \"owner@example.com\",\n  \"password\": \"Secret123\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "JWT and user profile.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"jwt\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NDIsImlhdCI6MTc1ODAwMDAwMCwiZXhwIjoxNzYwNTkyMDAwfQ.sig\",\n  \"user\": {\n    \"id\": 42,\n    \"username\": \"owner\",\n    \"email\": \"owner@example.com\",\n    \"provider\": \"local\",\n    \"confirmed\": true,\n    \"blocked\": false,\n    \"firstName\": \"John\",\n    \"lastName\": \"Doe\",\n    \"middleName\": null,\n    \"type\": false,\n    \"birthDate\": null,\n    \"defaultLang\": \"en\",\n    \"registration_platform\": \"global\",\n    \"referral_uid\": \"f5436f2e0178004a599a96209c746f78\",\n    \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n    \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n  }\n}"
                },
                {
                  "name": "400 Wrong credentials, blocked / unconfirmed account, captcha error.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/local",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "local"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Authenticates a user by email (or username) and password and returns a JWT together with the user profile.\nPass the JWT in every subsequent request as `Authorization: Bearer <jwt>`.\n\n**Token lifetime:** the JWT is valid for **30 days** (`expiresIn: 30d`). There is **no refresh endpoint** —\nwhen the token expires (401) the client must call `/auth/local` again. `POST /auth/logout` does not revoke the token.\n\nIf the request is sent from a browser whose `Origin` is the official web cabinet, a Google reCAPTCHA v2\nresponse must be passed in `captcha`. Server-to-server integrations (no `Origin` header) do not need it.\n\n\n**Required role:** Public, Employee, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (the login is written to the server log).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"identifier\": \"owner@example.com\",\n  \"password\": \"Secret123\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Wrong credentials, blocked / unconfirmed account, captcha error.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Invalid identifier or password\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/local",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "local"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Authenticates a user by email (or username) and password and returns a JWT together with the user profile.\nPass the JWT in every subsequent request as `Authorization: Bearer <jwt>`.\n\n**Token lifetime:** the JWT is valid for **30 days** (`expiresIn: 30d`). There is **no refresh endpoint** —\nwhen the token expires (401) the client must call `/auth/local` again. `POST /auth/logout` does not revoke the token.\n\nIf the request is sent from a browser whose `Origin` is the official web cabinet, a Google reCAPTCHA v2\nresponse must be passed in `captcha`. Server-to-server integrations (no `Origin` header) do not need it.\n\n\n**Required role:** Public, Employee, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (the login is written to the server log).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"identifier\": \"owner@example.com\",\n  \"password\": \"Secret123\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/local",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "local"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Authenticates a user by email (or username) and password and returns a JWT together with the user profile.\nPass the JWT in every subsequent request as `Authorization: Bearer <jwt>`.\n\n**Token lifetime:** the JWT is valid for **30 days** (`expiresIn: 30d`). There is **no refresh endpoint** —\nwhen the token expires (401) the client must call `/auth/local` again. `POST /auth/logout` does not revoke the token.\n\nIf the request is sent from a browser whose `Origin` is the official web cabinet, a Google reCAPTCHA v2\nresponse must be passed in `captcha`. Server-to-server integrations (no `Origin` header) do not need it.\n\n\n**Required role:** Public, Employee, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (the login is written to the server log).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"identifier\": \"owner@example.com\",\n  \"password\": \"Secret123\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Register a new account (company owner)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/auth/local/register",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "auth",
                    "local",
                    "register"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Creates a new user with the default role *Company owner* and automatically creates a company for them.\nThe company name is built from `lastName firstName middleName`; if none are given, `username` is used;\nfor a legal entity (`type: true`) the `Name` field is used. Billing currency and payment acquirer are chosen\nby the client IP: Ukraine → UAH / WayForPay, other countries → USD / Stripe. Mobile registrations\n(mobile `User-Agent`) get the *Personal* tariff and an active company immediately.\n\nPassword rules: at least 8 characters, at least one lowercase letter, one uppercase letter and one digit.\n\nIf e-mail confirmation is enabled on the server, the response contains only `user` (no `jwt`) and the user\nmust confirm the e-mail first; otherwise `jwt` (30 days, no refresh) is returned right away.\nBrowser requests from the official web cabinet must include `captcha` (reCAPTCHA v2).\n\n\n**Required role:** Public, Company owner (registered, not yet approved)\n\n**Side effects:** Creates a user and a company; sends a welcome e-mail; sends an internal registration notification to the OneVOIPlanet team.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"owner@example.com\",\n  \"username\": \"+380441234567\",\n  \"password\": \"Secret123\",\n  \"firstName\": \"John\",\n  \"lastName\": \"Doe\",\n  \"type\": false,\n  \"defaultLang\": \"en\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created user. `jwt` is absent when e-mail confirmation is required.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/local/register",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "local",
                        "register"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a new user with the default role *Company owner* and automatically creates a company for them.\nThe company name is built from `lastName firstName middleName`; if none are given, `username` is used;\nfor a legal entity (`type: true`) the `Name` field is used. Billing currency and payment acquirer are chosen\nby the client IP: Ukraine → UAH / WayForPay, other countries → USD / Stripe. Mobile registrations\n(mobile `User-Agent`) get the *Personal* tariff and an active company immediately.\n\nPassword rules: at least 8 characters, at least one lowercase letter, one uppercase letter and one digit.\n\nIf e-mail confirmation is enabled on the server, the response contains only `user` (no `jwt`) and the user\nmust confirm the e-mail first; otherwise `jwt` (30 days, no refresh) is returned right away.\nBrowser requests from the official web cabinet must include `captcha` (reCAPTCHA v2).\n\n\n**Required role:** Public, Company owner (registered, not yet approved)\n\n**Side effects:** Creates a user and a company; sends a welcome e-mail; sends an internal registration notification to the OneVOIPlanet team.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"email\": \"owner@example.com\",\n  \"username\": \"+380441234567\",\n  \"password\": \"Secret123\",\n  \"firstName\": \"John\",\n  \"lastName\": \"Doe\",\n  \"type\": false,\n  \"defaultLang\": \"en\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created user. `jwt` is absent when e-mail confirmation is required.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"jwt\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NDIsImlhdCI6MTc1ODAwMDAwMCwiZXhwIjoxNzYwNTkyMDAwfQ.sig\",\n  \"user\": {\n    \"id\": 42,\n    \"username\": \"+380441234567\",\n    \"email\": \"owner@example.com\",\n    \"provider\": \"local\",\n    \"confirmed\": true,\n    \"blocked\": false,\n    \"firstName\": \"John\",\n    \"lastName\": \"Doe\",\n    \"middleName\": null,\n    \"type\": false,\n    \"birthDate\": null,\n    \"defaultLang\": \"en\",\n    \"registration_platform\": \"global\",\n    \"referral_uid\": \"9a7b1c2d3e4f5a6b7c8d9e0f1a2b3c4d\",\n    \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n    \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n  }\n}"
                },
                {
                  "name": "400 Validation error, e-mail/username already taken, registration disabled.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/local/register",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "local",
                        "register"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a new user with the default role *Company owner* and automatically creates a company for them.\nThe company name is built from `lastName firstName middleName`; if none are given, `username` is used;\nfor a legal entity (`type: true`) the `Name` field is used. Billing currency and payment acquirer are chosen\nby the client IP: Ukraine → UAH / WayForPay, other countries → USD / Stripe. Mobile registrations\n(mobile `User-Agent`) get the *Personal* tariff and an active company immediately.\n\nPassword rules: at least 8 characters, at least one lowercase letter, one uppercase letter and one digit.\n\nIf e-mail confirmation is enabled on the server, the response contains only `user` (no `jwt`) and the user\nmust confirm the e-mail first; otherwise `jwt` (30 days, no refresh) is returned right away.\nBrowser requests from the official web cabinet must include `captcha` (reCAPTCHA v2).\n\n\n**Required role:** Public, Company owner (registered, not yet approved)\n\n**Side effects:** Creates a user and a company; sends a welcome e-mail; sends an internal registration notification to the OneVOIPlanet team.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"email\": \"owner@example.com\",\n  \"username\": \"+380441234567\",\n  \"password\": \"Secret123\",\n  \"firstName\": \"John\",\n  \"lastName\": \"Doe\",\n  \"type\": false,\n  \"defaultLang\": \"en\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error, e-mail/username already taken, registration disabled.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"The post or number is already taken\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/local/register",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "local",
                        "register"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a new user with the default role *Company owner* and automatically creates a company for them.\nThe company name is built from `lastName firstName middleName`; if none are given, `username` is used;\nfor a legal entity (`type: true`) the `Name` field is used. Billing currency and payment acquirer are chosen\nby the client IP: Ukraine → UAH / WayForPay, other countries → USD / Stripe. Mobile registrations\n(mobile `User-Agent`) get the *Personal* tariff and an active company immediately.\n\nPassword rules: at least 8 characters, at least one lowercase letter, one uppercase letter and one digit.\n\nIf e-mail confirmation is enabled on the server, the response contains only `user` (no `jwt`) and the user\nmust confirm the e-mail first; otherwise `jwt` (30 days, no refresh) is returned right away.\nBrowser requests from the official web cabinet must include `captcha` (reCAPTCHA v2).\n\n\n**Required role:** Public, Company owner (registered, not yet approved)\n\n**Side effects:** Creates a user and a company; sends a welcome e-mail; sends an internal registration notification to the OneVOIPlanet team.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"email\": \"owner@example.com\",\n  \"username\": \"+380441234567\",\n  \"password\": \"Secret123\",\n  \"firstName\": \"John\",\n  \"lastName\": \"Doe\",\n  \"type\": false,\n  \"defaultLang\": \"en\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/local/register",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "local",
                        "register"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a new user with the default role *Company owner* and automatically creates a company for them.\nThe company name is built from `lastName firstName middleName`; if none are given, `username` is used;\nfor a legal entity (`type: true`) the `Name` field is used. Billing currency and payment acquirer are chosen\nby the client IP: Ukraine → UAH / WayForPay, other countries → USD / Stripe. Mobile registrations\n(mobile `User-Agent`) get the *Personal* tariff and an active company immediately.\n\nPassword rules: at least 8 characters, at least one lowercase letter, one uppercase letter and one digit.\n\nIf e-mail confirmation is enabled on the server, the response contains only `user` (no `jwt`) and the user\nmust confirm the e-mail first; otherwise `jwt` (30 days, no refresh) is returned right away.\nBrowser requests from the official web cabinet must include `captcha` (reCAPTCHA v2).\n\n\n**Required role:** Public, Company owner (registered, not yet approved)\n\n**Side effects:** Creates a user and a company; sends a welcome e-mail; sends an internal registration notification to the OneVOIPlanet team.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"email\": \"owner@example.com\",\n  \"username\": \"+380441234567\",\n  \"password\": \"Secret123\",\n  \"firstName\": \"John\",\n  \"lastName\": \"Doe\",\n  \"type\": false,\n  \"defaultLang\": \"en\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Log out",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/auth/logout",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "auth",
                    "logout"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Always returns `204 No Content` and does nothing on the server: JWTs are stateless and are **not revoked**.\nThe client must delete the stored token itself. Call `DELETE /firebase-tokens/{token}` beforehand if the device\nshould stop receiving push notifications.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/logout",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "logout"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Always returns `204 No Content` and does nothing on the server: JWTs are stateless and are **not revoked**.\nThe client must delete the stored token itself. Call `DELETE /firebase-tokens/{token}` beforehand if the device\nshould stop receiving push notifications.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/logout",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "logout"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Always returns `204 No Content` and does nothing on the server: JWTs are stateless and are **not revoked**.\nThe client must delete the stored token itself. Call `DELETE /firebase-tokens/{token}` beforehand if the device\nshould stop receiving push notifications.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Change own password",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/auth/change-password",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "auth",
                    "change-password"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Changes the password of the authenticated user after checking the current one. The new password must differ\nfrom the current one and satisfy the rules (min 8 chars, lower + upper case letter, digit).\nReturns a fresh JWT; previously issued JWTs stay valid until they expire.\n\n\n**Required role:** Employee, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** Changes the user's password.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"currentPassword\": \"Secret123\",\n  \"password\": \"NewSecret456\",\n  \"passwordConfirmation\": \"NewSecret456\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 New JWT and user profile.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/change-password",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "change-password"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Changes the password of the authenticated user after checking the current one. The new password must differ\nfrom the current one and satisfy the rules (min 8 chars, lower + upper case letter, digit).\nReturns a fresh JWT; previously issued JWTs stay valid until they expire.\n\n\n**Required role:** Employee, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** Changes the user's password.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"currentPassword\": \"Secret123\",\n  \"password\": \"NewSecret456\",\n  \"passwordConfirmation\": \"NewSecret456\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "New JWT and user profile.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"jwt\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NDIsImlhdCI6MTc1ODAwMDAwMCwiZXhwIjoxNzYwNTkyMDAwfQ.sig\",\n  \"user\": {\n    \"id\": 42,\n    \"username\": \"owner\",\n    \"email\": \"owner@example.com\",\n    \"provider\": \"local\",\n    \"confirmed\": true,\n    \"blocked\": false,\n    \"firstName\": \"John\",\n    \"lastName\": \"Doe\",\n    \"middleName\": null,\n    \"type\": false,\n    \"birthDate\": null,\n    \"defaultLang\": \"en\",\n    \"registration_platform\": \"global\",\n    \"referral_uid\": \"f5436f2e0178004a599a96209c746f78\",\n    \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n    \"updatedAt\": \"2026-02-01T12:00:00.000Z\"\n  }\n}"
                },
                {
                  "name": "400 Validation error.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/change-password",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "change-password"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Changes the password of the authenticated user after checking the current one. The new password must differ\nfrom the current one and satisfy the rules (min 8 chars, lower + upper case letter, digit).\nReturns a fresh JWT; previously issued JWTs stay valid until they expire.\n\n\n**Required role:** Employee, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** Changes the user's password.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"currentPassword\": \"Secret123\",\n  \"password\": \"NewSecret456\",\n  \"passwordConfirmation\": \"NewSecret456\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"The provided current password is invalid\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/change-password",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "change-password"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Changes the password of the authenticated user after checking the current one. The new password must differ\nfrom the current one and satisfy the rules (min 8 chars, lower + upper case letter, digit).\nReturns a fresh JWT; previously issued JWTs stay valid until they expire.\n\n\n**Required role:** Employee, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** Changes the user's password.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"currentPassword\": \"Secret123\",\n  \"password\": \"NewSecret456\",\n  \"passwordConfirmation\": \"NewSecret456\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/change-password",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "change-password"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Changes the password of the authenticated user after checking the current one. The new password must differ\nfrom the current one and satisfy the rules (min 8 chars, lower + upper case letter, digit).\nReturns a fresh JWT; previously issued JWTs stay valid until they expire.\n\n\n**Required role:** Employee, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** Changes the user's password.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"currentPassword\": \"Secret123\",\n  \"password\": \"NewSecret456\",\n  \"passwordConfirmation\": \"NewSecret456\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Request a password reset code",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/auth/forgot-password",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "auth",
                    "forgot-password"
                  ],
                  "query": [
                    {
                      "key": "locale",
                      "value": "en",
                      "description": "E-mail language: en, ru, uk. Default — the user's `defaultLang`.",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Step 1 of password recovery. Generates a 6-digit code, e-mails it to the user and returns a one-time `token`.\nThe client then calls `POST /auth/validate-code` (optional check) and `POST /auth/reset-password` with the\nsame `token` and the `code` from the e-mail. Each call invalidates the previous token/code pair.\nUse `?locale=` to choose the e-mail language.\n\n\n**Required role:** Public, Company owner (registered, not yet approved)\n\n**Side effects:** Sends an e-mail with a 6-digit code; invalidates a previously issued reset code.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"owner@example.com\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Code sent; `token` must be stored for the next steps.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/forgot-password",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "forgot-password"
                      ],
                      "query": [
                        {
                          "key": "locale",
                          "value": "en",
                          "description": "E-mail language: en, ru, uk. Default — the user's `defaultLang`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Step 1 of password recovery. Generates a 6-digit code, e-mails it to the user and returns a one-time `token`.\nThe client then calls `POST /auth/validate-code` (optional check) and `POST /auth/reset-password` with the\nsame `token` and the `code` from the e-mail. Each call invalidates the previous token/code pair.\nUse `?locale=` to choose the e-mail language.\n\n\n**Required role:** Public, Company owner (registered, not yet approved)\n\n**Side effects:** Sends an e-mail with a 6-digit code; invalidates a previously issued reset code.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"email\": \"owner@example.com\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Code sent; `token` must be stored for the next steps.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"ok\": true,\n  \"token\": \"3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a\"\n}"
                },
                {
                  "name": "400 Unknown e-mail or blocked user.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/forgot-password",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "forgot-password"
                      ],
                      "query": [
                        {
                          "key": "locale",
                          "value": "en",
                          "description": "E-mail language: en, ru, uk. Default — the user's `defaultLang`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Step 1 of password recovery. Generates a 6-digit code, e-mails it to the user and returns a one-time `token`.\nThe client then calls `POST /auth/validate-code` (optional check) and `POST /auth/reset-password` with the\nsame `token` and the `code` from the e-mail. Each call invalidates the previous token/code pair.\nUse `?locale=` to choose the e-mail language.\n\n\n**Required role:** Public, Company owner (registered, not yet approved)\n\n**Side effects:** Sends an e-mail with a 6-digit code; invalidates a previously issued reset code.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"email\": \"owner@example.com\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Unknown e-mail or blocked user.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"User with this email does not exist!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/forgot-password",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "forgot-password"
                      ],
                      "query": [
                        {
                          "key": "locale",
                          "value": "en",
                          "description": "E-mail language: en, ru, uk. Default — the user's `defaultLang`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Step 1 of password recovery. Generates a 6-digit code, e-mails it to the user and returns a one-time `token`.\nThe client then calls `POST /auth/validate-code` (optional check) and `POST /auth/reset-password` with the\nsame `token` and the `code` from the e-mail. Each call invalidates the previous token/code pair.\nUse `?locale=` to choose the e-mail language.\n\n\n**Required role:** Public, Company owner (registered, not yet approved)\n\n**Side effects:** Sends an e-mail with a 6-digit code; invalidates a previously issued reset code.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"email\": \"owner@example.com\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Check a password reset code",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/auth/validate-code",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "auth",
                    "validate-code"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Step 2 (optional) of password recovery: checks that the `token` from `/auth/forgot-password` and the 6-digit\n`code` from the e-mail match, without changing anything. Rate limit: 5 requests per 5 minutes per IP.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"token\": \"3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a\",\n  \"code\": 482913\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Token and code are valid.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/validate-code",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "validate-code"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Step 2 (optional) of password recovery: checks that the `token` from `/auth/forgot-password` and the 6-digit\n`code` from the e-mail match, without changing anything. Rate limit: 5 requests per 5 minutes per IP.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"token\": \"3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a\",\n  \"code\": 482913\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Token and code are valid.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"ok\": true\n}"
                },
                {
                  "name": "400 Wrong token/code pair.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/validate-code",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "validate-code"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Step 2 (optional) of password recovery: checks that the `token` from `/auth/forgot-password` and the 6-digit\n`code` from the e-mail match, without changing anything. Rate limit: 5 requests per 5 minutes per IP.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"token\": \"3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a\",\n  \"code\": 482913\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Wrong token/code pair.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Надіслано невірний код!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/validate-code",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "validate-code"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Step 2 (optional) of password recovery: checks that the `token` from `/auth/forgot-password` and the 6-digit\n`code` from the e-mail match, without changing anything. Rate limit: 5 requests per 5 minutes per IP.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"token\": \"3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a\",\n  \"code\": 482913\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Set a new password by reset code",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/auth/reset-password",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "auth",
                    "reset-password"
                  ],
                  "query": [
                    {
                      "key": "locale",
                      "value": "en",
                      "description": "E-mail language: en, ru, uk.",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Step 3 of password recovery: sets a new password for the user identified by the `token` from\n`/auth/forgot-password` and the 6-digit `code` from the e-mail. The token/code pair is invalidated.\nReturns a JWT (30 days) and the user profile, so the client is logged in immediately.\n\n\n**Required role:** Public, Company owner (registered, not yet approved)\n\n**Side effects:** Changes the password; sends an e-mail \"your password has been changed\".",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"password\": \"NewSecret456\",\n  \"passwordConfirmation\": \"NewSecret456\",\n  \"token\": \"3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a\",\n  \"code\": 482913\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Password changed; JWT and user profile.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/reset-password",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "reset-password"
                      ],
                      "query": [
                        {
                          "key": "locale",
                          "value": "en",
                          "description": "E-mail language: en, ru, uk.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Step 3 of password recovery: sets a new password for the user identified by the `token` from\n`/auth/forgot-password` and the 6-digit `code` from the e-mail. The token/code pair is invalidated.\nReturns a JWT (30 days) and the user profile, so the client is logged in immediately.\n\n\n**Required role:** Public, Company owner (registered, not yet approved)\n\n**Side effects:** Changes the password; sends an e-mail \"your password has been changed\".",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"password\": \"NewSecret456\",\n  \"passwordConfirmation\": \"NewSecret456\",\n  \"token\": \"3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a\",\n  \"code\": 482913\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Password changed; JWT and user profile.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"jwt\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NDIsImlhdCI6MTc1ODAwMDAwMCwiZXhwIjoxNzYwNTkyMDAwfQ.sig\",\n  \"user\": {\n    \"id\": 42,\n    \"username\": \"owner\",\n    \"email\": \"owner@example.com\",\n    \"provider\": \"local\",\n    \"confirmed\": true,\n    \"blocked\": false,\n    \"firstName\": \"John\",\n    \"lastName\": \"Doe\",\n    \"middleName\": null,\n    \"type\": false,\n    \"birthDate\": null,\n    \"defaultLang\": \"en\",\n    \"registration_platform\": \"global\",\n    \"referral_uid\": \"f5436f2e0178004a599a96209c746f78\",\n    \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n    \"updatedAt\": \"2026-02-01T12:00:00.000Z\"\n  }\n}"
                },
                {
                  "name": "400 Wrong token/code, passwords mismatch or weak password.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/reset-password",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "reset-password"
                      ],
                      "query": [
                        {
                          "key": "locale",
                          "value": "en",
                          "description": "E-mail language: en, ru, uk.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Step 3 of password recovery: sets a new password for the user identified by the `token` from\n`/auth/forgot-password` and the 6-digit `code` from the e-mail. The token/code pair is invalidated.\nReturns a JWT (30 days) and the user profile, so the client is logged in immediately.\n\n\n**Required role:** Public, Company owner (registered, not yet approved)\n\n**Side effects:** Changes the password; sends an e-mail \"your password has been changed\".",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"password\": \"NewSecret456\",\n  \"passwordConfirmation\": \"NewSecret456\",\n  \"token\": \"3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a\",\n  \"code\": 482913\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Wrong token/code, passwords mismatch or weak password.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Incorrect token and code provided\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/auth/reset-password",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "auth",
                        "reset-password"
                      ],
                      "query": [
                        {
                          "key": "locale",
                          "value": "en",
                          "description": "E-mail language: en, ru, uk.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Step 3 of password recovery: sets a new password for the user identified by the `token` from\n`/auth/forgot-password` and the 6-digit `code` from the e-mail. The token/code pair is invalidated.\nReturns a JWT (30 days) and the user profile, so the client is logged in immediately.\n\n\n**Required role:** Public, Company owner (registered, not yet approved)\n\n**Side effects:** Changes the password; sends an e-mail \"your password has been changed\".",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"password\": \"NewSecret456\",\n  \"passwordConfirmation\": \"NewSecret456\",\n  \"token\": \"3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a3f1a9c0e5b7d2a4c6e8f0b1d3a5c7e9f1b3d5f7a9c0e2b4d6f8a0c2e4b6d8f0a\",\n  \"code\": 482913\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Current user profile",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/users/me",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "users",
                    "me"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the profile of the user identified by the JWT, as a flat object (no `data/attributes` envelope).\nBy default the role with its permission list, the company and the SIP line (with its domain) are populated.\nPass `populate[role]=false` to get a lighter response without the permissions list, or your own `populate`\nto choose relations (`company`, `sip`, `sip.domain`, `firebase_tokens`, ...).\nRequires a valid token (401 otherwise). Use it on app start to detect the role (`role.type`) and the company id.\n\n\n**Required role:** Employee, Public, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (refreshes the internal user → company/SIP cache)."
              },
              "response": [
                {
                  "name": "200 User profile.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/users/me",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "users",
                        "me"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the profile of the user identified by the JWT, as a flat object (no `data/attributes` envelope).\nBy default the role with its permission list, the company and the SIP line (with its domain) are populated.\nPass `populate[role]=false` to get a lighter response without the permissions list, or your own `populate`\nto choose relations (`company`, `sip`, `sip.domain`, `firebase_tokens`, ...).\nRequires a valid token (401 otherwise). Use it on app start to detect the role (`role.type`) and the company id.\n\n\n**Required role:** Employee, Public, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (refreshes the internal user → company/SIP cache)."
                  },
                  "status": "User profile.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 42,\n  \"username\": \"owner\",\n  \"email\": \"owner@example.com\",\n  \"provider\": \"local\",\n  \"confirmed\": true,\n  \"blocked\": false,\n  \"firstName\": \"John\",\n  \"lastName\": \"Doe\",\n  \"middleName\": null,\n  \"type\": false,\n  \"birthDate\": null,\n  \"defaultLang\": \"en\",\n  \"registration_platform\": \"global\",\n  \"referral_uid\": \"f5436f2e0178004a599a96209c746f78\",\n  \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n  \"updatedAt\": \"2026-02-01T12:00:00.000Z\",\n  \"role\": {\n    \"id\": 4,\n    \"name\": \"Company owner (approved)\",\n    \"description\": \"After company approved, tariff needed\",\n    \"type\": \"company_owner_approved\",\n    \"permissions\": [\n      {\n        \"id\": 56,\n        \"action\": \"api::company.company.my\"\n      },\n      {\n        \"id\": 71,\n        \"action\": \"plugin::users-permissions.user.me\"\n      }\n    ]\n  },\n  \"company\": {\n    \"id\": 7,\n    \"Name\": \"Example LLC\",\n    \"YRGPO\": \"\",\n    \"validation\": \"yes\",\n    \"tarificationDate\": \"2026-02-01\",\n    \"last_success_tarification\": null,\n    \"missed_calls_timing\": {\n      \"redTiming\": 1800,\n      \"greenTiming\": 60,\n      \"yellowTiming\": 300\n    },\n    \"demo_untill\": null,\n    \"credit_limit\": 5,\n    \"use_credit_for_service_payment\": false,\n    \"balance_modified_date\": \"2026-02-01T10:00:00.000Z\",\n    \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n    \"updatedAt\": \"2026-02-01T10:00:00.000Z\"\n  },\n  \"sip\": {\n    \"id\": 15,\n    \"number\": \"001\",\n    \"password\": \"********\",\n    \"record_call\": true,\n    \"call_forwarding\": \"off\",\n    \"redirectActivity\": null,\n    \"redirectTo\": null,\n    \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n    \"updatedAt\": \"2026-01-15T10:00:00.000Z\",\n    \"domain\": {\n      \"id\": 3,\n      \"name\": \"examplellc\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/users/me",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "users",
                        "me"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the profile of the user identified by the JWT, as a flat object (no `data/attributes` envelope).\nBy default the role with its permission list, the company and the SIP line (with its domain) are populated.\nPass `populate[role]=false` to get a lighter response without the permissions list, or your own `populate`\nto choose relations (`company`, `sip`, `sip.domain`, `firebase_tokens`, ...).\nRequires a valid token (401 otherwise). Use it on app start to detect the role (`role.type`) and the company id.\n\n\n**Required role:** Employee, Public, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (refreshes the internal user → company/SIP cache)."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/users/me",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "users",
                        "me"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the profile of the user identified by the JWT, as a flat object (no `data/attributes` envelope).\nBy default the role with its permission list, the company and the SIP line (with its domain) are populated.\nPass `populate[role]=false` to get a lighter response without the permissions list, or your own `populate`\nto choose relations (`company`, `sip`, `sip.domain`, `firebase_tokens`, ...).\nRequires a valid token (401 otherwise). Use it on app start to detect the role (`role.type`) and the company id.\n\n\n**Required role:** Employee, Public, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (refreshes the internal user → company/SIP cache)."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Geolocate the caller's IP",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/user/getCountryByIp",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user",
                    "getCountryByIp"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the GeoIP record for the client IP (taken from the `X-Real-IP` header set by the proxy).\nUsed by the apps to pre-select the country / currency before registration. Does not require a token.\nReturns `null` if the IP is not found in the GeoIP database.\n\n\n**Required role:** Public, Employee, Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 GeoIP record (geoip-lite format) or null.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user/getCountryByIp",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user",
                        "getCountryByIp"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the GeoIP record for the client IP (taken from the `X-Real-IP` header set by the proxy).\nUsed by the apps to pre-select the country / currency before registration. Does not require a token.\nReturns `null` if the IP is not found in the GeoIP database.\n\n\n**Required role:** Public, Employee, Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "GeoIP record (geoip-lite format) or null.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"range\": [\n    1834458112,\n    1834459135\n  ],\n  \"country\": \"UA\",\n  \"region\": \"30\",\n  \"eu\": \"0\",\n  \"timezone\": \"Europe/Kyiv\",\n  \"city\": \"Kyiv\",\n  \"ll\": [\n    50.4547,\n    30.5238\n  ],\n  \"metro\": 0,\n  \"area\": 20\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user/getCountryByIp",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user",
                        "getCountryByIp"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the GeoIP record for the client IP (taken from the `X-Real-IP` header set by the proxy).\nUsed by the apps to pre-select the country / currency before registration. Does not require a token.\nReturns `null` if the IP is not found in the GeoIP database.\n\n\n**Required role:** Public, Employee, Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user/getCountryByIp",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user",
                        "getCountryByIp"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the GeoIP record for the client IP (taken from the `X-Real-IP` header set by the proxy).\nUsed by the apps to pre-select the country / currency before registration. Does not require a token.\nReturns `null` if the IP is not found in the GeoIP database.\n\n\n**Required role:** Public, Employee, Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            }
          ]
        },
        {
          "name": "Account & Company",
          "description": "Company profile, employees, roles and audio files of the company.",
          "item": [
            {
              "name": "My company (full profile)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/companies/my",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "companies",
                    "my"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the company of the authenticated user with all main relations populated by default: tariff (with prices\nand restrictions), phone numbers (with their routing to SIP lines / groups / IVR), users, SIP domains, call groups,\nIVRs, callback/recall widgets, CRM integrations, notification settings, currency, payment system and SIP trunks.\nThe response is large; for a light summary use `GET /companies/getBasicInfo`.\n`filters`, `pagination` and `_q` query parameters are ignored; a custom `populate` is merged with the default one.\n\n\n**Required role:** Employee, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Company with relations.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/my",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "my"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the company of the authenticated user with all main relations populated by default: tariff (with prices\nand restrictions), phone numbers (with their routing to SIP lines / groups / IVR), users, SIP domains, call groups,\nIVRs, callback/recall widgets, CRM integrations, notification settings, currency, payment system and SIP trunks.\nThe response is large; for a light summary use `GET /companies/getBasicInfo`.\n`filters`, `pagination` and `_q` query parameters are ignored; a custom `populate` is merged with the default one.\n\n\n**Required role:** Employee, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Company with relations.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 7,\n    \"attributes\": {\n      \"Name\": \"Example LLC\",\n      \"YRGPO\": \"12345678\",\n      \"validation\": \"yes\",\n      \"tarificationDate\": \"2026-02-01\",\n      \"last_success_tarification\": \"2026-01-01\",\n      \"missed_calls_timing\": {\n        \"redTiming\": 1800,\n        \"greenTiming\": 60,\n        \"yellowTiming\": 300\n      },\n      \"demo_untill\": null,\n      \"credit_limit\": 5,\n      \"use_credit_for_service_payment\": false,\n      \"balance_modified_date\": \"2026-01-20T10:18:11.057Z\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T06:32:20.297Z\",\n      \"tariff\": {\n        \"data\": {\n          \"id\": 2,\n          \"attributes\": {\n            \"Name\": \"Pro\",\n            \"custom\": false,\n            \"prices\": {\n              \"data\": [\n                {\n                  \"id\": 12,\n                  \"attributes\": {\n                    \"currency\": {\n                      \"data\": {\n                        \"id\": 3,\n                        \"attributes\": {\n                          \"name_short\": \"UAH\",\n                          \"name_long\": \"Hryvnia\",\n                          \"symbol\": \"₴\"\n                        }\n                      }\n                    },\n                    \"price_by_field\": [\n                      {\n                        \"id\": 1,\n                        \"name\": \"price\",\n                        \"price\": 629,\n                        \"isPriceStatic\": false\n                      },\n                      {\n                        \"id\": 2,\n                        \"name\": \"phone_channel_price\",\n                        \"price\": 29,\n                        \"isPriceStatic\": false\n                      }\n                    ]\n                  }\n                }\n              ]\n            },\n            \"tariff_restrictions\": {\n              \"data\": [\n                {\n                  \"id\": 2,\n                  \"attributes\": {\n                    \"maxPhones\": 50,\n                    \"maxEmployees\": 20,\n                    \"maxDomains\": 3\n                  }\n                }\n              ]\n            }\n          }\n        }\n      },\n      \"phones\": {\n        \"data\": [\n          {\n            \"id\": 35,\n            \"attributes\": {\n              \"number\": \"1234567\",\n              \"fullnumber\": \"380441234567\",\n              \"channels\": 2,\n              \"type\": \"exclusive\",\n              \"reserved\": false,\n              \"priority\": 5,\n              \"inSip\": {\n                \"data\": {\n                  \"id\": 15,\n                  \"attributes\": {\n                    \"number\": \"001\"\n                  }\n                }\n              },\n              \"in_group\": {\n                \"data\": null\n              },\n              \"in_ivr_line\": {\n                \"data\": null\n              },\n              \"country_prefix\": {\n                \"data\": {\n                  \"id\": 1,\n                  \"attributes\": {\n                    \"prefix\": \"380\",\n                    \"name\": \"Ukraine\"\n                  }\n                }\n              }\n            }\n          }\n        ]\n      },\n      \"register_ticket\": {\n        \"data\": []\n      },\n      \"users\": {\n        \"data\": [\n          {\n            \"id\": 42,\n            \"attributes\": {\n              \"username\": \"owner\",\n              \"email\": \"owner@example.com\",\n              \"firstName\": \"John\",\n              \"lastName\": \"Doe\",\n              \"confirmed\": true,\n              \"blocked\": false\n            }\n          }\n        ]\n      },\n      \"domains\": {\n        \"data\": [\n          {\n            \"id\": 3,\n            \"attributes\": {\n              \"name\": \"examplellc\",\n              \"payyed\": true\n            }\n          }\n        ]\n      },\n      \"groups\": {\n        \"data\": [\n          {\n            \"id\": 9,\n            \"attributes\": {\n              \"name\": \"Sales\",\n              \"number\": \"900\"\n            }\n          }\n        ]\n      },\n      \"recall_widgets\": {\n        \"data\": []\n      },\n      \"callback_widgets\": {\n        \"data\": []\n      },\n      \"ivrs\": {\n        \"data\": []\n      },\n      \"integration\": [],\n      \"notification_setting\": {\n        \"data\": {\n          \"id\": 11,\n          \"attributes\": {\n            \"send_notification_at\": \"09:00:00.000\",\n            \"minimum_balance\": 100,\n            \"notification_contacts\": [\n              {\n                \"id\": 1,\n                \"type\": \"email\",\n                \"contact\": \"owner@example.com\",\n                \"finance\": true,\n                \"call\": true,\n                \"widgets\": true,\n                \"statistics\": true,\n                \"lang\": \"en\"\n              }\n            ]\n          }\n        }\n      },\n      \"incoming_payment_system\": {\n        \"data\": {\n          \"id\": 5,\n          \"attributes\": {\n            \"name\": \"wayforpay\",\n            \"serviceName\": \"wayforpay\"\n          }\n        }\n      },\n      \"currency\": {\n        \"data\": {\n          \"id\": 3,\n          \"attributes\": {\n            \"name_short\": \"UAH\",\n            \"name_long\": \"Hryvnia\",\n            \"symbol\": \"₴\",\n            \"code\": 980\n          }\n        }\n      },\n      \"sip_trunks\": {\n        \"data\": []\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/my",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "my"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the company of the authenticated user with all main relations populated by default: tariff (with prices\nand restrictions), phone numbers (with their routing to SIP lines / groups / IVR), users, SIP domains, call groups,\nIVRs, callback/recall widgets, CRM integrations, notification settings, currency, payment system and SIP trunks.\nThe response is large; for a light summary use `GET /companies/getBasicInfo`.\n`filters`, `pagination` and `_q` query parameters are ignored; a custom `populate` is merged with the default one.\n\n\n**Required role:** Employee, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/my",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "my"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the company of the authenticated user with all main relations populated by default: tariff (with prices\nand restrictions), phone numbers (with their routing to SIP lines / groups / IVR), users, SIP domains, call groups,\nIVRs, callback/recall widgets, CRM integrations, notification settings, currency, payment system and SIP trunks.\nThe response is large; for a light summary use `GET /companies/getBasicInfo`.\n`filters`, `pagination` and `_q` query parameters are ignored; a custom `populate` is merged with the default one.\n\n\n**Required role:** Employee, Company owner (registered, not yet approved), Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Short account summary (user + company + tariff)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/companies/getBasicInfo",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "companies",
                    "getBasicInfo"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Light-weight summary for the app header: the user's name, role, company currency, tariff with prices in the\ncompany currency and the number-count limit, outgoing numbers of the user's SIP line, and the payment acquirer\nto show (`effective_payment_acquirer`: `wayforpay` when the client IP is in Ukraine, otherwise `stripe`).\nNote: `data.id` is the **user** id, not the company id.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Summary.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/getBasicInfo",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "getBasicInfo"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Light-weight summary for the app header: the user's name, role, company currency, tariff with prices in the\ncompany currency and the number-count limit, outgoing numbers of the user's SIP line, and the payment acquirer\nto show (`effective_payment_acquirer`: `wayforpay` when the client IP is in Ukraine, otherwise `stripe`).\nNote: `data.id` is the **user** id, not the company id.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Summary.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 42,\n    \"attributes\": {\n      \"firstName\": \"John\",\n      \"lastName\": \"Doe\",\n      \"middleName\": null,\n      \"email\": \"owner@example.com\",\n      \"username\": \"owner\",\n      \"company\": {\n        \"id\": 7,\n        \"currency\": {\n          \"id\": 3,\n          \"name_short\": \"UAH\",\n          \"symbol\": \"₴\"\n        },\n        \"tariff\": {\n          \"id\": 2,\n          \"Name\": \"Pro\",\n          \"prices\": [\n            {\n              \"id\": 12,\n              \"price_by_field\": [\n                {\n                  \"id\": 1,\n                  \"name\": \"price\",\n                  \"price\": 629,\n                  \"isPriceStatic\": false\n                },\n                {\n                  \"id\": 2,\n                  \"name\": \"phone_channel_price\",\n                  \"price\": 29,\n                  \"isPriceStatic\": false\n                },\n                {\n                  \"id\": 3,\n                  \"name\": \"domain_cost\",\n                  \"price\": 119,\n                  \"isPriceStatic\": false\n                }\n              ]\n            }\n          ],\n          \"tariff_restrictions\": [\n            {\n              \"id\": 2,\n              \"maxPhones\": 50\n            }\n          ]\n        }\n      },\n      \"sip\": {\n        \"id\": 15,\n        \"out_phone_lines\": [\n          {\n            \"id\": 35,\n            \"fullnumber\": \"380441234567\"\n          }\n        ]\n      },\n      \"role\": {\n        \"id\": 4,\n        \"name\": \"Company owner (approved)\",\n        \"description\": \"After company approved, tariff needed\",\n        \"type\": \"company_owner_approved\"\n      },\n      \"effective_payment_acquirer\": \"wayforpay\",\n      \"effective_country\": \"UA\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/getBasicInfo",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "getBasicInfo"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Light-weight summary for the app header: the user's name, role, company currency, tariff with prices in the\ncompany currency and the number-count limit, outgoing numbers of the user's SIP line, and the payment acquirer\nto show (`effective_payment_acquirer`: `wayforpay` when the client IP is in Ukraine, otherwise `stripe`).\nNote: `data.id` is the **user** id, not the company id.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/getBasicInfo",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "getBasicInfo"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Light-weight summary for the app header: the user's name, role, company currency, tariff with prices in the\ncompany currency and the number-count limit, outgoing numbers of the user's SIP line, and the payment acquirer\nto show (`effective_payment_acquirer`: `wayforpay` when the client IP is in Ukraine, otherwise `stripe`).\nNote: `data.id` is the **user** id, not the company id.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/getBasicInfo",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "getBasicInfo"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Light-weight summary for the app header: the user's name, role, company currency, tariff with prices in the\ncompany currency and the number-count limit, outgoing numbers of the user's SIP line, and the payment acquirer\nto show (`effective_payment_acquirer`: `wayforpay` when the client IP is in Ukraine, otherwise `stripe`).\nNote: `data.id` is the **user** id, not the company id.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Does the company have a number routed anywhere",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/companies/hasAttachedSip",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "companies",
                    "hasAttachedSip"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns `sipAttached: true` if at least one phone number of the company is routed to a SIP line, a call group\nor an IVR (incoming or outgoing). Used by the apps to decide whether to show the \"set up routing\" onboarding step.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Flag.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/hasAttachedSip",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "hasAttachedSip"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns `sipAttached: true` if at least one phone number of the company is routed to a SIP line, a call group\nor an IVR (incoming or outgoing). Used by the apps to decide whether to show the \"set up routing\" onboarding step.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Flag.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"attributes\": {\n      \"sipAttached\": true\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/hasAttachedSip",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "hasAttachedSip"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns `sipAttached: true` if at least one phone number of the company is routed to a SIP line, a call group\nor an IVR (incoming or outgoing). Used by the apps to decide whether to show the \"set up routing\" onboarding step.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/hasAttachedSip",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "hasAttachedSip"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns `sipAttached: true` if at least one phone number of the company is routed to a SIP line, a call group\nor an IVR (incoming or outgoing). Used by the apps to decide whether to show the \"set up routing\" onboarding step.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Roles assignable to employees",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/companies/roles",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "companies",
                    "roles"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the roles that can be given to employees (owner roles are excluded): `employee`, `Superwisor`, `Finance`.\nPass `name` as `role` in `POST /employees`, and `id` as `data.role` in `PUT /employees/{id}`.\nFlat array, no `data` envelope.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Roles.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/roles",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "roles"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the roles that can be given to employees (owner roles are excluded): `employee`, `Superwisor`, `Finance`.\nPass `name` as `role` in `POST /employees`, and `id` as `data.role` in `PUT /employees/{id}`.\nFlat array, no `data` envelope.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Roles.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "[\n  {\n    \"id\": 1,\n    \"name\": \"employee\"\n  },\n  {\n    \"id\": 6,\n    \"name\": \"Superwisor\"\n  },\n  {\n    \"id\": 8,\n    \"name\": \"Finance\"\n  }\n]"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/roles",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "roles"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the roles that can be given to employees (owner roles are excluded): `employee`, `Superwisor`, `Finance`.\nPass `name` as `role` in `POST /employees`, and `id` as `data.role` in `PUT /employees/{id}`.\nFlat array, no `data` envelope.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/roles",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "roles"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the roles that can be given to employees (owner roles are excluded): `employee`, `Superwisor`, `Finance`.\nPass `name` as `role` in `POST /employees`, and `id` as `data.role` in `PUT /employees/{id}`.\nFlat array, no `data` envelope.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "List employees of the company",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/companies/getEmployees",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "companies",
                    "getEmployees"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns all users of the authenticated user's company (including the owner). Pagination parameters are **not\napplied** — the whole list is always returned; `meta.pagination.total` is the count. `sort`, `filters` and\n`populate` work (`populate[0]=role&populate[1]=sip&populate[2]=sip.domain` is the usual choice).\n\n\n**Required role:** Employee, Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Employees.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/getEmployees",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "getEmployees"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns all users of the authenticated user's company (including the owner). Pagination parameters are **not\napplied** — the whole list is always returned; `meta.pagination.total` is the count. `sort`, `filters` and\n`populate` work (`populate[0]=role&populate[1]=sip&populate[2]=sip.domain` is the usual choice).\n\n\n**Required role:** Employee, Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Employees.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 42,\n      \"attributes\": {\n        \"username\": \"owner\",\n        \"email\": \"owner@example.com\",\n        \"provider\": \"local\",\n        \"confirmed\": true,\n        \"blocked\": false,\n        \"firstName\": \"John\",\n        \"lastName\": \"Doe\",\n        \"middleName\": null,\n        \"type\": false,\n        \"birthDate\": null,\n        \"defaultLang\": \"en\",\n        \"registration_platform\": \"global\",\n        \"referral_uid\": \"f5436f2e0178004a599a96209c746f78\",\n        \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n        \"updatedAt\": \"2026-02-01T12:00:00.000Z\"\n      }\n    },\n    {\n      \"id\": 43,\n      \"attributes\": {\n        \"username\": \"jane\",\n        \"email\": \"jane@example.com\",\n        \"provider\": \"local\",\n        \"confirmed\": true,\n        \"blocked\": false,\n        \"firstName\": \"Jane\",\n        \"lastName\": \"Doe\",\n        \"middleName\": null,\n        \"type\": false,\n        \"birthDate\": null,\n        \"defaultLang\": \"en\",\n        \"registration_platform\": null,\n        \"referral_uid\": \"0a1b2c3d4e5f60718293a4b5c6d7e8f9\",\n        \"createdAt\": \"2026-01-20T10:00:00.000Z\",\n        \"updatedAt\": \"2026-01-20T10:00:00.000Z\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 2,\n      \"pageCount\": 0,\n      \"total\": 2\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/getEmployees",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "getEmployees"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns all users of the authenticated user's company (including the owner). Pagination parameters are **not\napplied** — the whole list is always returned; `meta.pagination.total` is the count. `sort`, `filters` and\n`populate` work (`populate[0]=role&populate[1]=sip&populate[2]=sip.domain` is the usual choice).\n\n\n**Required role:** Employee, Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/getEmployees",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "getEmployees"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns all users of the authenticated user's company (including the owner). Pagination parameters are **not\napplied** — the whole list is always returned; `meta.pagination.total` is the count. `sort`, `filters` and\n`populate` work (`populate[0]=role&populate[1]=sip&populate[2]=sip.domain` is the usual choice).\n\n\n**Required role:** Employee, Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Add an employee (creates a SIP line)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/employees",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "employees"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Creates a user in the company with the given role and a SIP line in the given SIP domain. The SIP number is the\nfirst free 3-digit number in the domain (001…999). The body is **flat** (no `data` envelope).\n`role` is the role **name** from `GET /companies/roles`. The number of employees is limited by the tariff\n(`maxEmployees`); when the company has no tariff the request is rejected with 403.\nThe created user can log in with `username`/`email` + `password`; the SIP client uses `sip.number@<domain>` + `sipPassword`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor\n\n**Side effects:** Creates a user and a SIP line; sends an internal registration notification to the OneVOIPlanet team.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"jane@example.com\",\n  \"username\": \"jane\",\n  \"password\": \"Secret123\",\n  \"role\": \"employee\",\n  \"domain\": 3,\n  \"sipPassword\": \"SipSecret789\",\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"defaultLang\": \"en\",\n  \"record_call\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created user with its SIP line (flat object).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a user in the company with the given role and a SIP line in the given SIP domain. The SIP number is the\nfirst free 3-digit number in the domain (001…999). The body is **flat** (no `data` envelope).\n`role` is the role **name** from `GET /companies/roles`. The number of employees is limited by the tariff\n(`maxEmployees`); when the company has no tariff the request is rejected with 403.\nThe created user can log in with `username`/`email` + `password`; the SIP client uses `sip.number@<domain>` + `sipPassword`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor\n\n**Side effects:** Creates a user and a SIP line; sends an internal registration notification to the OneVOIPlanet team.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"email\": \"jane@example.com\",\n  \"username\": \"jane\",\n  \"password\": \"Secret123\",\n  \"role\": \"employee\",\n  \"domain\": 3,\n  \"sipPassword\": \"SipSecret789\",\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"defaultLang\": \"en\",\n  \"record_call\": true\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created user with its SIP line (flat object).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 43,\n  \"username\": \"jane\",\n  \"email\": \"jane@example.com\",\n  \"provider\": \"local\",\n  \"confirmed\": true,\n  \"blocked\": false,\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"middleName\": \"\",\n  \"type\": false,\n  \"birthDate\": null,\n  \"defaultLang\": \"en\",\n  \"registration_platform\": \"global\",\n  \"referral_uid\": \"0a1b2c3d4e5f60718293a4b5c6d7e8f9\",\n  \"createdAt\": \"2026-01-20T10:00:00.000Z\",\n  \"updatedAt\": \"2026-01-20T10:00:00.000Z\",\n  \"sip\": {\n    \"id\": 16,\n    \"number\": \"002\",\n    \"password\": \"********\",\n    \"record_call\": true,\n    \"redirectActivity\": false,\n    \"redirectTo\": null,\n    \"domain\": {\n      \"id\": 3,\n      \"name\": \"examplellc\"\n    }\n  }\n}"
                },
                {
                  "name": "400 Validation error, duplicate login/e-mail, bad role/domain, employee limit reached.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a user in the company with the given role and a SIP line in the given SIP domain. The SIP number is the\nfirst free 3-digit number in the domain (001…999). The body is **flat** (no `data` envelope).\n`role` is the role **name** from `GET /companies/roles`. The number of employees is limited by the tariff\n(`maxEmployees`); when the company has no tariff the request is rejected with 403.\nThe created user can log in with `username`/`email` + `password`; the SIP client uses `sip.number@<domain>` + `sipPassword`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor\n\n**Side effects:** Creates a user and a SIP line; sends an internal registration notification to the OneVOIPlanet team.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"email\": \"jane@example.com\",\n  \"username\": \"jane\",\n  \"password\": \"Secret123\",\n  \"role\": \"employee\",\n  \"domain\": 3,\n  \"sipPassword\": \"SipSecret789\",\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"defaultLang\": \"en\",\n  \"record_call\": true\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error, duplicate login/e-mail, bad role/domain, employee limit reached.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"Max employees restrictions\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a user in the company with the given role and a SIP line in the given SIP domain. The SIP number is the\nfirst free 3-digit number in the domain (001…999). The body is **flat** (no `data` envelope).\n`role` is the role **name** from `GET /companies/roles`. The number of employees is limited by the tariff\n(`maxEmployees`); when the company has no tariff the request is rejected with 403.\nThe created user can log in with `username`/`email` + `password`; the SIP client uses `sip.number@<domain>` + `sipPassword`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor\n\n**Side effects:** Creates a user and a SIP line; sends an internal registration notification to the OneVOIPlanet team.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"email\": \"jane@example.com\",\n  \"username\": \"jane\",\n  \"password\": \"Secret123\",\n  \"role\": \"employee\",\n  \"domain\": 3,\n  \"sipPassword\": \"SipSecret789\",\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"defaultLang\": \"en\",\n  \"record_call\": true\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a user in the company with the given role and a SIP line in the given SIP domain. The SIP number is the\nfirst free 3-digit number in the domain (001…999). The body is **flat** (no `data` envelope).\n`role` is the role **name** from `GET /companies/roles`. The number of employees is limited by the tariff\n(`maxEmployees`); when the company has no tariff the request is rejected with 403.\nThe created user can log in with `username`/`email` + `password`; the SIP client uses `sip.number@<domain>` + `sipPassword`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor\n\n**Side effects:** Creates a user and a SIP line; sends an internal registration notification to the OneVOIPlanet team.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"email\": \"jane@example.com\",\n  \"username\": \"jane\",\n  \"password\": \"Secret123\",\n  \"role\": \"employee\",\n  \"domain\": 3,\n  \"sipPassword\": \"SipSecret789\",\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"defaultLang\": \"en\",\n  \"record_call\": true\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete employees",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/employees?ids=43,44",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "employees"
                  ],
                  "query": [
                    {
                      "key": "ids",
                      "value": "43,44",
                      "description": "Array of user ids: `ids[0]=43&ids[1]=44`.",
                      "disabled": false
                    }
                  ],
                  "variable": []
                },
                "description": "Deletes the given employees of the company together with their SIP lines. Ids are passed as an array in the\nquery string: `?ids[0]=43&ids[1]=44` (a single plain `ids=43` is rejected). The owner is never deleted.\nEmployees whose SIP line still has phone numbers routed to it, or who are members of a call group, are not deleted\nand are returned in `protected`; employees assigned as redirect targets of callback/recall widgets block the whole\nrequest with 400 — detach them first.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes users and their SIP lines; removes them from notification contacts and unlinks their Telegram."
              },
              "response": [
                {
                  "name": "200 Result per employee.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees?ids=43,44",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "43,44",
                          "description": "Array of user ids: `ids[0]=43&ids[1]=44`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes the given employees of the company together with their SIP lines. Ids are passed as an array in the\nquery string: `?ids[0]=43&ids[1]=44` (a single plain `ids=43` is rejected). The owner is never deleted.\nEmployees whose SIP line still has phone numbers routed to it, or who are members of a call group, are not deleted\nand are returned in `protected`; employees assigned as redirect targets of callback/recall widgets block the whole\nrequest with 400 — detach them first.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes users and their SIP lines; removes them from notification contacts and unlinks their Telegram."
                  },
                  "status": "Result per employee.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"deleted\": [\n    43\n  ],\n  \"failed\": [],\n  \"protected\": [\n    {\n      \"id\": 44,\n      \"username\": \"mark\",\n      \"email\": \"mark@example.com\",\n      \"provider\": \"local\",\n      \"confirmed\": true,\n      \"blocked\": false,\n      \"firstName\": \"Mark\",\n      \"lastName\": \"Doe\",\n      \"middleName\": null,\n      \"type\": false,\n      \"birthDate\": null,\n      \"defaultLang\": \"en\",\n      \"registration_platform\": null,\n      \"referral_uid\": \"1a2b3c4d5e6f708192a3b4c5d6e7f809\",\n      \"createdAt\": \"2026-01-20T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-20T10:00:00.000Z\"\n    }\n  ]\n}"
                },
                {
                  "name": "400 `ids` is not an array, or an employee is used in a widget.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees?ids=43,44",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "43,44",
                          "description": "Array of user ids: `ids[0]=43&ids[1]=44`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes the given employees of the company together with their SIP lines. Ids are passed as an array in the\nquery string: `?ids[0]=43&ids[1]=44` (a single plain `ids=43` is rejected). The owner is never deleted.\nEmployees whose SIP line still has phone numbers routed to it, or who are members of a call group, are not deleted\nand are returned in `protected`; employees assigned as redirect targets of callback/recall widgets block the whole\nrequest with 400 — detach them first.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes users and their SIP lines; removes them from notification contacts and unlinks their Telegram."
                  },
                  "status": "`ids` is not an array, or an employee is used in a widget.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"Invalid params\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees?ids=43,44",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "43,44",
                          "description": "Array of user ids: `ids[0]=43&ids[1]=44`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes the given employees of the company together with their SIP lines. Ids are passed as an array in the\nquery string: `?ids[0]=43&ids[1]=44` (a single plain `ids=43` is rejected). The owner is never deleted.\nEmployees whose SIP line still has phone numbers routed to it, or who are members of a call group, are not deleted\nand are returned in `protected`; employees assigned as redirect targets of callback/recall widgets block the whole\nrequest with 400 — detach them first.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes users and their SIP lines; removes them from notification contacts and unlinks their Telegram."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees?ids=43,44",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "43,44",
                          "description": "Array of user ids: `ids[0]=43&ids[1]=44`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes the given employees of the company together with their SIP lines. Ids are passed as an array in the\nquery string: `?ids[0]=43&ids[1]=44` (a single plain `ids=43` is rejected). The owner is never deleted.\nEmployees whose SIP line still has phone numbers routed to it, or who are members of a call group, are not deleted\nand are returned in `protected`; employees assigned as redirect targets of callback/recall widgets block the whole\nrequest with 400 — detach them first.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes users and their SIP lines; removes them from notification contacts and unlinks their Telegram."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update an employee",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/employees/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "employees",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "43",
                      "description": "User id of the employee."
                    }
                  ]
                },
                "description": "Updates profile fields of an employee of your company. Body uses the Strapi envelope `{ \"data\": {...} }`.\n`company`, `password` and `sip` are silently ignored (use `POST /employees/changePassword/{id}` for the password\nand the SIP endpoints for the line). `role` is the role **id** from `GET /companies/roles`.\nIf the id does not belong to your company nothing is updated and `data` is `null`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None besides the update.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"firstName\": \"Jane\",\n    \"lastName\": \"Doe\",\n    \"role\": 6\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated user (null if not in your company).",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "43",
                          "description": "User id of the employee."
                        }
                      ]
                    },
                    "description": "Updates profile fields of an employee of your company. Body uses the Strapi envelope `{ \"data\": {...} }`.\n`company`, `password` and `sip` are silently ignored (use `POST /employees/changePassword/{id}` for the password\nand the SIP endpoints for the line). `role` is the role **id** from `GET /companies/roles`.\nIf the id does not belong to your company nothing is updated and `data` is `null`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None besides the update.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"firstName\": \"Jane\",\n    \"lastName\": \"Doe\",\n    \"role\": 6\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated user (null if not in your company).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 43,\n    \"attributes\": {\n      \"username\": \"jane\",\n      \"email\": \"jane@example.com\",\n      \"provider\": \"local\",\n      \"confirmed\": true,\n      \"blocked\": false,\n      \"firstName\": \"Jane\",\n      \"lastName\": \"Doe\",\n      \"middleName\": \"\",\n      \"type\": false,\n      \"birthDate\": null,\n      \"defaultLang\": \"en\",\n      \"registration_platform\": \"global\",\n      \"referral_uid\": \"0a1b2c3d4e5f60718293a4b5c6d7e8f9\",\n      \"createdAt\": \"2026-01-20T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-02T09:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Empty body or duplicate login/e-mail.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "43",
                          "description": "User id of the employee."
                        }
                      ]
                    },
                    "description": "Updates profile fields of an employee of your company. Body uses the Strapi envelope `{ \"data\": {...} }`.\n`company`, `password` and `sip` are silently ignored (use `POST /employees/changePassword/{id}` for the password\nand the SIP endpoints for the line). `role` is the role **id** from `GET /companies/roles`.\nIf the id does not belong to your company nothing is updated and `data` is `null`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None besides the update.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"firstName\": \"Jane\",\n    \"lastName\": \"Doe\",\n    \"role\": 6\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Empty body or duplicate login/e-mail.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Empty Data\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "43",
                          "description": "User id of the employee."
                        }
                      ]
                    },
                    "description": "Updates profile fields of an employee of your company. Body uses the Strapi envelope `{ \"data\": {...} }`.\n`company`, `password` and `sip` are silently ignored (use `POST /employees/changePassword/{id}` for the password\nand the SIP endpoints for the line). `role` is the role **id** from `GET /companies/roles`.\nIf the id does not belong to your company nothing is updated and `data` is `null`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None besides the update.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"firstName\": \"Jane\",\n    \"lastName\": \"Doe\",\n    \"role\": 6\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "43",
                          "description": "User id of the employee."
                        }
                      ]
                    },
                    "description": "Updates profile fields of an employee of your company. Body uses the Strapi envelope `{ \"data\": {...} }`.\n`company`, `password` and `sip` are silently ignored (use `POST /employees/changePassword/{id}` for the password\nand the SIP endpoints for the line). `role` is the role **id** from `GET /companies/roles`.\nIf the id does not belong to your company nothing is updated and `data` is `null`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None besides the update.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"firstName\": \"Jane\",\n    \"lastName\": \"Doe\",\n    \"role\": 6\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Set a new password for an employee",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/employees/changePassword/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "employees",
                    "changePassword",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "43",
                      "description": "User id of the employee."
                    }
                  ]
                },
                "description": "Sets a new cabinet password for an employee of your company. Only users with a role not higher than yours can be\nchanged (owner > Superwisor > Finance > employee). Password rules: min 8 chars, lower + upper case letter, digit.\nThe employee receives an e-mail that the password was changed.\n\n**Known issue:** the password is changed and the e-mail is sent, but the server currently answers `500` instead\nof the documented `200` body (internal error when forming the response). Treat 500 as success.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Changes the employee's password; sends them an e-mail notification.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"password\": \"NewSecret456\",\n    \"confirmPassword\": \"NewSecret456\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Password changed (intended response; see the known issue).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees/changePassword/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees",
                        "changePassword",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "43",
                          "description": "User id of the employee."
                        }
                      ]
                    },
                    "description": "Sets a new cabinet password for an employee of your company. Only users with a role not higher than yours can be\nchanged (owner > Superwisor > Finance > employee). Password rules: min 8 chars, lower + upper case letter, digit.\nThe employee receives an e-mail that the password was changed.\n\n**Known issue:** the password is changed and the e-mail is sent, but the server currently answers `500` instead\nof the documented `200` body (internal error when forming the response). Treat 500 as success.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Changes the employee's password; sends them an e-mail notification.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"password\": \"NewSecret456\",\n    \"confirmPassword\": \"NewSecret456\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Password changed (intended response; see the known issue).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"jwt\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NDN9.sig\",\n  \"user\": {\n    \"id\": 43,\n    \"username\": \"jane\",\n    \"email\": \"jane@example.com\",\n    \"provider\": \"local\",\n    \"confirmed\": true,\n    \"blocked\": false,\n    \"firstName\": \"Jane\",\n    \"lastName\": \"Doe\",\n    \"middleName\": \"\",\n    \"type\": false,\n    \"birthDate\": null,\n    \"defaultLang\": \"en\",\n    \"registration_platform\": \"global\",\n    \"referral_uid\": \"0a1b2c3d4e5f60718293a4b5c6d7e8f9\",\n    \"createdAt\": \"2026-01-20T10:00:00.000Z\",\n    \"updatedAt\": \"2026-02-02T09:00:00.000Z\"\n  }\n}"
                },
                {
                  "name": "400 Validation error or insufficient permissions.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees/changePassword/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees",
                        "changePassword",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "43",
                          "description": "User id of the employee."
                        }
                      ]
                    },
                    "description": "Sets a new cabinet password for an employee of your company. Only users with a role not higher than yours can be\nchanged (owner > Superwisor > Finance > employee). Password rules: min 8 chars, lower + upper case letter, digit.\nThe employee receives an e-mail that the password was changed.\n\n**Known issue:** the password is changed and the e-mail is sent, but the server currently answers `500` instead\nof the documented `200` body (internal error when forming the response). Treat 500 as success.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Changes the employee's password; sends them an e-mail notification.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"password\": \"NewSecret456\",\n    \"confirmPassword\": \"NewSecret456\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error or insufficient permissions.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Invalid data\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees/changePassword/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees",
                        "changePassword",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "43",
                          "description": "User id of the employee."
                        }
                      ]
                    },
                    "description": "Sets a new cabinet password for an employee of your company. Only users with a role not higher than yours can be\nchanged (owner > Superwisor > Finance > employee). Password rules: min 8 chars, lower + upper case letter, digit.\nThe employee receives an e-mail that the password was changed.\n\n**Known issue:** the password is changed and the e-mail is sent, but the server currently answers `500` instead\nof the documented `200` body (internal error when forming the response). Treat 500 as success.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Changes the employee's password; sends them an e-mail notification.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"password\": \"NewSecret456\",\n    \"confirmPassword\": \"NewSecret456\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees/changePassword/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees",
                        "changePassword",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "43",
                          "description": "User id of the employee."
                        }
                      ]
                    },
                    "description": "Sets a new cabinet password for an employee of your company. Only users with a role not higher than yours can be\nchanged (owner > Superwisor > Finance > employee). Password rules: min 8 chars, lower + upper case letter, digit.\nThe employee receives an e-mail that the password was changed.\n\n**Known issue:** the password is changed and the e-mail is sent, but the server currently answers `500` instead\nof the documented `200` body (internal error when forming the response). Treat 500 as success.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Changes the employee's password; sends them an e-mail notification.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"password\": \"NewSecret456\",\n    \"confirmPassword\": \"NewSecret456\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/employees/changePassword/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "employees",
                        "changePassword",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "43",
                          "description": "User id of the employee."
                        }
                      ]
                    },
                    "description": "Sets a new cabinet password for an employee of your company. Only users with a role not higher than yours can be\nchanged (owner > Superwisor > Finance > employee). Password rules: min 8 chars, lower + upper case letter, digit.\nThe employee receives an e-mail that the password was changed.\n\n**Known issue:** the password is changed and the e-mail is sent, but the server currently answers `500` instead\nof the documented `200` body (internal error when forming the response). Treat 500 as success.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Changes the employee's password; sends them an e-mail notification.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"password\": \"NewSecret456\",\n    \"confirmPassword\": \"NewSecret456\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete (deactivate) the account",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/companies/delete-account",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "companies",
                    "delete-account"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "\"Delete account\" for the app stores: **blocks every user of the company** (`blocked: true`) so nobody can log in\nany more; already issued JWTs stop working. Company data, numbers and balance are kept on the server and the\naccount can be restored only by support. Nothing else is deleted.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Blocks all users of the company; the account becomes inaccessible without support."
              },
              "response": [
                {
                  "name": "200 Users blocked.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/delete-account",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "delete-account"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "\"Delete account\" for the app stores: **blocks every user of the company** (`blocked: true`) so nobody can log in\nany more; already issued JWTs stop working. Company data, numbers and balance are kept on the server and the\naccount can be restored only by support. Nothing else is deleted.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Blocks all users of the company; the account becomes inaccessible without support."
                  },
                  "status": "Users blocked.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"ok\": true\n}"
                },
                {
                  "name": "400 Company has no users.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/delete-account",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "delete-account"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "\"Delete account\" for the app stores: **blocks every user of the company** (`blocked: true`) so nobody can log in\nany more; already issued JWTs stop working. Company data, numbers and balance are kept on the server and the\naccount can be restored only by support. Nothing else is deleted.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Blocks all users of the company; the account becomes inaccessible without support."
                  },
                  "status": "Company has no users.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"BadRequestError\",\n    \"message\": \"Company has no users\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/delete-account",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "delete-account"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "\"Delete account\" for the app stores: **blocks every user of the company** (`blocked: true`) so nobody can log in\nany more; already issued JWTs stop working. Company data, numbers and balance are kept on the server and the\naccount can be restored only by support. Nothing else is deleted.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Blocks all users of the company; the account becomes inaccessible without support."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/delete-account",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "delete-account"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "\"Delete account\" for the app stores: **blocks every user of the company** (`blocked: true`) so nobody can log in\nany more; already issued JWTs stop working. Company data, numbers and balance are kept on the server and the\naccount can be restored only by support. Nothing else is deleted.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Blocks all users of the company; the account becomes inaccessible without support."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 The user has no company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/delete-account",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "delete-account"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "\"Delete account\" for the app stores: **blocks every user of the company** (`blocked: true`) so nobody can log in\nany more; already issued JWTs stop working. Company data, numbers and balance are kept on the server and the\naccount can be restored only by support. Nothing else is deleted.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Blocks all users of the company; the account becomes inaccessible without support."
                  },
                  "status": "The user has no company.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Company not found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Submit identity / company verification documents",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/register-tickets/register",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "register-tickets",
                    "register"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Creates a verification request (register ticket) for the company — required by regulators before Ukrainian\nnumbers can be used. `multipart/form-data`: field `data` is a **JSON string** with the personal / company details;\nthe documents are files. Which files are required depends on the owner type (`type` of the user):\n\n* **Individual** (`type: false`): `files.withPassport` — selfie with the passport, and at least 3 images in `files.docs[]`.\n* **Sole proprietor** (`type: true`, `isFop: true` in `data`): `files.statue`, `files.Edr`, `files.bankOpening`.\n* **Legal entity** (`type: true`, `isFop` false): `files.registerTaxPayers`, `files.Edr`, `files.bankOpening`,\n  optional `files.decisionAboutDirector`, `files.powerOfAttorney`.\n\n`dateRelease` and `birthDate` are `DD/MM/YYYY`; the passport must be issued at least 14 years after birth.\nAfter review the company `validation` becomes `onProgress` → `yes` / `no` (see `GET /companies/my`).\nRate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (registered, not yet approved)\n\n**Side effects:** Creates a verification request and uploads the documents for manual review."
              },
              "response": [
                {
                  "name": "200 Created verification request.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/register-tickets/register",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "register-tickets",
                        "register"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a verification request (register ticket) for the company — required by regulators before Ukrainian\nnumbers can be used. `multipart/form-data`: field `data` is a **JSON string** with the personal / company details;\nthe documents are files. Which files are required depends on the owner type (`type` of the user):\n\n* **Individual** (`type: false`): `files.withPassport` — selfie with the passport, and at least 3 images in `files.docs[]`.\n* **Sole proprietor** (`type: true`, `isFop: true` in `data`): `files.statue`, `files.Edr`, `files.bankOpening`.\n* **Legal entity** (`type: true`, `isFop` false): `files.registerTaxPayers`, `files.Edr`, `files.bankOpening`,\n  optional `files.decisionAboutDirector`, `files.powerOfAttorney`.\n\n`dateRelease` and `birthDate` are `DD/MM/YYYY`; the passport must be issued at least 14 years after birth.\nAfter review the company `validation` becomes `onProgress` → `yes` / `no` (see `GET /companies/my`).\nRate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (registered, not yet approved)\n\n**Side effects:** Creates a verification request and uploads the documents for manual review."
                  },
                  "status": "Created verification request.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 12,\n    \"attributes\": {\n      \"firstName\": \"John\",\n      \"lastName\": \"Doe\",\n      \"birthDate\": \"20/05/1990\",\n      \"passportSeries\": \"AB\",\n      \"passportNumber\": \"123456\",\n      \"whoIssued\": \"1234\",\n      \"dateRelease\": \"10/06/2015\",\n      \"IdPassportNumber\": null,\n      \"phone\": \"+380441234567\",\n      \"email\": \"owner@example.com\",\n      \"country\": \"UA\",\n      \"zip\": \"01001\",\n      \"state\": null,\n      \"city\": \"Kyiv\",\n      \"street\": \"Khreshchatyk\",\n      \"house\": \"1\",\n      \"apartment\": \"2\",\n      \"YRGPO\": \"\",\n      \"ticket_status\": null,\n      \"createdAt\": \"2026-02-02T09:00:00.000Z\",\n      \"updatedAt\": \"2026-02-02T09:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Missing documents or invalid dates.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/register-tickets/register",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "register-tickets",
                        "register"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a verification request (register ticket) for the company — required by regulators before Ukrainian\nnumbers can be used. `multipart/form-data`: field `data` is a **JSON string** with the personal / company details;\nthe documents are files. Which files are required depends on the owner type (`type` of the user):\n\n* **Individual** (`type: false`): `files.withPassport` — selfie with the passport, and at least 3 images in `files.docs[]`.\n* **Sole proprietor** (`type: true`, `isFop: true` in `data`): `files.statue`, `files.Edr`, `files.bankOpening`.\n* **Legal entity** (`type: true`, `isFop` false): `files.registerTaxPayers`, `files.Edr`, `files.bankOpening`,\n  optional `files.decisionAboutDirector`, `files.powerOfAttorney`.\n\n`dateRelease` and `birthDate` are `DD/MM/YYYY`; the passport must be issued at least 14 years after birth.\nAfter review the company `validation` becomes `onProgress` → `yes` / `no` (see `GET /companies/my`).\nRate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (registered, not yet approved)\n\n**Side effects:** Creates a verification request and uploads the documents for manual review."
                  },
                  "status": "Missing documents or invalid dates.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Необхідно завантажити фото з паспортом!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/register-tickets/register",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "register-tickets",
                        "register"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a verification request (register ticket) for the company — required by regulators before Ukrainian\nnumbers can be used. `multipart/form-data`: field `data` is a **JSON string** with the personal / company details;\nthe documents are files. Which files are required depends on the owner type (`type` of the user):\n\n* **Individual** (`type: false`): `files.withPassport` — selfie with the passport, and at least 3 images in `files.docs[]`.\n* **Sole proprietor** (`type: true`, `isFop: true` in `data`): `files.statue`, `files.Edr`, `files.bankOpening`.\n* **Legal entity** (`type: true`, `isFop` false): `files.registerTaxPayers`, `files.Edr`, `files.bankOpening`,\n  optional `files.decisionAboutDirector`, `files.powerOfAttorney`.\n\n`dateRelease` and `birthDate` are `DD/MM/YYYY`; the passport must be issued at least 14 years after birth.\nAfter review the company `validation` becomes `onProgress` → `yes` / `no` (see `GET /companies/my`).\nRate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (registered, not yet approved)\n\n**Side effects:** Creates a verification request and uploads the documents for manual review."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/register-tickets/register",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "register-tickets",
                        "register"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a verification request (register ticket) for the company — required by regulators before Ukrainian\nnumbers can be used. `multipart/form-data`: field `data` is a **JSON string** with the personal / company details;\nthe documents are files. Which files are required depends on the owner type (`type` of the user):\n\n* **Individual** (`type: false`): `files.withPassport` — selfie with the passport, and at least 3 images in `files.docs[]`.\n* **Sole proprietor** (`type: true`, `isFop: true` in `data`): `files.statue`, `files.Edr`, `files.bankOpening`.\n* **Legal entity** (`type: true`, `isFop` false): `files.registerTaxPayers`, `files.Edr`, `files.bankOpening`,\n  optional `files.decisionAboutDirector`, `files.powerOfAttorney`.\n\n`dateRelease` and `birthDate` are `DD/MM/YYYY`; the passport must be issued at least 14 years after birth.\nAfter review the company `validation` becomes `onProgress` → `yes` / `no` (see `GET /companies/my`).\nRate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (registered, not yet approved)\n\n**Side effects:** Creates a verification request and uploads the documents for manual review."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/register-tickets/register",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "register-tickets",
                        "register"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a verification request (register ticket) for the company — required by regulators before Ukrainian\nnumbers can be used. `multipart/form-data`: field `data` is a **JSON string** with the personal / company details;\nthe documents are files. Which files are required depends on the owner type (`type` of the user):\n\n* **Individual** (`type: false`): `files.withPassport` — selfie with the passport, and at least 3 images in `files.docs[]`.\n* **Sole proprietor** (`type: true`, `isFop: true` in `data`): `files.statue`, `files.Edr`, `files.bankOpening`.\n* **Legal entity** (`type: true`, `isFop` false): `files.registerTaxPayers`, `files.Edr`, `files.bankOpening`,\n  optional `files.decisionAboutDirector`, `files.powerOfAttorney`.\n\n`dateRelease` and `birthDate` are `DD/MM/YYYY`; the passport must be issued at least 14 years after birth.\nAfter review the company `validation` becomes `onProgress` → `yes` / `no` (see `GET /companies/my`).\nRate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (registered, not yet approved)\n\n**Side effects:** Creates a verification request and uploads the documents for manual review."
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "List audio files (own or system library)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/company-audios",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "company-audios"
                  ],
                  "query": [
                    {
                      "key": "category",
                      "value": "additional",
                      "description": "`additional` — company files (default), `base` — system library.",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Audio files used in IVR menus and call groups (greetings — `type: sound`, music on hold — `type: moh`).\n`category=additional` (default) returns the files uploaded by your company with their `owner`;\n`category=base` returns the shared system library available to everyone. Standard pagination, sort and filters\napply (e.g. `filters[type][$eq]=moh`). The upload file object is populated in `file`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Audio files.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios"
                      ],
                      "query": [
                        {
                          "key": "category",
                          "value": "additional",
                          "description": "`additional` — company files (default), `base` — system library.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Audio files used in IVR menus and call groups (greetings — `type: sound`, music on hold — `type: moh`).\n`category=additional` (default) returns the files uploaded by your company with their `owner`;\n`category=base` returns the shared system library available to everyone. Standard pagination, sort and filters\napply (e.g. `filters[type][$eq]=moh`). The upload file object is populated in `file`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Audio files.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 156,\n      \"attributes\": {\n        \"name\": \"Greeting\",\n        \"type\": \"sound\",\n        \"category\": \"additional\",\n        \"url\": \"/uploads/sound/company_7/greeting.wav/greeting_wav_a1b2c3.wav\",\n        \"size\": 154.69,\n        \"createdAt\": \"2026-01-20T12:08:36.711Z\",\n        \"updatedAt\": \"2026-01-20T12:08:36.711Z\",\n        \"file\": {\n          \"data\": {\n            \"id\": 1001,\n            \"attributes\": {\n              \"name\": \"greeting.wav\",\n              \"ext\": \".wav\",\n              \"mime\": \"audio/mpeg\",\n              \"size\": 154.69,\n              \"url\": \"/uploads/sound/company_7/greeting.wav/greeting_wav_a1b2c3.wav\",\n              \"hash\": \"greeting_wav_a1b2c3\",\n              \"provider\": \"local\",\n              \"createdAt\": \"2026-01-20T12:08:30.000Z\",\n              \"updatedAt\": \"2026-01-20T12:08:36.000Z\"\n            }\n          }\n        },\n        \"owner\": {\n          \"data\": {\n            \"id\": 42,\n            \"attributes\": {\n              \"username\": \"owner\",\n              \"email\": \"owner@example.com\",\n              \"firstName\": \"John\",\n              \"lastName\": \"Doe\"\n            }\n          }\n        }\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios"
                      ],
                      "query": [
                        {
                          "key": "category",
                          "value": "additional",
                          "description": "`additional` — company files (default), `base` — system library.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Audio files used in IVR menus and call groups (greetings — `type: sound`, music on hold — `type: moh`).\n`category=additional` (default) returns the files uploaded by your company with their `owner`;\n`category=base` returns the shared system library available to everyone. Standard pagination, sort and filters\napply (e.g. `filters[type][$eq]=moh`). The upload file object is populated in `file`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios"
                      ],
                      "query": [
                        {
                          "key": "category",
                          "value": "additional",
                          "description": "`additional` — company files (default), `base` — system library.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Audio files used in IVR menus and call groups (greetings — `type: sound`, music on hold — `type: moh`).\n`category=additional` (default) returns the files uploaded by your company with their `owner`;\n`category=base` returns the shared system library available to everyone. Standard pagination, sort and filters\napply (e.g. `filters[type][$eq]=moh`). The upload file object is populated in `file`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Upload an audio file",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/company-audios",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "company-audios"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Uploads an MP3 (`audio/mpeg`, up to 20 MB) as `multipart/form-data` with fields `file`, `name`, `type`.\nThe file is converted asynchronously to 8 kHz mono WAV for the PBX; `url`/`size` are filled after conversion\n(usually within a few seconds), the original MP3 is then removed. Always send `category: additional` or omit it.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Stores the file, schedules conversion to WAV, reloads audio on the PBX."
              },
              "response": [
                {
                  "name": "200 Created record (url/size appear after conversion).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Uploads an MP3 (`audio/mpeg`, up to 20 MB) as `multipart/form-data` with fields `file`, `name`, `type`.\nThe file is converted asynchronously to 8 kHz mono WAV for the PBX; `url`/`size` are filled after conversion\n(usually within a few seconds), the original MP3 is then removed. Always send `category: additional` or omit it.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Stores the file, schedules conversion to WAV, reloads audio on the PBX."
                  },
                  "status": "Created record (url/size appear after conversion).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 157,\n    \"attributes\": {\n      \"name\": \"Greeting\",\n      \"type\": \"sound\",\n      \"category\": \"additional\",\n      \"url\": null,\n      \"size\": null,\n      \"createdAt\": \"2026-02-02T09:00:00.000Z\",\n      \"updatedAt\": \"2026-02-02T09:00:00.000Z\",\n      \"file\": {\n        \"data\": {\n          \"id\": 1002,\n          \"attributes\": {\n            \"name\": \"greeting.mp3\",\n            \"ext\": \".mp3\",\n            \"mime\": \"audio/mpeg\",\n            \"size\": 310.5,\n            \"url\": \"/uploads/greeting_mp3_d4e5f6.mp3\",\n            \"hash\": \"greeting_mp3_d4e5f6\",\n            \"provider\": \"local\",\n            \"createdAt\": \"2026-02-02T09:00:00.000Z\",\n            \"updatedAt\": \"2026-02-02T09:00:00.000Z\"\n          }\n        }\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 File missing, too large or not MP3.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Uploads an MP3 (`audio/mpeg`, up to 20 MB) as `multipart/form-data` with fields `file`, `name`, `type`.\nThe file is converted asynchronously to 8 kHz mono WAV for the PBX; `url`/`size` are filled after conversion\n(usually within a few seconds), the original MP3 is then removed. Always send `category: additional` or omit it.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Stores the file, schedules conversion to WAV, reloads audio on the PBX."
                  },
                  "status": "File missing, too large or not MP3.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Missing file\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Uploads an MP3 (`audio/mpeg`, up to 20 MB) as `multipart/form-data` with fields `file`, `name`, `type`.\nThe file is converted asynchronously to 8 kHz mono WAV for the PBX; `url`/`size` are filled after conversion\n(usually within a few seconds), the original MP3 is then removed. Always send `category: additional` or omit it.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Stores the file, schedules conversion to WAV, reloads audio on the PBX."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Uploads an MP3 (`audio/mpeg`, up to 20 MB) as `multipart/form-data` with fields `file`, `name`, `type`.\nThe file is converted asynchronously to 8 kHz mono WAV for the PBX; `url`/`size` are filled after conversion\n(usually within a few seconds), the original MP3 is then removed. Always send `category: additional` or omit it.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Stores the file, schedules conversion to WAV, reloads audio on the PBX."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get an audio file",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/company-audios/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "company-audios",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "156",
                      "description": "Audio file id."
                    }
                  ]
                },
                "description": "Returns one audio file with `file` and `owner` populated. System library files (`category: base`) are visible to\neveryone; a company file of another company yields 400 \"Not found\"; a non-existent id yields `data: null`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Audio file or null.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "156",
                          "description": "Audio file id."
                        }
                      ]
                    },
                    "description": "Returns one audio file with `file` and `owner` populated. System library files (`category: base`) are visible to\neveryone; a company file of another company yields 400 \"Not found\"; a non-existent id yields `data: null`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Audio file or null.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 156,\n    \"attributes\": {\n      \"name\": \"Greeting\",\n      \"type\": \"sound\",\n      \"category\": \"additional\",\n      \"url\": \"/uploads/sound/company_7/greeting.wav/greeting_wav_a1b2c3.wav\",\n      \"size\": 154.69,\n      \"createdAt\": \"2026-01-20T12:08:36.711Z\",\n      \"updatedAt\": \"2026-01-20T12:08:36.711Z\",\n      \"file\": {\n        \"data\": {\n          \"id\": 1001,\n          \"attributes\": {\n            \"name\": \"greeting.wav\",\n            \"ext\": \".wav\",\n            \"mime\": \"audio/mpeg\",\n            \"size\": 154.69,\n            \"url\": \"/uploads/sound/company_7/greeting.wav/greeting_wav_a1b2c3.wav\",\n            \"hash\": \"greeting_wav_a1b2c3\",\n            \"provider\": \"local\",\n            \"createdAt\": \"2026-01-20T12:08:30.000Z\",\n            \"updatedAt\": \"2026-01-20T12:08:36.000Z\"\n          }\n        }\n      },\n      \"owner\": {\n        \"data\": {\n          \"id\": 42,\n          \"attributes\": {\n            \"username\": \"owner\",\n            \"email\": \"owner@example.com\",\n            \"firstName\": \"John\",\n            \"lastName\": \"Doe\"\n          }\n        }\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 File belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "156",
                          "description": "Audio file id."
                        }
                      ]
                    },
                    "description": "Returns one audio file with `file` and `owner` populated. System library files (`category: base`) are visible to\neveryone; a company file of another company yields 400 \"Not found\"; a non-existent id yields `data: null`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "File belongs to another company.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"Not found\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "156",
                          "description": "Audio file id."
                        }
                      ]
                    },
                    "description": "Returns one audio file with `file` and `owner` populated. System library files (`category: base`) are visible to\neveryone; a company file of another company yields 400 \"Not found\"; a non-existent id yields `data: null`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "156",
                          "description": "Audio file id."
                        }
                      ]
                    },
                    "description": "Returns one audio file with `file` and `owner` populated. System library files (`category: base`) are visible to\neveryone; a company file of another company yields 400 \"Not found\"; a non-existent id yields `data: null`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Rename / change an audio file",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/company-audios/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "company-audios",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "156",
                      "description": "Audio file id."
                    }
                  ]
                },
                "description": "Updates `name` / `type` of a company audio file. The body is **flat** (no `data` envelope); JSON or\n`multipart/form-data` with an optional new `file`. Only files of your company are updated — otherwise `data` is `null`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Reloads audio on the PBX.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Greeting v2\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated record (null if not yours).",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "156",
                          "description": "Audio file id."
                        }
                      ]
                    },
                    "description": "Updates `name` / `type` of a company audio file. The body is **flat** (no `data` envelope); JSON or\n`multipart/form-data` with an optional new `file`. Only files of your company are updated — otherwise `data` is `null`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Reloads audio on the PBX.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"name\": \"Greeting v2\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated record (null if not yours).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 156,\n    \"attributes\": {\n      \"name\": \"Greeting v2\",\n      \"type\": \"sound\",\n      \"category\": \"additional\",\n      \"url\": \"/uploads/sound/company_7/greeting.wav/greeting_wav_a1b2c3.wav\",\n      \"size\": 154.69,\n      \"createdAt\": \"2026-01-20T12:08:36.711Z\",\n      \"updatedAt\": \"2026-02-02T09:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "156",
                          "description": "Audio file id."
                        }
                      ]
                    },
                    "description": "Updates `name` / `type` of a company audio file. The body is **flat** (no `data` envelope); JSON or\n`multipart/form-data` with an optional new `file`. Only files of your company are updated — otherwise `data` is `null`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Reloads audio on the PBX.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"name\": \"Greeting v2\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "156",
                          "description": "Audio file id."
                        }
                      ]
                    },
                    "description": "Updates `name` / `type` of a company audio file. The body is **flat** (no `data` envelope); JSON or\n`multipart/form-data` with an optional new `file`. Only files of your company are updated — otherwise `data` is `null`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Reloads audio on the PBX.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"name\": \"Greeting v2\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete an audio file",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/company-audios/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "company-audios",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "156",
                      "description": "Audio file id."
                    }
                  ]
                },
                "description": "Deletes a company audio file and its stored file. Files that are still used by a call group cannot be deleted\n(400 with the entity in `data`); detach them first. Files of other companies / system files → 400 \"Not found\".\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the record and the file; reloads audio on the PBX."
              },
              "response": [
                {
                  "name": "200 Deleted record.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "156",
                          "description": "Audio file id."
                        }
                      ]
                    },
                    "description": "Deletes a company audio file and its stored file. Files that are still used by a call group cannot be deleted\n(400 with the entity in `data`); detach them first. Files of other companies / system files → 400 \"Not found\".\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the record and the file; reloads audio on the PBX."
                  },
                  "status": "Deleted record.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 156,\n    \"attributes\": {\n      \"name\": \"Greeting\",\n      \"type\": \"sound\",\n      \"category\": \"additional\",\n      \"url\": \"/uploads/sound/company_7/greeting.wav/greeting_wav_a1b2c3.wav\",\n      \"size\": 154.69,\n      \"createdAt\": \"2026-01-20T12:08:36.711Z\",\n      \"updatedAt\": \"2026-01-20T12:08:36.711Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Not found in your company, or still attached to a group (non-standard body).",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "156",
                          "description": "Audio file id."
                        }
                      ]
                    },
                    "description": "Deletes a company audio file and its stored file. Files that are still used by a call group cannot be deleted\n(400 with the entity in `data`); detach them first. Files of other companies / system files → 400 \"Not found\".\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the record and the file; reloads audio on the PBX."
                  },
                  "status": "Not found in your company, or still attached to a group (non-standard body).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"message\": \"Detach file from group before delete\",\n  \"data\": {\n    \"entity\": {\n      \"id\": 156,\n      \"name\": \"Greeting\",\n      \"type\": \"sound\",\n      \"category\": \"additional\",\n      \"groups_musiconhold\": [\n        {\n          \"id\": 9,\n          \"name\": \"Sales\"\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "156",
                          "description": "Audio file id."
                        }
                      ]
                    },
                    "description": "Deletes a company audio file and its stored file. Files that are still used by a call group cannot be deleted\n(400 with the entity in `data`); detach them first. Files of other companies / system files → 400 \"Not found\".\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the record and the file; reloads audio on the PBX."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "156",
                          "description": "Audio file id."
                        }
                      ]
                    },
                    "description": "Deletes a company audio file and its stored file. Files that are still used by a call group cannot be deleted\n(400 with the entity in `data`); detach them first. Files of other companies / system files → 400 \"Not found\".\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the record and the file; reloads audio on the PBX."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete several audio files",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/company-audios/bulk-delete?ids=156,157",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "company-audios",
                    "bulk-delete"
                  ],
                  "query": [
                    {
                      "key": "ids",
                      "value": "156,157",
                      "description": "Array of audio ids: `ids[0]=156&ids[1]=157`.",
                      "disabled": false
                    }
                  ],
                  "variable": []
                },
                "description": "Deletes several company audio files at once. Ids go in the query string: `?ids[0]=156&ids[1]=157`.\nFiles still attached to a call group (or not belonging to your company) are returned in `failed` and kept.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes records and files; reloads audio on the PBX."
              },
              "response": [
                {
                  "name": "200 Deleted and skipped files (flat objects).",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/bulk-delete?ids=156,157",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        "bulk-delete"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "156,157",
                          "description": "Array of audio ids: `ids[0]=156&ids[1]=157`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes several company audio files at once. Ids go in the query string: `?ids[0]=156&ids[1]=157`.\nFiles still attached to a call group (or not belonging to your company) are returned in `failed` and kept.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes records and files; reloads audio on the PBX."
                  },
                  "status": "Deleted and skipped files (flat objects).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"success\": [\n    {\n      \"id\": 156,\n      \"name\": \"Greeting\",\n      \"type\": \"sound\",\n      \"category\": \"additional\",\n      \"url\": \"/uploads/sound/company_7/greeting.wav/greeting_wav_a1b2c3.wav\",\n      \"size\": 154.69,\n      \"createdAt\": \"2026-01-20T12:08:36.711Z\",\n      \"updatedAt\": \"2026-01-20T12:08:36.711Z\"\n    }\n  ],\n  \"failed\": []\n}"
                },
                {
                  "name": "400 `ids` missing or not an array.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/bulk-delete?ids=156,157",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        "bulk-delete"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "156,157",
                          "description": "Array of audio ids: `ids[0]=156&ids[1]=157`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes several company audio files at once. Ids go in the query string: `?ids[0]=156&ids[1]=157`.\nFiles still attached to a call group (or not belonging to your company) are returned in `failed` and kept.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes records and files; reloads audio on the PBX."
                  },
                  "status": "`ids` missing or not an array.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"Field ids is empty or has invalid type\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/bulk-delete?ids=156,157",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        "bulk-delete"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "156,157",
                          "description": "Array of audio ids: `ids[0]=156&ids[1]=157`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes several company audio files at once. Ids go in the query string: `?ids[0]=156&ids[1]=157`.\nFiles still attached to a call group (or not belonging to your company) are returned in `failed` and kept.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes records and files; reloads audio on the PBX."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/bulk-delete?ids=156,157",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        "bulk-delete"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "156,157",
                          "description": "Array of audio ids: `ids[0]=156&ids[1]=157`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes several company audio files at once. Ids go in the query string: `?ids[0]=156&ids[1]=157`.\nFiles still attached to a call group (or not belonging to your company) are returned in `failed` and kept.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes records and files; reloads audio on the PBX."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Total size of audio files",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/company-audios/findTotalSize",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "company-audios",
                    "findTotalSize"
                  ],
                  "query": [
                    {
                      "key": "category",
                      "value": "additional",
                      "description": "`additional` (default) or `base`.",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Returns the sum of `size` of the company's audio files (`category=additional`, default) or of the system library\n(`category=base`). Used to show storage usage.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Total size.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/findTotalSize",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        "findTotalSize"
                      ],
                      "query": [
                        {
                          "key": "category",
                          "value": "additional",
                          "description": "`additional` (default) or `base`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the sum of `size` of the company's audio files (`category=additional`, default) or of the system library\n(`category=base`). Used to show storage usage.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Total size.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"size\": 2697.81\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/findTotalSize",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        "findTotalSize"
                      ],
                      "query": [
                        {
                          "key": "category",
                          "value": "additional",
                          "description": "`additional` (default) or `base`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the sum of `size` of the company's audio files (`category=additional`, default) or of the system library\n(`category=base`). Used to show storage usage.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/company-audios/findTotalSize",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "company-audios",
                        "findTotalSize"
                      ],
                      "query": [
                        {
                          "key": "category",
                          "value": "additional",
                          "description": "`additional` (default) or `base`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the sum of `size` of the company's audio files (`category=additional`, default) or of the system library\n(`category=base`). Used to show storage usage.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get a user by id",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/users/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "users",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "43",
                      "description": "User id."
                    }
                  ]
                },
                "description": "Returns a user record as a flat object (no `data` envelope). Use `populate` to include `role`, `company`, `sip`.\nIntended for reading employees of your own company (e.g. after `GET /companies/getEmployees`).\nPrivate fields (password, reset tokens) are never returned with values.\n\n\n**Required role:** Employee, Public, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 User.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/users/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "users",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "43",
                          "description": "User id."
                        }
                      ]
                    },
                    "description": "Returns a user record as a flat object (no `data` envelope). Use `populate` to include `role`, `company`, `sip`.\nIntended for reading employees of your own company (e.g. after `GET /companies/getEmployees`).\nPrivate fields (password, reset tokens) are never returned with values.\n\n\n**Required role:** Employee, Public, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "User.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 43,\n  \"username\": \"jane\",\n  \"email\": \"jane@example.com\",\n  \"provider\": \"local\",\n  \"confirmed\": true,\n  \"blocked\": false,\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"middleName\": null,\n  \"type\": false,\n  \"birthDate\": null,\n  \"defaultLang\": \"en\",\n  \"registration_platform\": null,\n  \"referral_uid\": \"0a1b2c3d4e5f60718293a4b5c6d7e8f9\",\n  \"createdAt\": \"2026-01-20T10:00:00.000Z\",\n  \"updatedAt\": \"2026-01-20T10:00:00.000Z\"\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/users/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "users",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "43",
                          "description": "User id."
                        }
                      ]
                    },
                    "description": "Returns a user record as a flat object (no `data` envelope). Use `populate` to include `role`, `company`, `sip`.\nIntended for reading employees of your own company (e.g. after `GET /companies/getEmployees`).\nPrivate fields (password, reset tokens) are never returned with values.\n\n\n**Required role:** Employee, Public, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/users/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "users",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "43",
                          "description": "User id."
                        }
                      ]
                    },
                    "description": "Returns a user record as a flat object (no `data` envelope). Use `populate` to include `role`, `company`, `sip`.\nIntended for reading employees of your own company (e.g. after `GET /companies/getEmployees`).\nPrivate fields (password, reset tokens) are never returned with values.\n\n\n**Required role:** Employee, Public, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/users/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "users",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "43",
                          "description": "User id."
                        }
                      ]
                    },
                    "description": "Returns a user record as a flat object (no `data` envelope). Use `populate` to include `role`, `company`, `sip`.\nIntended for reading employees of your own company (e.g. after `GET /companies/getEmployees`).\nPrivate fields (password, reset tokens) are never returned with values.\n\n\n**Required role:** Employee, Public, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update a user record (own profile)",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/users/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "users",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "42",
                      "description": "User id (your own id from GET /users/me)."
                    }
                  ]
                },
                "description": "Core Strapi user update. The body is **flat** (no `data` envelope). Use it to update your own profile fields:\n`firstName`, `lastName`, `middleName`, `birthDate`, `defaultLang`, `username`, `email`.\nTo manage employees prefer `PUT /employees/{id}` (restricted to your company) and\n`POST /employees/changePassword/{id}`. Do not send `role`, `company` or `sip` here.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** Updates the user; a new `password`, if sent, replaces the current one.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"firstName\": \"John\",\n  \"lastName\": \"Doe\",\n  \"defaultLang\": \"uk\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated user (flat).",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/users/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "users",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "42",
                          "description": "User id (your own id from GET /users/me)."
                        }
                      ]
                    },
                    "description": "Core Strapi user update. The body is **flat** (no `data` envelope). Use it to update your own profile fields:\n`firstName`, `lastName`, `middleName`, `birthDate`, `defaultLang`, `username`, `email`.\nTo manage employees prefer `PUT /employees/{id}` (restricted to your company) and\n`POST /employees/changePassword/{id}`. Do not send `role`, `company` or `sip` here.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** Updates the user; a new `password`, if sent, replaces the current one.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"firstName\": \"John\",\n  \"lastName\": \"Doe\",\n  \"defaultLang\": \"uk\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated user (flat).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 42,\n  \"username\": \"owner\",\n  \"email\": \"owner@example.com\",\n  \"provider\": \"local\",\n  \"confirmed\": true,\n  \"blocked\": false,\n  \"firstName\": \"John\",\n  \"lastName\": \"Doe\",\n  \"middleName\": null,\n  \"type\": false,\n  \"birthDate\": null,\n  \"defaultLang\": \"uk\",\n  \"registration_platform\": \"global\",\n  \"referral_uid\": \"f5436f2e0178004a599a96209c746f78\",\n  \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n  \"updatedAt\": \"2026-02-02T09:00:00.000Z\"\n}"
                },
                {
                  "name": "400 Duplicate login/e-mail or empty password.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/users/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "users",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "42",
                          "description": "User id (your own id from GET /users/me)."
                        }
                      ]
                    },
                    "description": "Core Strapi user update. The body is **flat** (no `data` envelope). Use it to update your own profile fields:\n`firstName`, `lastName`, `middleName`, `birthDate`, `defaultLang`, `username`, `email`.\nTo manage employees prefer `PUT /employees/{id}` (restricted to your company) and\n`POST /employees/changePassword/{id}`. Do not send `role`, `company` or `sip` here.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** Updates the user; a new `password`, if sent, replaces the current one.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"firstName\": \"John\",\n  \"lastName\": \"Doe\",\n  \"defaultLang\": \"uk\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Duplicate login/e-mail or empty password.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"Username already taken\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/users/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "users",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "42",
                          "description": "User id (your own id from GET /users/me)."
                        }
                      ]
                    },
                    "description": "Core Strapi user update. The body is **flat** (no `data` envelope). Use it to update your own profile fields:\n`firstName`, `lastName`, `middleName`, `birthDate`, `defaultLang`, `username`, `email`.\nTo manage employees prefer `PUT /employees/{id}` (restricted to your company) and\n`POST /employees/changePassword/{id}`. Do not send `role`, `company` or `sip` here.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** Updates the user; a new `password`, if sent, replaces the current one.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"firstName\": \"John\",\n  \"lastName\": \"Doe\",\n  \"defaultLang\": \"uk\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/users/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "users",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "42",
                          "description": "User id (your own id from GET /users/me)."
                        }
                      ]
                    },
                    "description": "Core Strapi user update. The body is **flat** (no `data` envelope). Use it to update your own profile fields:\n`firstName`, `lastName`, `middleName`, `birthDate`, `defaultLang`, `username`, `email`.\nTo manage employees prefer `PUT /employees/{id}` (restricted to your company) and\n`POST /employees/changePassword/{id}`. Do not send `role`, `company` or `sip` here.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** Updates the user; a new `password`, if sent, replaces the current one.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"firstName\": \"John\",\n  \"lastName\": \"Doe\",\n  \"defaultLang\": \"uk\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 User not found.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/users/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "users",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "42",
                          "description": "User id (your own id from GET /users/me)."
                        }
                      ]
                    },
                    "description": "Core Strapi user update. The body is **flat** (no `data` envelope). Use it to update your own profile fields:\n`firstName`, `lastName`, `middleName`, `birthDate`, `defaultLang`, `username`, `email`.\nTo manage employees prefer `PUT /employees/{id}` (restricted to your company) and\n`POST /employees/changePassword/{id}`. Do not send `role`, `company` or `sip` here.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** Updates the user; a new `password`, if sent, replaces the current one.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"firstName\": \"John\",\n  \"lastName\": \"Doe\",\n  \"defaultLang\": \"uk\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "User not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"User not found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            }
          ]
        },
        {
          "name": "Notifications",
          "description": "In-app notifications, notification settings and push tokens.",
          "item": [
            {
              "name": "Unread counters for the bell icon",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/user-notifications/inbox/summary",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-notifications",
                    "inbox",
                    "summary"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the number of unread personal notifications (push notifications sent to this user) and unread news\n(published announcements visible to the user, hidden ones excluded). Poll it to render the badge.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Counters.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/summary",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "summary"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the number of unread personal notifications (push notifications sent to this user) and unread news\n(published announcements visible to the user, hidden ones excluded). Poll it to render the badge.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Counters.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"personalUnread\": 3,\n    \"newsUnread\": 1,\n    \"hasUnread\": true\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/summary",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "summary"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the number of unread personal notifications (push notifications sent to this user) and unread news\n(published announcements visible to the user, hidden ones excluded). Poll it to render the badge.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/summary",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "summary"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the number of unread personal notifications (push notifications sent to this user) and unread news\n(published announcements visible to the user, hidden ones excluded). Poll it to render the badge.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Personal notifications inbox",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/user-notifications/inbox/personal",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-notifications",
                    "inbox",
                    "personal"
                  ],
                  "query": [
                    {
                      "key": "page",
                      "value": "1",
                      "description": "Page number (from 1).",
                      "disabled": true
                    },
                    {
                      "key": "pageSize",
                      "value": "20",
                      "description": "Page size (default 20).",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Returns the user's personal notifications (the same events that are sent as push: order status, expiring numbers,\nlow balance, missed calls, …), newest first, both as a flat `items` list and grouped by day in `groups`.\nPagination uses plain `page` / `pageSize` query parameters (default 1 / 20).\n`payload` carries event-specific fields (orderId, orderStatus, amount, phone, subscriptionId, redirect_link, …) for deep links.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Notifications.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/personal",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "personal"
                      ],
                      "query": [
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Page number (from 1).",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "20",
                          "description": "Page size (default 20).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the user's personal notifications (the same events that are sent as push: order status, expiring numbers,\nlow balance, missed calls, …), newest first, both as a flat `items` list and grouped by day in `groups`.\nPagination uses plain `page` / `pageSize` query parameters (default 1 / 20).\n`payload` carries event-specific fields (orderId, orderStatus, amount, phone, subscriptionId, redirect_link, …) for deep links.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Notifications.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"groups\": [\n      {\n        \"date\": \"2026-02-02\",\n        \"items\": [\n          {\n            \"id\": 501,\n            \"serviceName\": \"fcm\",\n            \"isSend\": true,\n            \"isRead\": false,\n            \"readAt\": null,\n            \"createdAt\": \"2026-02-02T07:00:05.193Z\",\n            \"updatedAt\": \"2026-02-02T07:00:05.193Z\",\n            \"templateName\": \"expiresPhoneAfter3Days\",\n            \"title\": \"Number 380441234567 expires in 3 days\",\n            \"description\": \"Top up 229 ₴ to renew the number\",\n            \"payload\": {\n              \"templateName\": \"expiresPhoneAfter3Days\",\n              \"title\": \"Number 380441234567 expires in 3 days\",\n              \"description\": \"Top up 229 ₴ to renew the number\",\n              \"amount\": 229,\n              \"phone\": \"380441234567\"\n            }\n          }\n        ]\n      }\n    ],\n    \"items\": [\n      {\n        \"id\": 501,\n        \"serviceName\": \"fcm\",\n        \"isSend\": true,\n        \"isRead\": false,\n        \"readAt\": null,\n        \"createdAt\": \"2026-02-02T07:00:05.193Z\",\n        \"updatedAt\": \"2026-02-02T07:00:05.193Z\",\n        \"templateName\": \"expiresPhoneAfter3Days\",\n        \"title\": \"Number 380441234567 expires in 3 days\",\n        \"description\": \"Top up 229 ₴ to renew the number\",\n        \"payload\": {\n          \"templateName\": \"expiresPhoneAfter3Days\",\n          \"title\": \"Number 380441234567 expires in 3 days\",\n          \"description\": \"Top up 229 ₴ to renew the number\",\n          \"amount\": 229,\n          \"phone\": \"380441234567\"\n        }\n      }\n    ]\n  },\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 20,\n      \"pageCount\": 3,\n      \"total\": 59\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/personal",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "personal"
                      ],
                      "query": [
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Page number (from 1).",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "20",
                          "description": "Page size (default 20).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the user's personal notifications (the same events that are sent as push: order status, expiring numbers,\nlow balance, missed calls, …), newest first, both as a flat `items` list and grouped by day in `groups`.\nPagination uses plain `page` / `pageSize` query parameters (default 1 / 20).\n`payload` carries event-specific fields (orderId, orderStatus, amount, phone, subscriptionId, redirect_link, …) for deep links.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/personal",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "personal"
                      ],
                      "query": [
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Page number (from 1).",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "20",
                          "description": "Page size (default 20).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the user's personal notifications (the same events that are sent as push: order status, expiring numbers,\nlow balance, missed calls, …), newest first, both as a flat `items` list and grouped by day in `groups`.\nPagination uses plain `page` / `pageSize` query parameters (default 1 / 20).\n`payload` carries event-specific fields (orderId, orderStatus, amount, phone, subscriptionId, redirect_link, …) for deep links.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Mark personal notifications as read",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/user-notifications/inbox/personal/read",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-notifications",
                    "inbox",
                    "personal",
                    "read"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Marks the given personal notifications (`data.ids`) or all unread ones (`data.all: true`) as read.\nOnly the caller's own notifications are affected. Returns the number of updated rows.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Sets isRead/readAt on the notifications.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"ids\": [\n      501,\n      502\n    ]\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Number of notifications marked.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/personal/read",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "personal",
                        "read"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Marks the given personal notifications (`data.ids`) or all unread ones (`data.all: true`) as read.\nOnly the caller's own notifications are affected. Returns the number of updated rows.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Sets isRead/readAt on the notifications.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"ids\": [\n      501,\n      502\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Number of notifications marked.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"updated\": 2\n  }\n}"
                },
                {
                  "name": "400 Neither `all` nor a non-empty `ids`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/personal/read",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "personal",
                        "read"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Marks the given personal notifications (`data.ids`) or all unread ones (`data.all: true`) as read.\nOnly the caller's own notifications are affected. Returns the number of updated rows.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Sets isRead/readAt on the notifications.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"ids\": [\n      501,\n      502\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Neither `all` nor a non-empty `ids`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"`ids` must be non-empty array\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/personal/read",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "personal",
                        "read"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Marks the given personal notifications (`data.ids`) or all unread ones (`data.all: true`) as read.\nOnly the caller's own notifications are affected. Returns the number of updated rows.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Sets isRead/readAt on the notifications.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"ids\": [\n      501,\n      502\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/personal/read",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "personal",
                        "read"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Marks the given personal notifications (`data.ids`) or all unread ones (`data.all: true`) as read.\nOnly the caller's own notifications are affected. Returns the number of updated rows.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Sets isRead/readAt on the notifications.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"ids\": [\n      501,\n      502\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "News / announcements inbox",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/user-notifications/inbox/news",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-notifications",
                    "inbox",
                    "news"
                  ],
                  "query": [
                    {
                      "key": "page",
                      "value": "1",
                      "description": "Page number (from 1).",
                      "disabled": true
                    },
                    {
                      "key": "pageSize",
                      "value": "20",
                      "description": "Page size (default 20).",
                      "disabled": true
                    },
                    {
                      "key": "includeHidden",
                      "value": "false",
                      "description": "`true` — also return news the user has hidden.",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Returns published announcements from OneVOIPlanet addressed to everyone or to this user, newest first, with the\nuser's read/hidden state. Hidden items are omitted unless `includeHidden=true`.\nPagination uses plain `page` / `pageSize` (default 1 / 20). `body` is rich text (Markdown).\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 News.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/news",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "news"
                      ],
                      "query": [
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Page number (from 1).",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "20",
                          "description": "Page size (default 20).",
                          "disabled": true
                        },
                        {
                          "key": "includeHidden",
                          "value": "false",
                          "description": "`true` — also return news the user has hidden.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns published announcements from OneVOIPlanet addressed to everyone or to this user, newest first, with the\nuser's read/hidden state. Hidden items are omitted unless `includeHidden=true`.\nPagination uses plain `page` / `pageSize` (default 1 / 20). `body` is rich text (Markdown).\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "News.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"groups\": [\n      {\n        \"date\": \"2026-02-01\",\n        \"items\": [\n          {\n            \"id\": 5,\n            \"title\": \"New eSIM bundles\",\n            \"description\": \"Regional eSIM bundles are now available.\",\n            \"body\": \"Regional **eSIM** bundles are now available in the cabinet.\",\n            \"image\": null,\n            \"publishedAt\": \"2026-02-01T14:12:28.987Z\",\n            \"createdAt\": \"2026-02-01T14:12:27.857Z\",\n            \"updatedAt\": \"2026-02-01T14:12:28.992Z\",\n            \"isRead\": false,\n            \"readAt\": null,\n            \"isHidden\": false,\n            \"hiddenAt\": null\n          }\n        ]\n      }\n    ],\n    \"items\": [\n      {\n        \"id\": 5,\n        \"title\": \"New eSIM bundles\",\n        \"description\": \"Regional eSIM bundles are now available.\",\n        \"body\": \"Regional **eSIM** bundles are now available in the cabinet.\",\n        \"image\": null,\n        \"publishedAt\": \"2026-02-01T14:12:28.987Z\",\n        \"createdAt\": \"2026-02-01T14:12:27.857Z\",\n        \"updatedAt\": \"2026-02-01T14:12:28.992Z\",\n        \"isRead\": false,\n        \"readAt\": null,\n        \"isHidden\": false,\n        \"hiddenAt\": null\n      }\n    ]\n  },\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 20,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/news",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "news"
                      ],
                      "query": [
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Page number (from 1).",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "20",
                          "description": "Page size (default 20).",
                          "disabled": true
                        },
                        {
                          "key": "includeHidden",
                          "value": "false",
                          "description": "`true` — also return news the user has hidden.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns published announcements from OneVOIPlanet addressed to everyone or to this user, newest first, with the\nuser's read/hidden state. Hidden items are omitted unless `includeHidden=true`.\nPagination uses plain `page` / `pageSize` (default 1 / 20). `body` is rich text (Markdown).\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/news",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "news"
                      ],
                      "query": [
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Page number (from 1).",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "20",
                          "description": "Page size (default 20).",
                          "disabled": true
                        },
                        {
                          "key": "includeHidden",
                          "value": "false",
                          "description": "`true` — also return news the user has hidden.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns published announcements from OneVOIPlanet addressed to everyone or to this user, newest first, with the\nuser's read/hidden state. Hidden items are omitted unless `includeHidden=true`.\nPagination uses plain `page` / `pageSize` (default 1 / 20). `body` is rich text (Markdown).\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Mark news as read",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/user-notifications/inbox/news/read",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-notifications",
                    "inbox",
                    "news",
                    "read"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Marks the given news (`data.ids`) or all visible non-hidden news (`data.all: true`) as read for the caller.\nUnknown ids are silently counted. Returns the number of items processed.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Stores the per-user read state of the news.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"all\": true\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Number of news marked (0 if nothing matched).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/news/read",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "news",
                        "read"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Marks the given news (`data.ids`) or all visible non-hidden news (`data.all: true`) as read for the caller.\nUnknown ids are silently counted. Returns the number of items processed.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Stores the per-user read state of the news.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"all\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Number of news marked (0 if nothing matched).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"updated\": 1\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/news/read",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "news",
                        "read"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Marks the given news (`data.ids`) or all visible non-hidden news (`data.all: true`) as read for the caller.\nUnknown ids are silently counted. Returns the number of items processed.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Stores the per-user read state of the news.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"all\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/news/read",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "news",
                        "read"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Marks the given news (`data.ids`) or all visible non-hidden news (`data.all: true`) as read for the caller.\nUnknown ids are silently counted. Returns the number of items processed.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Stores the per-user read state of the news.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"all\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Hide news items",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/user-notifications/inbox/news/hide",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-notifications",
                    "inbox",
                    "news",
                    "hide"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Hides the given news for the caller (they disappear from `/inbox/news` unless `includeHidden=true` and stop\ncounting as unread). Pass `data.ids` — a non-empty array of news ids.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Stores the per-user hidden state of the news.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"ids\": [\n      5\n    ]\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Number of hidden news.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/news/hide",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "news",
                        "hide"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Hides the given news for the caller (they disappear from `/inbox/news` unless `includeHidden=true` and stop\ncounting as unread). Pass `data.ids` — a non-empty array of news ids.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Stores the per-user hidden state of the news.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"ids\": [\n      5\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Number of hidden news.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"hidden\": 1\n  }\n}"
                },
                {
                  "name": "400 `ids` missing or empty.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/news/hide",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "news",
                        "hide"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Hides the given news for the caller (they disappear from `/inbox/news` unless `includeHidden=true` and stop\ncounting as unread). Pass `data.ids` — a non-empty array of news ids.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Stores the per-user hidden state of the news.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"ids\": [\n      5\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`ids` missing or empty.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"`ids` must be non-empty array\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/news/hide",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "news",
                        "hide"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Hides the given news for the caller (they disappear from `/inbox/news` unless `includeHidden=true` and stop\ncounting as unread). Pass `data.ids` — a non-empty array of news ids.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Stores the per-user hidden state of the news.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"ids\": [\n      5\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/news/hide",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "news",
                        "hide"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Hides the given news for the caller (they disappear from `/inbox/news` unless `includeHidden=true` and stop\ncounting as unread). Pass `data.ids` — a non-empty array of news ids.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Stores the per-user hidden state of the news.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"ids\": [\n      5\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Hide all news",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/user-notifications/inbox/news/clear",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-notifications",
                    "inbox",
                    "news",
                    "clear"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Hides every currently visible news item for the caller (\"clear all\"). No body required.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Stores the hidden state for all visible news."
              },
              "response": [
                {
                  "name": "200 Number of hidden news.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/news/clear",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "news",
                        "clear"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Hides every currently visible news item for the caller (\"clear all\"). No body required.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Stores the hidden state for all visible news."
                  },
                  "status": "Number of hidden news.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"hidden\": 4\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/news/clear",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "news",
                        "clear"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Hides every currently visible news item for the caller (\"clear all\"). No body required.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Stores the hidden state for all visible news."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/user-notifications/inbox/news/clear",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "user-notifications",
                        "inbox",
                        "news",
                        "clear"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Hides every currently visible news item for the caller (\"clear all\"). No body required.\n\n\n**Required role:** Employee, Company owner (approved)\n\n**Side effects:** Stores the hidden state for all visible news."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Notification settings of the company",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/notification-settings",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "notification-settings"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Core Strapi list filtered to the caller's company (middleware adds `filters[company][id]`), so at most one record\nis returned: contacts (e-mail / Telegram) with per-topic flags, daily digest time and the low-balance threshold.\nUse `populate=notification_contacts` to include the contacts.\n\n**Known issue:** at the moment the server rejects this request with `400 \"Invalid parameter company\"` for regular\nusers (the company filter added by the middleware is not accepted). Until fixed, read the settings from\n`GET /companies/my` → `notification_setting`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Settings of the company (0 or 1 record).",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Core Strapi list filtered to the caller's company (middleware adds `filters[company][id]`), so at most one record\nis returned: contacts (e-mail / Telegram) with per-topic flags, daily digest time and the low-balance threshold.\nUse `populate=notification_contacts` to include the contacts.\n\n**Known issue:** at the moment the server rejects this request with `400 \"Invalid parameter company\"` for regular\nusers (the company filter added by the middleware is not accepted). Until fixed, read the settings from\n`GET /companies/my` → `notification_setting`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Settings of the company (0 or 1 record).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 11,\n      \"attributes\": {\n        \"send_notification_at\": \"09:00:00.000\",\n        \"minimum_balance\": 100,\n        \"notified_minimum_balance\": null,\n        \"is_minimum_balance_notified\": false,\n        \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n        \"updatedAt\": \"2026-02-01T10:00:00.000Z\",\n        \"notification_contacts\": [\n          {\n            \"id\": 1,\n            \"type\": \"email\",\n            \"contact\": \"owner@example.com\",\n            \"finance\": true,\n            \"call\": true,\n            \"widgets\": true,\n            \"statistics\": true,\n            \"lang\": \"en\",\n            \"tgUsername\": null,\n            \"tgFirstname\": null\n          }\n        ]\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "400 Known issue: company filter rejected.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Core Strapi list filtered to the caller's company (middleware adds `filters[company][id]`), so at most one record\nis returned: contacts (e-mail / Telegram) with per-topic flags, daily digest time and the low-balance threshold.\nUse `populate=notification_contacts` to include the contacts.\n\n**Known issue:** at the moment the server rejects this request with `400 \"Invalid parameter company\"` for regular\nusers (the company filter added by the middleware is not accepted). Until fixed, read the settings from\n`GET /companies/my` → `notification_setting`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Known issue: company filter rejected.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Invalid parameter company\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Core Strapi list filtered to the caller's company (middleware adds `filters[company][id]`), so at most one record\nis returned: contacts (e-mail / Telegram) with per-topic flags, daily digest time and the low-balance threshold.\nUse `populate=notification_contacts` to include the contacts.\n\n**Known issue:** at the moment the server rejects this request with `400 \"Invalid parameter company\"` for regular\nusers (the company filter added by the middleware is not accepted). Until fixed, read the settings from\n`GET /companies/my` → `notification_setting`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Core Strapi list filtered to the caller's company (middleware adds `filters[company][id]`), so at most one record\nis returned: contacts (e-mail / Telegram) with per-topic flags, daily digest time and the low-balance threshold.\nUse `populate=notification_contacts` to include the contacts.\n\n**Known issue:** at the moment the server rejects this request with `400 \"Invalid parameter company\"` for regular\nusers (the company filter added by the middleware is not accepted). Until fixed, read the settings from\n`GET /companies/my` → `notification_setting`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Create notification settings",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/notification-settings",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "notification-settings"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Creates the notification settings record of the company (one per company; `company` is attached automatically\nand any `company` in the body is removed). Strapi envelope `{ \"data\": {...} }`.\nEach contact is an e-mail or a Telegram chat id with flags of what to receive: `finance` (balance, payments),\n`call` (missed calls), `widgets` (callback-widget requests), `statistics` (daily statistics digest).\nContacts must be unique. For contacts with `widgets: true` a daily digest is scheduled at `send_notification_at` (Kyiv time).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** Creates the settings; schedules daily widget digest jobs for contacts with `widgets: true`.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"send_notification_at\": \"09:00:00\",\n    \"minimum_balance\": 100,\n    \"notification_contacts\": [\n      {\n        \"type\": \"email\",\n        \"contact\": \"owner@example.com\",\n        \"finance\": true,\n        \"call\": true,\n        \"widgets\": true,\n        \"statistics\": true,\n        \"lang\": \"en\"\n      }\n    ]\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created settings.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates the notification settings record of the company (one per company; `company` is attached automatically\nand any `company` in the body is removed). Strapi envelope `{ \"data\": {...} }`.\nEach contact is an e-mail or a Telegram chat id with flags of what to receive: `finance` (balance, payments),\n`call` (missed calls), `widgets` (callback-widget requests), `statistics` (daily statistics digest).\nContacts must be unique. For contacts with `widgets: true` a daily digest is scheduled at `send_notification_at` (Kyiv time).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** Creates the settings; schedules daily widget digest jobs for contacts with `widgets: true`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"send_notification_at\": \"09:00:00\",\n    \"minimum_balance\": 100,\n    \"notification_contacts\": [\n      {\n        \"type\": \"email\",\n        \"contact\": \"owner@example.com\",\n        \"finance\": true,\n        \"call\": true,\n        \"widgets\": true,\n        \"statistics\": true,\n        \"lang\": \"en\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created settings.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 11,\n    \"attributes\": {\n      \"send_notification_at\": \"09:00:00.000\",\n      \"minimum_balance\": 100,\n      \"notified_minimum_balance\": null,\n      \"is_minimum_balance_notified\": null,\n      \"createdAt\": \"2026-02-02T09:00:00.000Z\",\n      \"updatedAt\": \"2026-02-02T09:00:00.000Z\",\n      \"notification_contacts\": [\n        {\n          \"id\": 1,\n          \"type\": \"email\",\n          \"contact\": \"owner@example.com\",\n          \"finance\": true,\n          \"call\": true,\n          \"widgets\": true,\n          \"statistics\": true,\n          \"lang\": \"en\",\n          \"tgUsername\": null,\n          \"tgFirstname\": null\n        }\n      ]\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Duplicate contacts or validation error.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates the notification settings record of the company (one per company; `company` is attached automatically\nand any `company` in the body is removed). Strapi envelope `{ \"data\": {...} }`.\nEach contact is an e-mail or a Telegram chat id with flags of what to receive: `finance` (balance, payments),\n`call` (missed calls), `widgets` (callback-widget requests), `statistics` (daily statistics digest).\nContacts must be unique. For contacts with `widgets: true` a daily digest is scheduled at `send_notification_at` (Kyiv time).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** Creates the settings; schedules daily widget digest jobs for contacts with `widgets: true`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"send_notification_at\": \"09:00:00\",\n    \"minimum_balance\": 100,\n    \"notification_contacts\": [\n      {\n        \"type\": \"email\",\n        \"contact\": \"owner@example.com\",\n        \"finance\": true,\n        \"call\": true,\n        \"widgets\": true,\n        \"statistics\": true,\n        \"lang\": \"en\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Duplicate contacts or validation error.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Emails not unique\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates the notification settings record of the company (one per company; `company` is attached automatically\nand any `company` in the body is removed). Strapi envelope `{ \"data\": {...} }`.\nEach contact is an e-mail or a Telegram chat id with flags of what to receive: `finance` (balance, payments),\n`call` (missed calls), `widgets` (callback-widget requests), `statistics` (daily statistics digest).\nContacts must be unique. For contacts with `widgets: true` a daily digest is scheduled at `send_notification_at` (Kyiv time).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** Creates the settings; schedules daily widget digest jobs for contacts with `widgets: true`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"send_notification_at\": \"09:00:00\",\n    \"minimum_balance\": 100,\n    \"notification_contacts\": [\n      {\n        \"type\": \"email\",\n        \"contact\": \"owner@example.com\",\n        \"finance\": true,\n        \"call\": true,\n        \"widgets\": true,\n        \"statistics\": true,\n        \"lang\": \"en\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates the notification settings record of the company (one per company; `company` is attached automatically\nand any `company` in the body is removed). Strapi envelope `{ \"data\": {...} }`.\nEach contact is an e-mail or a Telegram chat id with flags of what to receive: `finance` (balance, payments),\n`call` (missed calls), `widgets` (callback-widget requests), `statistics` (daily statistics digest).\nContacts must be unique. For contacts with `widgets: true` a daily digest is scheduled at `send_notification_at` (Kyiv time).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** Creates the settings; schedules daily widget digest jobs for contacts with `widgets: true`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"send_notification_at\": \"09:00:00\",\n    \"minimum_balance\": 100,\n    \"notification_contacts\": [\n      {\n        \"type\": \"email\",\n        \"contact\": \"owner@example.com\",\n        \"finance\": true,\n        \"call\": true,\n        \"widgets\": true,\n        \"statistics\": true,\n        \"lang\": \"en\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get notification settings by id",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/notification-settings/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "notification-settings",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "11",
                      "description": "Settings id."
                    }
                  ]
                },
                "description": "Core Strapi read of the settings record, restricted to the caller's company by middleware.\n**Known issue:** currently answers `400 \"Invalid parameter company\"` (see `GET /notification-settings`);\nuse `GET /companies/my` → `notification_setting` instead.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Settings.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "11",
                          "description": "Settings id."
                        }
                      ]
                    },
                    "description": "Core Strapi read of the settings record, restricted to the caller's company by middleware.\n**Known issue:** currently answers `400 \"Invalid parameter company\"` (see `GET /notification-settings`);\nuse `GET /companies/my` → `notification_setting` instead.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Settings.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 11,\n    \"attributes\": {\n      \"send_notification_at\": \"09:00:00.000\",\n      \"minimum_balance\": 100,\n      \"notified_minimum_balance\": null,\n      \"is_minimum_balance_notified\": false,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T10:00:00.000Z\",\n      \"notification_contacts\": [\n        {\n          \"id\": 1,\n          \"type\": \"email\",\n          \"contact\": \"owner@example.com\",\n          \"finance\": true,\n          \"call\": true,\n          \"widgets\": true,\n          \"statistics\": true,\n          \"lang\": \"en\",\n          \"tgUsername\": null,\n          \"tgFirstname\": null\n        }\n      ]\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Known issue: company filter rejected.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "11",
                          "description": "Settings id."
                        }
                      ]
                    },
                    "description": "Core Strapi read of the settings record, restricted to the caller's company by middleware.\n**Known issue:** currently answers `400 \"Invalid parameter company\"` (see `GET /notification-settings`);\nuse `GET /companies/my` → `notification_setting` instead.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Known issue: company filter rejected.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Invalid parameter company\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "11",
                          "description": "Settings id."
                        }
                      ]
                    },
                    "description": "Core Strapi read of the settings record, restricted to the caller's company by middleware.\n**Known issue:** currently answers `400 \"Invalid parameter company\"` (see `GET /notification-settings`);\nuse `GET /companies/my` → `notification_setting` instead.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "11",
                          "description": "Settings id."
                        }
                      ]
                    },
                    "description": "Core Strapi read of the settings record, restricted to the caller's company by middleware.\n**Known issue:** currently answers `400 \"Invalid parameter company\"` (see `GET /notification-settings`);\nuse `GET /companies/my` → `notification_setting` instead.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "11",
                          "description": "Settings id."
                        }
                      ]
                    },
                    "description": "Core Strapi read of the settings record, restricted to the caller's company by middleware.\n**Known issue:** currently answers `400 \"Invalid parameter company\"` (see `GET /notification-settings`);\nuse `GET /companies/my` → `notification_setting` instead.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update notification settings",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/notification-settings/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "notification-settings",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "11",
                      "description": "Settings id."
                    }
                  ]
                },
                "description": "Updates the settings record (Strapi envelope `{ \"data\": {...} }`). `notification_contacts` is a repeatable\ncomponent: send the **full** list — contacts without `id` are created, existing ones keep their `id`, omitted ones\nare removed. Contacts must be unique. Pending widget-digest jobs are re-scheduled according to the new contacts/time.\nUse the id of your company's record (`GET /companies/my` → `notification_setting.data.id`).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** Updates the settings; cancels pending widget digest jobs and schedules new ones.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"minimum_balance\": 200,\n    \"notification_contacts\": [\n      {\n        \"id\": 1,\n        \"type\": \"email\",\n        \"contact\": \"owner@example.com\",\n        \"finance\": true,\n        \"call\": true,\n        \"widgets\": false,\n        \"statistics\": true,\n        \"lang\": \"en\"\n      },\n      {\n        \"type\": \"telegram\",\n        \"contact\": \"123456789\",\n        \"finance\": true,\n        \"call\": false,\n        \"widgets\": true,\n        \"statistics\": false,\n        \"lang\": \"uk-UA\"\n      }\n    ]\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated settings.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "11",
                          "description": "Settings id."
                        }
                      ]
                    },
                    "description": "Updates the settings record (Strapi envelope `{ \"data\": {...} }`). `notification_contacts` is a repeatable\ncomponent: send the **full** list — contacts without `id` are created, existing ones keep their `id`, omitted ones\nare removed. Contacts must be unique. Pending widget-digest jobs are re-scheduled according to the new contacts/time.\nUse the id of your company's record (`GET /companies/my` → `notification_setting.data.id`).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** Updates the settings; cancels pending widget digest jobs and schedules new ones.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"minimum_balance\": 200,\n    \"notification_contacts\": [\n      {\n        \"id\": 1,\n        \"type\": \"email\",\n        \"contact\": \"owner@example.com\",\n        \"finance\": true,\n        \"call\": true,\n        \"widgets\": false,\n        \"statistics\": true,\n        \"lang\": \"en\"\n      },\n      {\n        \"type\": \"telegram\",\n        \"contact\": \"123456789\",\n        \"finance\": true,\n        \"call\": false,\n        \"widgets\": true,\n        \"statistics\": false,\n        \"lang\": \"uk-UA\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated settings.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 11,\n    \"attributes\": {\n      \"send_notification_at\": \"09:00:00.000\",\n      \"minimum_balance\": 200,\n      \"notified_minimum_balance\": null,\n      \"is_minimum_balance_notified\": false,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-02T09:00:00.000Z\",\n      \"notification_contacts\": [\n        {\n          \"id\": 1,\n          \"type\": \"email\",\n          \"contact\": \"owner@example.com\",\n          \"finance\": true,\n          \"call\": true,\n          \"widgets\": false,\n          \"statistics\": true,\n          \"lang\": \"en\",\n          \"tgUsername\": null,\n          \"tgFirstname\": null\n        },\n        {\n          \"id\": 2,\n          \"type\": \"telegram\",\n          \"contact\": \"123456789\",\n          \"finance\": true,\n          \"call\": false,\n          \"widgets\": true,\n          \"statistics\": false,\n          \"lang\": \"uk-UA\",\n          \"tgUsername\": null,\n          \"tgFirstname\": null\n        }\n      ]\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Duplicate contacts or validation error.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "11",
                          "description": "Settings id."
                        }
                      ]
                    },
                    "description": "Updates the settings record (Strapi envelope `{ \"data\": {...} }`). `notification_contacts` is a repeatable\ncomponent: send the **full** list — contacts without `id` are created, existing ones keep their `id`, omitted ones\nare removed. Contacts must be unique. Pending widget-digest jobs are re-scheduled according to the new contacts/time.\nUse the id of your company's record (`GET /companies/my` → `notification_setting.data.id`).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** Updates the settings; cancels pending widget digest jobs and schedules new ones.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"minimum_balance\": 200,\n    \"notification_contacts\": [\n      {\n        \"id\": 1,\n        \"type\": \"email\",\n        \"contact\": \"owner@example.com\",\n        \"finance\": true,\n        \"call\": true,\n        \"widgets\": false,\n        \"statistics\": true,\n        \"lang\": \"en\"\n      },\n      {\n        \"type\": \"telegram\",\n        \"contact\": \"123456789\",\n        \"finance\": true,\n        \"call\": false,\n        \"widgets\": true,\n        \"statistics\": false,\n        \"lang\": \"uk-UA\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Duplicate contacts or validation error.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Emails not unique\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "11",
                          "description": "Settings id."
                        }
                      ]
                    },
                    "description": "Updates the settings record (Strapi envelope `{ \"data\": {...} }`). `notification_contacts` is a repeatable\ncomponent: send the **full** list — contacts without `id` are created, existing ones keep their `id`, omitted ones\nare removed. Contacts must be unique. Pending widget-digest jobs are re-scheduled according to the new contacts/time.\nUse the id of your company's record (`GET /companies/my` → `notification_setting.data.id`).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** Updates the settings; cancels pending widget digest jobs and schedules new ones.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"minimum_balance\": 200,\n    \"notification_contacts\": [\n      {\n        \"id\": 1,\n        \"type\": \"email\",\n        \"contact\": \"owner@example.com\",\n        \"finance\": true,\n        \"call\": true,\n        \"widgets\": false,\n        \"statistics\": true,\n        \"lang\": \"en\"\n      },\n      {\n        \"type\": \"telegram\",\n        \"contact\": \"123456789\",\n        \"finance\": true,\n        \"call\": false,\n        \"widgets\": true,\n        \"statistics\": false,\n        \"lang\": \"uk-UA\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "11",
                          "description": "Settings id."
                        }
                      ]
                    },
                    "description": "Updates the settings record (Strapi envelope `{ \"data\": {...} }`). `notification_contacts` is a repeatable\ncomponent: send the **full** list — contacts without `id` are created, existing ones keep their `id`, omitted ones\nare removed. Contacts must be unique. Pending widget-digest jobs are re-scheduled according to the new contacts/time.\nUse the id of your company's record (`GET /companies/my` → `notification_setting.data.id`).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** Updates the settings; cancels pending widget digest jobs and schedules new ones.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"minimum_balance\": 200,\n    \"notification_contacts\": [\n      {\n        \"id\": 1,\n        \"type\": \"email\",\n        \"contact\": \"owner@example.com\",\n        \"finance\": true,\n        \"call\": true,\n        \"widgets\": false,\n        \"statistics\": true,\n        \"lang\": \"en\"\n      },\n      {\n        \"type\": \"telegram\",\n        \"contact\": \"123456789\",\n        \"finance\": true,\n        \"call\": false,\n        \"widgets\": true,\n        \"statistics\": false,\n        \"lang\": \"uk-UA\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "11",
                          "description": "Settings id."
                        }
                      ]
                    },
                    "description": "Updates the settings record (Strapi envelope `{ \"data\": {...} }`). `notification_contacts` is a repeatable\ncomponent: send the **full** list — contacts without `id` are created, existing ones keep their `id`, omitted ones\nare removed. Contacts must be unique. Pending widget-digest jobs are re-scheduled according to the new contacts/time.\nUse the id of your company's record (`GET /companies/my` → `notification_setting.data.id`).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** Updates the settings; cancels pending widget digest jobs and schedules new ones.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"minimum_balance\": 200,\n    \"notification_contacts\": [\n      {\n        \"id\": 1,\n        \"type\": \"email\",\n        \"contact\": \"owner@example.com\",\n        \"finance\": true,\n        \"call\": true,\n        \"widgets\": false,\n        \"statistics\": true,\n        \"lang\": \"en\"\n      },\n      {\n        \"type\": \"telegram\",\n        \"contact\": \"123456789\",\n        \"finance\": true,\n        \"call\": false,\n        \"widgets\": true,\n        \"statistics\": false,\n        \"lang\": \"uk-UA\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete notification settings",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/notification-settings/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "notification-settings",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "11",
                      "description": "Settings id."
                    }
                  ]
                },
                "description": "Core Strapi delete of the settings record. After deletion the company receives no e-mail/Telegram notifications\nuntil a new record is created with `POST /notification-settings`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the settings and all notification contacts."
              },
              "response": [
                {
                  "name": "200 Deleted record.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "11",
                          "description": "Settings id."
                        }
                      ]
                    },
                    "description": "Core Strapi delete of the settings record. After deletion the company receives no e-mail/Telegram notifications\nuntil a new record is created with `POST /notification-settings`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the settings and all notification contacts."
                  },
                  "status": "Deleted record.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 11,\n    \"attributes\": {\n      \"send_notification_at\": \"09:00:00.000\",\n      \"minimum_balance\": 100,\n      \"notified_minimum_balance\": null,\n      \"is_minimum_balance_notified\": false,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "11",
                          "description": "Settings id."
                        }
                      ]
                    },
                    "description": "Core Strapi delete of the settings record. After deletion the company receives no e-mail/Telegram notifications\nuntil a new record is created with `POST /notification-settings`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the settings and all notification contacts."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "11",
                          "description": "Settings id."
                        }
                      ]
                    },
                    "description": "Core Strapi delete of the settings record. After deletion the company receives no e-mail/Telegram notifications\nuntil a new record is created with `POST /notification-settings`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the settings and all notification contacts."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/notification-settings/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "notification-settings",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "11",
                          "description": "Settings id."
                        }
                      ]
                    },
                    "description": "Core Strapi delete of the settings record. After deletion the company receives no e-mail/Telegram notifications\nuntil a new record is created with `POST /notification-settings`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the settings and all notification contacts."
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Register a push (FCM) token for this device",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/firebase-tokens",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "firebase-tokens"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Registers the device's Firebase Cloud Messaging token for the authenticated user so the device receives\nnotifications. Call it after login and whenever FCM rotates the token. Strapi envelope `{ \"data\": {...} }`;\n`user` is set from the JWT. The token must look like an FCM token (100–4096 chars containing `:`).\nIf the token already exists it is re-bound to the current user and `200 { data: { id, attributes: { token } } }`\nis returned. A user keeps at most 4 tokens — the oldest are removed automatically.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Stores the token; may delete the user's oldest tokens (keeps 4); re-binds an existing token to the caller.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"token\": \"cXYZ123_example-installation-id:APA91bExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBody0123456789\",\n    \"device_os\": \"ios\",\n    \"device_id\": \"0F1E2D3C-4B5A-6978-8A9B-0C1D2E3F4A5B\",\n    \"user_label\": \"John's iPhone\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Token stored (full record), or `{ id, attributes: { token } }` when it already existed.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/firebase-tokens",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "firebase-tokens"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Registers the device's Firebase Cloud Messaging token for the authenticated user so the device receives\nnotifications. Call it after login and whenever FCM rotates the token. Strapi envelope `{ \"data\": {...} }`;\n`user` is set from the JWT. The token must look like an FCM token (100–4096 chars containing `:`).\nIf the token already exists it is re-bound to the current user and `200 { data: { id, attributes: { token } } }`\nis returned. A user keeps at most 4 tokens — the oldest are removed automatically.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Stores the token; may delete the user's oldest tokens (keeps 4); re-binds an existing token to the caller.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"token\": \"cXYZ123_example-installation-id:APA91bExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBody0123456789\",\n    \"device_os\": \"ios\",\n    \"device_id\": \"0F1E2D3C-4B5A-6978-8A9B-0C1D2E3F4A5B\",\n    \"user_label\": \"John's iPhone\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Token stored (full record), or `{ id, attributes: { token } }` when it already existed.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 845,\n    \"attributes\": {\n      \"token\": \"cXYZ123_example-installation-id:APA91bExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBody0123456789\",\n      \"user_label\": \"John's iPhone\",\n      \"device_os\": \"ios\",\n      \"device_id\": \"0F1E2D3C-4B5A-6978-8A9B-0C1D2E3F4A5B\",\n      \"createdAt\": \"2026-02-02T09:00:00.000Z\",\n      \"updatedAt\": \"2026-02-02T09:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Token has an invalid format.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/firebase-tokens",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "firebase-tokens"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Registers the device's Firebase Cloud Messaging token for the authenticated user so the device receives\nnotifications. Call it after login and whenever FCM rotates the token. Strapi envelope `{ \"data\": {...} }`;\n`user` is set from the JWT. The token must look like an FCM token (100–4096 chars containing `:`).\nIf the token already exists it is re-bound to the current user and `200 { data: { id, attributes: { token } } }`\nis returned. A user keeps at most 4 tokens — the oldest are removed automatically.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Stores the token; may delete the user's oldest tokens (keeps 4); re-binds an existing token to the caller.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"token\": \"cXYZ123_example-installation-id:APA91bExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBody0123456789\",\n    \"device_os\": \"ios\",\n    \"device_id\": \"0F1E2D3C-4B5A-6978-8A9B-0C1D2E3F4A5B\",\n    \"user_label\": \"John's iPhone\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Token has an invalid format.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"BadRequestError\",\n    \"message\": \"Invalid FCM token format\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/firebase-tokens",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "firebase-tokens"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Registers the device's Firebase Cloud Messaging token for the authenticated user so the device receives\nnotifications. Call it after login and whenever FCM rotates the token. Strapi envelope `{ \"data\": {...} }`;\n`user` is set from the JWT. The token must look like an FCM token (100–4096 chars containing `:`).\nIf the token already exists it is re-bound to the current user and `200 { data: { id, attributes: { token } } }`\nis returned. A user keeps at most 4 tokens — the oldest are removed automatically.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Stores the token; may delete the user's oldest tokens (keeps 4); re-binds an existing token to the caller.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"token\": \"cXYZ123_example-installation-id:APA91bExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBody0123456789\",\n    \"device_os\": \"ios\",\n    \"device_id\": \"0F1E2D3C-4B5A-6978-8A9B-0C1D2E3F4A5B\",\n    \"user_label\": \"John's iPhone\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/firebase-tokens",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "firebase-tokens"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Registers the device's Firebase Cloud Messaging token for the authenticated user so the device receives\nnotifications. Call it after login and whenever FCM rotates the token. Strapi envelope `{ \"data\": {...} }`;\n`user` is set from the JWT. The token must look like an FCM token (100–4096 chars containing `:`).\nIf the token already exists it is re-bound to the current user and `200 { data: { id, attributes: { token } } }`\nis returned. A user keeps at most 4 tokens — the oldest are removed automatically.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Stores the token; may delete the user's oldest tokens (keeps 4); re-binds an existing token to the caller.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"token\": \"cXYZ123_example-installation-id:APA91bExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBody0123456789\",\n    \"device_os\": \"ios\",\n    \"device_id\": \"0F1E2D3C-4B5A-6978-8A9B-0C1D2E3F4A5B\",\n    \"user_label\": \"John's iPhone\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Unregister a push token (on logout)",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/firebase-tokens/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "firebase-tokens",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "cXYZ123_example-installation-id:APA91bExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBody0123456789",
                      "description": "FCM token string (URL-encoded)."
                    }
                  ]
                },
                "description": "Deletes the FCM token of the current user. **The path parameter is the token string itself**, not the record id\n(URL-encode it). Only a token belonging to the caller is deleted; otherwise `null` is returned.\nCall it before `POST /auth/logout` so the device stops receiving pushes.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Deletes the token record."
              },
              "response": [
                {
                  "name": "200 Deleted record (flat) or null if not found for this user.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/firebase-tokens/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "firebase-tokens",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "cXYZ123_example-installation-id:APA91bExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBody0123456789",
                          "description": "FCM token string (URL-encoded)."
                        }
                      ]
                    },
                    "description": "Deletes the FCM token of the current user. **The path parameter is the token string itself**, not the record id\n(URL-encode it). Only a token belonging to the caller is deleted; otherwise `null` is returned.\nCall it before `POST /auth/logout` so the device stops receiving pushes.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Deletes the token record."
                  },
                  "status": "Deleted record (flat) or null if not found for this user.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 845,\n  \"token\": \"cXYZ123_example-installation-id:APA91bExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBody0123456789\",\n  \"user_label\": \"John's iPhone\",\n  \"device_os\": \"ios\",\n  \"device_id\": \"0F1E2D3C-4B5A-6978-8A9B-0C1D2E3F4A5B\",\n  \"createdAt\": \"2026-02-02T09:00:00.000Z\",\n  \"updatedAt\": \"2026-02-02T09:00:00.000Z\"\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/firebase-tokens/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "firebase-tokens",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "cXYZ123_example-installation-id:APA91bExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBody0123456789",
                          "description": "FCM token string (URL-encoded)."
                        }
                      ]
                    },
                    "description": "Deletes the FCM token of the current user. **The path parameter is the token string itself**, not the record id\n(URL-encode it). Only a token belonging to the caller is deleted; otherwise `null` is returned.\nCall it before `POST /auth/logout` so the device stops receiving pushes.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Deletes the token record."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/firebase-tokens/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "firebase-tokens",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "cXYZ123_example-installation-id:APA91bExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBodyExampleTokenBody0123456789",
                          "description": "FCM token string (URL-encoded)."
                        }
                      ]
                    },
                    "description": "Deletes the FCM token of the current user. **The path parameter is the token string itself**, not the record id\n(URL-encode it). Only a token belonging to the caller is deleted; otherwise `null` is returned.\nCall it before `POST /auth/logout` so the device stops receiving pushes.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Deletes the token record."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Register / unregister a VoIP push token (incoming calls)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/voip-push/update-registration",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "voip-push",
                    "update-registration"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Registers the device token used to wake the app on an **incoming call** to the user's SIP line\n(APNs VoIP push for iOS, FCM for Android/web), or removes it (`register: false`).\nStrapi envelope `{ \"data\": {...} }`. The token is bound to the SIP line of the authenticated user — the user\nmust have a SIP line, otherwise the request fails with 500.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Stores / removes the VoIP push token in the call-signalling cache.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"token\": \"a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90\",\n    \"device\": \"ios\",\n    \"register\": true\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Result.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/voip-push/update-registration",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "voip-push",
                        "update-registration"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Registers the device token used to wake the app on an **incoming call** to the user's SIP line\n(APNs VoIP push for iOS, FCM for Android/web), or removes it (`register: false`).\nStrapi envelope `{ \"data\": {...} }`. The token is bound to the SIP line of the authenticated user — the user\nmust have a SIP line, otherwise the request fails with 500.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Stores / removes the VoIP push token in the call-signalling cache.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"token\": \"a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90\",\n    \"device\": \"ios\",\n    \"register\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Result.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"tokenRegistered\": true\n}"
                },
                {
                  "name": "400 Validation error.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/voip-push/update-registration",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "voip-push",
                        "update-registration"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Registers the device token used to wake the app on an **incoming call** to the user's SIP line\n(APNs VoIP push for iOS, FCM for Android/web), or removes it (`register: false`).\nStrapi envelope `{ \"data\": {...} }`. The token is bound to the SIP line of the authenticated user — the user\nmust have a SIP line, otherwise the request fails with 500.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Stores / removes the VoIP push token in the call-signalling cache.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"token\": \"a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90\",\n    \"device\": \"ios\",\n    \"register\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"device must match the following: \\\"/(web|ios|android)/\\\"\",\n    \"details\": {\n      \"errors\": [\n        {\n          \"path\": [\n            \"device\"\n          ],\n          \"message\": \"device must match the following: \\\"/(web|ios|android)/\\\"\",\n          \"name\": \"ValidationError\"\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/voip-push/update-registration",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "voip-push",
                        "update-registration"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Registers the device token used to wake the app on an **incoming call** to the user's SIP line\n(APNs VoIP push for iOS, FCM for Android/web), or removes it (`register: false`).\nStrapi envelope `{ \"data\": {...} }`. The token is bound to the SIP line of the authenticated user — the user\nmust have a SIP line, otherwise the request fails with 500.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Stores / removes the VoIP push token in the call-signalling cache.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"token\": \"a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90\",\n    \"device\": \"ios\",\n    \"register\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/voip-push/update-registration",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "voip-push",
                        "update-registration"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Registers the device token used to wake the app on an **incoming call** to the user's SIP line\n(APNs VoIP push for iOS, FCM for Android/web), or removes it (`register: false`).\nStrapi envelope `{ \"data\": {...} }`. The token is bound to the SIP line of the authenticated user — the user\nmust have a SIP line, otherwise the request fails with 500.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Stores / removes the VoIP push token in the call-signalling cache.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"token\": \"a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90\",\n    \"device\": \"ios\",\n    \"register\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/voip-push/update-registration",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "voip-push",
                        "update-registration"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Registers the device token used to wake the app on an **incoming call** to the user's SIP line\n(APNs VoIP push for iOS, FCM for Android/web), or removes it (`register: false`).\nStrapi envelope `{ \"data\": {...} }`. The token is bound to the SIP line of the authenticated user — the user\nmust have a SIP line, otherwise the request fails with 500.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Stores / removes the VoIP push token in the call-signalling cache.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"token\": \"a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90\",\n    \"device\": \"ios\",\n    \"register\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "Money",
      "item": [
        {
          "name": "Balance & Payments",
          "description": "Balance, payment history, invoices (acts), saved cards and tariffs.",
          "item": [
            {
              "name": "Current balance",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/companies/getBalance",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "companies",
                    "getBalance"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the current balance of the company and its credit limit. The value is read from the billing core\nand cached for 30 seconds, so a charge may appear with a short delay. `limit` is the amount the balance\nmay go below zero (credit limit); `0` means no credit. Amounts are in the company currency (see `GET /companies/my`).\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Balance and credit limit.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/getBalance",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "getBalance"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the current balance of the company and its credit limit. The value is read from the billing core\nand cached for 30 seconds, so a charge may appear with a short delay. `limit` is the amount the balance\nmay go below zero (credit limit); `0` means no credit. Amounts are in the company currency (see `GET /companies/my`).\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Balance and credit limit.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"balance\": 99.98,\n  \"limit\": 5\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/getBalance",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "getBalance"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the current balance of the company and its credit limit. The value is read from the billing core\nand cached for 30 seconds, so a charge may appear with a short delay. `limit` is the amount the balance\nmay go below zero (credit limit); `0` means no credit. Amounts are in the company currency (see `GET /companies/my`).\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/getBalance",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "getBalance"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the current balance of the company and its credit limit. The value is read from the billing core\nand cached for 30 seconds, so a charge may appear with a short delay. `limit` is the amount the balance\nmay go below zero (credit limit); `0` means no credit. Amounts are in the company currency (see `GET /companies/my`).\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Payment history",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/payments",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "payments"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Strapi core list of payments of the current company (the company filter is added automatically).\nTechnical child payments (internal transfers linked to a parent payment) are hidden.\n`amount < 0` is a charge from the balance, `amount > 0` is a credit (top-up, refund).\nUseful filters: `filters[status][$eq]=approved`, `filters[createdAt][$gte]=2026-01-01`,\n`filters[order][id][$eq]=42`, `filters[subscription][id][$notNull]=true`.\nUseful populate: `populate[payment_system][fields][0]=name`, `populate[currency][fields][0]=name_short`,\n`populate[order][fields][0]=orderId`, `populate[subscription]=true`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of payments.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payments",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payments"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Strapi core list of payments of the current company (the company filter is added automatically).\nTechnical child payments (internal transfers linked to a parent payment) are hidden.\n`amount < 0` is a charge from the balance, `amount > 0` is a credit (top-up, refund).\nUseful filters: `filters[status][$eq]=approved`, `filters[createdAt][$gte]=2026-01-01`,\n`filters[order][id][$eq]=42`, `filters[subscription][id][$notNull]=true`.\nUseful populate: `populate[payment_system][fields][0]=name`, `populate[currency][fields][0]=name_short`,\n`populate[order][fields][0]=orderId`, `populate[subscription]=true`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Page of payments.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 101,\n      \"attributes\": {\n        \"status\": \"approved\",\n        \"amount\": -5.99,\n        \"commentary\": \"Payment: 1790910007661138\",\n        \"payment_result\": {\n          \"id\": 191703,\n          \"status\": 200,\n          \"message\": \"OK\"\n        },\n        \"createdAt\": \"2026-09-01T03:00:12.110Z\",\n        \"updatedAt\": \"2026-09-01T03:00:12.536Z\",\n        \"payment_system\": {\n          \"data\": {\n            \"id\": 2,\n            \"attributes\": {\n              \"name\": \"Balance\"\n            }\n          }\n        },\n        \"currency\": {\n          \"data\": {\n            \"id\": 1,\n            \"attributes\": {\n              \"name_short\": \"USD\"\n            }\n          }\n        },\n        \"order\": {\n          \"data\": {\n            \"id\": 42,\n            \"attributes\": {\n              \"orderId\": \"1788231620358546\"\n            }\n          }\n        }\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 4,\n      \"total\": 87\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payments",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payments"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Strapi core list of payments of the current company (the company filter is added automatically).\nTechnical child payments (internal transfers linked to a parent payment) are hidden.\n`amount < 0` is a charge from the balance, `amount > 0` is a credit (top-up, refund).\nUseful filters: `filters[status][$eq]=approved`, `filters[createdAt][$gte]=2026-01-01`,\n`filters[order][id][$eq]=42`, `filters[subscription][id][$notNull]=true`.\nUseful populate: `populate[payment_system][fields][0]=name`, `populate[currency][fields][0]=name_short`,\n`populate[order][fields][0]=orderId`, `populate[subscription]=true`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payments",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payments"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Strapi core list of payments of the current company (the company filter is added automatically).\nTechnical child payments (internal transfers linked to a parent payment) are hidden.\n`amount < 0` is a charge from the balance, `amount > 0` is a credit (top-up, refund).\nUseful filters: `filters[status][$eq]=approved`, `filters[createdAt][$gte]=2026-01-01`,\n`filters[order][id][$eq]=42`, `filters[subscription][id][$notNull]=true`.\nUseful populate: `populate[payment_system][fields][0]=name`, `populate[currency][fields][0]=name_short`,\n`populate[order][fields][0]=orderId`, `populate[subscription]=true`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Payment by id",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/payments/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "payments",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "101",
                      "description": "Payment id."
                    }
                  ]
                },
                "description": "Returns one payment. Use `populate` to include `payment_system`, `currency`, `order`, `subscription`.\nOnly payments of your own company should be requested; take ids from `GET /payments` or the finance feeds.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Payment.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payments/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payments",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Payment id."
                        }
                      ]
                    },
                    "description": "Returns one payment. Use `populate` to include `payment_system`, `currency`, `order`, `subscription`.\nOnly payments of your own company should be requested; take ids from `GET /payments` or the finance feeds.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Payment.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 101,\n    \"attributes\": {\n      \"status\": \"declined\",\n      \"amount\": -5.99,\n      \"commentary\": \"Payment: 1790910007661138\",\n      \"payment_result\": {\n        \"Result\": \"Not enough money on balance\"\n      },\n      \"createdAt\": \"2026-10-02T03:00:07.661Z\",\n      \"updatedAt\": \"2026-10-02T03:00:07.835Z\",\n      \"payment_system\": {\n        \"data\": {\n          \"id\": 2,\n          \"attributes\": {\n            \"name\": \"Balance\"\n          }\n        }\n      },\n      \"currency\": {\n        \"data\": {\n          \"id\": 1,\n          \"attributes\": {\n            \"name_short\": \"USD\"\n          }\n        }\n      },\n      \"order\": {\n        \"data\": null\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payments/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payments",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Payment id."
                        }
                      ]
                    },
                    "description": "Returns one payment. Use `populate` to include `payment_system`, `currency`, `order`, `subscription`.\nOnly payments of your own company should be requested; take ids from `GET /payments` or the finance feeds.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payments/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payments",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Payment id."
                        }
                      ]
                    },
                    "description": "Returns one payment. Use `populate` to include `payment_system`, `currency`, `order`, `subscription`.\nOnly payments of your own company should be requested; take ids from `GET /payments` or the finance feeds.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payments/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payments",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Payment id."
                        }
                      ]
                    },
                    "description": "Returns one payment. Use `populate` to include `payment_system`, `currency`, `order`, `subscription`.\nOnly payments of your own company should be requested; take ids from `GET /payments` or the finance feeds.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Acts (monthly statements)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/payment-acts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "payment-acts"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the acts of the current company (the company filter is added automatically). An act is a monthly\nstatement: list of charged services and per-number call costs for a period. `meta.totals` holds the sum of\n`amount` over the whole filtered set (not only the current page) in the company currency.\nUseful filters: `filters[createdAt][$gte]=2026-01-01`, `sort=createdAt:desc`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of acts with totals.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the acts of the current company (the company filter is added automatically). An act is a monthly\nstatement: list of charged services and per-number call costs for a period. `meta.totals` holds the sum of\n`amount` over the whole filtered set (not only the current page) in the company currency.\nUseful filters: `filters[createdAt][$gte]=2026-01-01`, `sort=createdAt:desc`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Page of acts with totals.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 15,\n      \"attributes\": {\n        \"name\": \"Акт рахунок за Квітень 2026\",\n        \"amount\": 2.26,\n        \"body\": {\n          \"data\": {\n            \"date\": {\n              \"from\": \"2026-04-01\",\n              \"to\": \"2026-04-30\"\n            },\n            \"dataJSON\": {\n              \"total\": 2.26,\n              \"refill\": 0,\n              \"tariff\": [],\n              \"phone\": [],\n              \"domain\": [],\n              \"esim\": [],\n              \"recall_widget\": [],\n              \"callback_widget\": [],\n              \"sip-trunk\": [],\n              \"payment\": [],\n              \"phone_calls\": [\n                [\n                  \"380441234567\",\n                  339,\n                  2.26\n                ]\n              ]\n            }\n          }\n        },\n        \"createdAt\": \"2026-05-01T05:00:04.431Z\",\n        \"updatedAt\": \"2026-05-01T05:00:04.431Z\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 3\n    },\n    \"totals\": {\n      \"amount\": 8.46,\n      \"currency\": \"UAH\"\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the acts of the current company (the company filter is added automatically). An act is a monthly\nstatement: list of charged services and per-number call costs for a period. `meta.totals` holds the sum of\n`amount` over the whole filtered set (not only the current page) in the company currency.\nUseful filters: `filters[createdAt][$gte]=2026-01-01`, `sort=createdAt:desc`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the acts of the current company (the company filter is added automatically). An act is a monthly\nstatement: list of charged services and per-number call costs for a period. `meta.totals` holds the sum of\n`amount` over the whole filtered set (not only the current page) in the company currency.\nUseful filters: `filters[createdAt][$gte]=2026-01-01`, `sort=createdAt:desc`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Act by id",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/payment-acts/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "payment-acts",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "15",
                      "description": "Act id."
                    }
                  ]
                },
                "description": "Returns one act of the current company. Acts of other companies are not found (404-like empty `data`).\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Act. `data` is null if the act does not belong to the company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Act id."
                        }
                      ]
                    },
                    "description": "Returns one act of the current company. Acts of other companies are not found (404-like empty `data`).\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Act. `data` is null if the act does not belong to the company.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 15,\n    \"attributes\": {\n      \"name\": \"Акт рахунок за Квітень 2026\",\n      \"amount\": 2.26,\n      \"body\": {\n        \"data\": {\n          \"date\": {\n            \"from\": \"2026-04-01\",\n            \"to\": \"2026-04-30\"\n          },\n          \"dataJSON\": {\n            \"total\": 2.26,\n            \"refill\": 0,\n            \"tariff\": [],\n            \"phone\": [],\n            \"domain\": [],\n            \"esim\": [],\n            \"recall_widget\": [],\n            \"callback_widget\": [],\n            \"sip-trunk\": [],\n            \"payment\": [],\n            \"phone_calls\": [\n              [\n                \"380441234567\",\n                339,\n                2.26\n              ]\n            ]\n          }\n        }\n      },\n      \"createdAt\": \"2026-05-01T05:00:04.431Z\",\n      \"updatedAt\": \"2026-05-01T05:00:04.431Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Act id."
                        }
                      ]
                    },
                    "description": "Returns one act of the current company. Acts of other companies are not found (404-like empty `data`).\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Act id."
                        }
                      ]
                    },
                    "description": "Returns one act of the current company. Acts of other companies are not found (404-like empty `data`).\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Act as PDF",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/payment-acts/:id/printPdf",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "payment-acts",
                    ":id",
                    "printPdf"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "15",
                      "description": "Act id."
                    }
                  ]
                },
                "description": "Renders the act as a PDF document (Ukrainian template) and returns the file. Available only for companies\nwhose currency is UAH and whose owner is registered as a legal entity / sole proprietor (not a physical person).\nThe document includes the opening/closing balance for the period read from the billing core.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "400 Not available for the company (currency is not UAH or the owner is a physical person).",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts/:id/printPdf",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts",
                        ":id",
                        "printPdf"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Act id."
                        }
                      ]
                    },
                    "description": "Renders the act as a PDF document (Ukrainian template) and returns the file. Available only for companies\nwhose currency is UAH and whose owner is registered as a legal entity / sole proprietor (not a physical person).\nThe document includes the opening/closing balance for the period read from the billing core.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Not available for the company (currency is not UAH or the owner is a physical person).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Unavailable for company currency is not UAH !\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts/:id/printPdf",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts",
                        ":id",
                        "printPdf"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Act id."
                        }
                      ]
                    },
                    "description": "Renders the act as a PDF document (Ukrainian template) and returns the file. Available only for companies\nwhose currency is UAH and whose owner is registered as a legal entity / sole proprietor (not a physical person).\nThe document includes the opening/closing balance for the period read from the billing core.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts/:id/printPdf",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts",
                        ":id",
                        "printPdf"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Act id."
                        }
                      ]
                    },
                    "description": "Renders the act as a PDF document (Ukrainian template) and returns the file. Available only for companies\nwhose currency is UAH and whose owner is registered as a legal entity / sole proprietor (not a physical person).\nThe document includes the opening/closing balance for the period read from the billing core.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts/:id/printPdf",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts",
                        ":id",
                        "printPdf"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Act id."
                        }
                      ]
                    },
                    "description": "Renders the act as a PDF document (Ukrainian template) and returns the file. Available only for companies\nwhose currency is UAH and whose owner is registered as a legal entity / sole proprietor (not a physical person).\nThe document includes the opening/closing balance for the period read from the billing core.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Act preview for a period",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/payment-acts/act?date_from=2026-09-01&date_to=2026-09-30",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "payment-acts",
                    "act"
                  ],
                  "query": [
                    {
                      "key": "date_from",
                      "value": "2026-09-01",
                      "description": "Period start, `YYYY-MM-DD`.",
                      "disabled": false
                    },
                    {
                      "key": "date_to",
                      "value": "2026-09-30",
                      "description": "Period end, `YYYY-MM-DD` (inclusive).",
                      "disabled": false
                    }
                  ],
                  "variable": []
                },
                "description": "Builds the act data for an arbitrary period on the fly without saving anything: charges from the balance for\nthe period grouped by service (numbers, tariff, domains, widgets, SIP trunks, eSIM, other payments) and\nper-number call costs (`phone_calls`: `[number, seconds, cost]`). The call part is fetched from the billing\ncore week by week, so long periods respond slowly (tens of seconds).\nDo not pass the `company` query parameter — it is ignored for authenticated users and breaks the request.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Act data for the period.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts/act?date_from=2026-09-01&date_to=2026-09-30",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts",
                        "act"
                      ],
                      "query": [
                        {
                          "key": "date_from",
                          "value": "2026-09-01",
                          "description": "Period start, `YYYY-MM-DD`.",
                          "disabled": false
                        },
                        {
                          "key": "date_to",
                          "value": "2026-09-30",
                          "description": "Period end, `YYYY-MM-DD` (inclusive).",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Builds the act data for an arbitrary period on the fly without saving anything: charges from the balance for\nthe period grouped by service (numbers, tariff, domains, widgets, SIP trunks, eSIM, other payments) and\nper-number call costs (`phone_calls`: `[number, seconds, cost]`). The call part is fetched from the billing\ncore week by week, so long periods respond slowly (tens of seconds).\nDo not pass the `company` query parameter — it is ignored for authenticated users and breaks the request.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Act data for the period.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"attributes\": {\n      \"data\": {\n        \"date\": {\n          \"from\": \"2026-09-01\",\n          \"to\": \"2026-09-30\"\n        },\n        \"dataJSON\": {\n          \"total\": 8.25,\n          \"refill\": 0,\n          \"tariff\": [],\n          \"phone\": [\n            {\n              \"id\": 7,\n              \"fullnumber\": \"380441234567\",\n              \"calculatedMonthPrice\": 5.99\n            }\n          ],\n          \"domain\": [],\n          \"esim\": [],\n          \"recall_widget\": [],\n          \"callback_widget\": [],\n          \"sip-trunk\": [],\n          \"payment\": [],\n          \"phone_calls\": [\n            [\n              \"380441234567\",\n              339,\n              2.26\n            ]\n          ]\n        }\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts/act?date_from=2026-09-01&date_to=2026-09-30",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts",
                        "act"
                      ],
                      "query": [
                        {
                          "key": "date_from",
                          "value": "2026-09-01",
                          "description": "Period start, `YYYY-MM-DD`.",
                          "disabled": false
                        },
                        {
                          "key": "date_to",
                          "value": "2026-09-30",
                          "description": "Period end, `YYYY-MM-DD` (inclusive).",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Builds the act data for an arbitrary period on the fly without saving anything: charges from the balance for\nthe period grouped by service (numbers, tariff, domains, widgets, SIP trunks, eSIM, other payments) and\nper-number call costs (`phone_calls`: `[number, seconds, cost]`). The call part is fetched from the billing\ncore week by week, so long periods respond slowly (tens of seconds).\nDo not pass the `company` query parameter — it is ignored for authenticated users and breaks the request.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts/act?date_from=2026-09-01&date_to=2026-09-30",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts",
                        "act"
                      ],
                      "query": [
                        {
                          "key": "date_from",
                          "value": "2026-09-01",
                          "description": "Period start, `YYYY-MM-DD`.",
                          "disabled": false
                        },
                        {
                          "key": "date_to",
                          "value": "2026-09-30",
                          "description": "Period end, `YYYY-MM-DD` (inclusive).",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Builds the act data for an arbitrary period on the fly without saving anything: charges from the balance for\nthe period grouped by service (numbers, tariff, domains, widgets, SIP trunks, eSIM, other payments) and\nper-number call costs (`phone_calls`: `[number, seconds, cost]`). The call part is fetched from the billing\ncore week by week, so long periods respond slowly (tens of seconds).\nDo not pass the `company` query parameter — it is ignored for authenticated users and breaks the request.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts/act?date_from=2026-09-01&date_to=2026-09-30",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts",
                        "act"
                      ],
                      "query": [
                        {
                          "key": "date_from",
                          "value": "2026-09-01",
                          "description": "Period start, `YYYY-MM-DD`.",
                          "disabled": false
                        },
                        {
                          "key": "date_to",
                          "value": "2026-09-30",
                          "description": "Period end, `YYYY-MM-DD` (inclusive).",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Builds the act data for an arbitrary period on the fly without saving anything: charges from the balance for\nthe period grouped by service (numbers, tariff, domains, widgets, SIP trunks, eSIM, other payments) and\nper-number call costs (`phone_calls`: `[number, seconds, cost]`). The call part is fetched from the billing\ncore week by week, so long periods respond slowly (tens of seconds).\nDo not pass the `company` query parameter — it is ignored for authenticated users and breaks the request.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Generate and save an act",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/payment-acts/generateAct?company=7&date_from=2026-09-01&date_to=2026-09-30",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "payment-acts",
                    "generateAct"
                  ],
                  "query": [
                    {
                      "key": "company",
                      "value": "7",
                      "description": "\\\"Ignored. The act is always generated for the authenticated user's company.\\\"",
                      "disabled": false
                    },
                    {
                      "key": "date_from",
                      "value": "2026-09-01",
                      "description": "Period start, `YYYY-MM-DD`. The act is named after this month.",
                      "disabled": false
                    },
                    {
                      "key": "date_to",
                      "value": "2026-09-30",
                      "description": "Period end, `YYYY-MM-DD` (inclusive).",
                      "disabled": false
                    }
                  ],
                  "variable": []
                },
                "description": "**The `company` query parameter is ignored: the act is always generated for your own company.**\n\nBuilds the act for the period (same data as `GET /payment-acts/act`) and **saves it** as a new act record\nnamed after the month of `date_from` (e.g. \"Акт рахунок за Вересень 2026\"). The saved act is then available\nin `GET /payment-acts` and as PDF. Despite the GET method this call creates data; call it once per period.\nThere is no duplicate check: a repeated call for the same period creates a second act.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates an act record for the company; a repeated call for the same period creates a duplicate. Queries the billing core for call costs."
              },
              "response": [
                {
                  "name": "200 Created act (flat object, not a Strapi envelope).",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts/generateAct?company=7&date_from=2026-09-01&date_to=2026-09-30",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts",
                        "generateAct"
                      ],
                      "query": [
                        {
                          "key": "company",
                          "value": "7",
                          "description": "\\\"Ignored. The act is always generated for the authenticated user's company.\\\"",
                          "disabled": false
                        },
                        {
                          "key": "date_from",
                          "value": "2026-09-01",
                          "description": "Period start, `YYYY-MM-DD`. The act is named after this month.",
                          "disabled": false
                        },
                        {
                          "key": "date_to",
                          "value": "2026-09-30",
                          "description": "Period end, `YYYY-MM-DD` (inclusive).",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "**The `company` query parameter is ignored: the act is always generated for your own company.**\n\nBuilds the act for the period (same data as `GET /payment-acts/act`) and **saves it** as a new act record\nnamed after the month of `date_from` (e.g. \"Акт рахунок за Вересень 2026\"). The saved act is then available\nin `GET /payment-acts` and as PDF. Despite the GET method this call creates data; call it once per period.\nThere is no duplicate check: a repeated call for the same period creates a second act.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates an act record for the company; a repeated call for the same period creates a duplicate. Queries the billing core for call costs."
                  },
                  "status": "Created act (flat object, not a Strapi envelope).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 16,\n  \"name\": \"Акт рахунок за Вересень 2026\",\n  \"amount\": 8.25,\n  \"body\": {\n    \"data\": {\n      \"date\": {\n        \"from\": \"2026-09-01\",\n        \"to\": \"2026-09-30\"\n      },\n      \"dataJSON\": {\n        \"total\": 8.25,\n        \"refill\": 0,\n        \"tariff\": [],\n        \"phone\": [\n          {\n            \"id\": 7,\n            \"fullnumber\": \"380441234567\",\n            \"calculatedMonthPrice\": 5.99\n          }\n        ],\n        \"domain\": [],\n        \"esim\": [],\n        \"recall_widget\": [],\n        \"callback_widget\": [],\n        \"sip-trunk\": [],\n        \"payment\": [],\n        \"phone_calls\": [\n          [\n            \"380441234567\",\n            339,\n            2.26\n          ]\n        ]\n      }\n    }\n  },\n  \"createdAt\": \"2026-10-01T05:00:04.431Z\",\n  \"updatedAt\": \"2026-10-01T05:00:04.431Z\"\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts/generateAct?company=7&date_from=2026-09-01&date_to=2026-09-30",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts",
                        "generateAct"
                      ],
                      "query": [
                        {
                          "key": "company",
                          "value": "7",
                          "description": "\\\"Ignored. The act is always generated for the authenticated user's company.\\\"",
                          "disabled": false
                        },
                        {
                          "key": "date_from",
                          "value": "2026-09-01",
                          "description": "Period start, `YYYY-MM-DD`. The act is named after this month.",
                          "disabled": false
                        },
                        {
                          "key": "date_to",
                          "value": "2026-09-30",
                          "description": "Period end, `YYYY-MM-DD` (inclusive).",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "**The `company` query parameter is ignored: the act is always generated for your own company.**\n\nBuilds the act for the period (same data as `GET /payment-acts/act`) and **saves it** as a new act record\nnamed after the month of `date_from` (e.g. \"Акт рахунок за Вересень 2026\"). The saved act is then available\nin `GET /payment-acts` and as PDF. Despite the GET method this call creates data; call it once per period.\nThere is no duplicate check: a repeated call for the same period creates a second act.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates an act record for the company; a repeated call for the same period creates a duplicate. Queries the billing core for call costs."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts/generateAct?company=7&date_from=2026-09-01&date_to=2026-09-30",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts",
                        "generateAct"
                      ],
                      "query": [
                        {
                          "key": "company",
                          "value": "7",
                          "description": "\\\"Ignored. The act is always generated for the authenticated user's company.\\\"",
                          "disabled": false
                        },
                        {
                          "key": "date_from",
                          "value": "2026-09-01",
                          "description": "Period start, `YYYY-MM-DD`. The act is named after this month.",
                          "disabled": false
                        },
                        {
                          "key": "date_to",
                          "value": "2026-09-30",
                          "description": "Period end, `YYYY-MM-DD` (inclusive).",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "**The `company` query parameter is ignored: the act is always generated for your own company.**\n\nBuilds the act for the period (same data as `GET /payment-acts/act`) and **saves it** as a new act record\nnamed after the month of `date_from` (e.g. \"Акт рахунок за Вересень 2026\"). The saved act is then available\nin `GET /payment-acts` and as PDF. Despite the GET method this call creates data; call it once per period.\nThere is no duplicate check: a repeated call for the same period creates a second act.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates an act record for the company; a repeated call for the same period creates a duplicate. Queries the billing core for call costs."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-acts/generateAct?company=7&date_from=2026-09-01&date_to=2026-09-30",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-acts",
                        "generateAct"
                      ],
                      "query": [
                        {
                          "key": "company",
                          "value": "7",
                          "description": "\\\"Ignored. The act is always generated for the authenticated user's company.\\\"",
                          "disabled": false
                        },
                        {
                          "key": "date_from",
                          "value": "2026-09-01",
                          "description": "Period start, `YYYY-MM-DD`. The act is named after this month.",
                          "disabled": false
                        },
                        {
                          "key": "date_to",
                          "value": "2026-09-30",
                          "description": "Period end, `YYYY-MM-DD` (inclusive).",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "**The `company` query parameter is ignored: the act is always generated for your own company.**\n\nBuilds the act for the period (same data as `GET /payment-acts/act`) and **saves it** as a new act record\nnamed after the month of `date_from` (e.g. \"Акт рахунок за Вересень 2026\"). The saved act is then available\nin `GET /payment-acts` and as PDF. Despite the GET method this call creates data; call it once per period.\nThere is no duplicate check: a repeated call for the same period creates a second act.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates an act record for the company; a repeated call for the same period creates a duplicate. Queries the billing core for call costs."
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Stripe PaymentSheet for an order (mobile)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/payment-system/stripe/payment-sheet",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "payment-system",
                    "stripe",
                    "payment-sheet"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "For mobile apps (Stripe PaymentSheet / Apple Pay / Google Pay). Creates a Stripe PaymentIntent for an order\ncreated with `POST /orders` whose payment system is Stripe (orders created with `paymentType: \"intent\"`).\nThe amount is converted from the order currency to USD cents. The card is saved to the Stripe customer for\nfuture off-session auto-renewals. The order becomes `approved` after the Stripe webhook confirms the payment.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** Creates a Stripe customer (if absent) and a PaymentIntent for the order total with the card saved for future charges; creates a payment record with status `new`. Money is charged when the client confirms the PaymentSheet.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"orderId\": \"1788231620358546\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 PaymentSheet parameters.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-sheet",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-sheet"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "For mobile apps (Stripe PaymentSheet / Apple Pay / Google Pay). Creates a Stripe PaymentIntent for an order\ncreated with `POST /orders` whose payment system is Stripe (orders created with `paymentType: \"intent\"`).\nThe amount is converted from the order currency to USD cents. The card is saved to the Stripe customer for\nfuture off-session auto-renewals. The order becomes `approved` after the Stripe webhook confirms the payment.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** Creates a Stripe customer (if absent) and a PaymentIntent for the order total with the card saved for future charges; creates a payment record with status `new`. Money is charged when the client confirms the PaymentSheet.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"orderId\": \"1788231620358546\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "PaymentSheet parameters.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"paymentIntent\": \"pi_3Q********_secret_********\",\n  \"ephemeralKey\": \"ek_test_********\",\n  \"customer\": \"cus_********\",\n  \"publishableKey\": \"pk_live_********\",\n  \"amount\": 599,\n  \"currency\": \"usd\",\n  \"recurring\": {\n    \"intervalUnit\": \"month\",\n    \"intervalCount\": 1,\n    \"amount\": 5.99,\n    \"currency\": \"usd\",\n    \"label\": \"номер +15551234567\",\n    \"description\": \"Ежемесячное продление: номер +15551234567\",\n    \"managementUrl\": \"https://cabinet.example.com/call-processing-numbers\"\n  }\n}"
                },
                {
                  "name": "400 Invalid request.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-sheet",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-sheet"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "For mobile apps (Stripe PaymentSheet / Apple Pay / Google Pay). Creates a Stripe PaymentIntent for an order\ncreated with `POST /orders` whose payment system is Stripe (orders created with `paymentType: \"intent\"`).\nThe amount is converted from the order currency to USD cents. The card is saved to the Stripe customer for\nfuture off-session auto-renewals. The order becomes `approved` after the Stripe webhook confirms the payment.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** Creates a Stripe customer (if absent) and a PaymentIntent for the order total with the card saved for future charges; creates a payment record with status `new`. Money is charged when the client confirms the PaymentSheet.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"orderId\": \"1788231620358546\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Invalid request.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"BadRequestError\",\n    \"message\": \"orderId is required\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-sheet",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-sheet"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "For mobile apps (Stripe PaymentSheet / Apple Pay / Google Pay). Creates a Stripe PaymentIntent for an order\ncreated with `POST /orders` whose payment system is Stripe (orders created with `paymentType: \"intent\"`).\nThe amount is converted from the order currency to USD cents. The card is saved to the Stripe customer for\nfuture off-session auto-renewals. The order becomes `approved` after the Stripe webhook confirms the payment.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** Creates a Stripe customer (if absent) and a PaymentIntent for the order total with the card saved for future charges; creates a payment record with status `new`. Money is charged when the client confirms the PaymentSheet.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"orderId\": \"1788231620358546\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-sheet",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-sheet"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "For mobile apps (Stripe PaymentSheet / Apple Pay / Google Pay). Creates a Stripe PaymentIntent for an order\ncreated with `POST /orders` whose payment system is Stripe (orders created with `paymentType: \"intent\"`).\nThe amount is converted from the order currency to USD cents. The card is saved to the Stripe customer for\nfuture off-session auto-renewals. The order becomes `approved` after the Stripe webhook confirms the payment.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** Creates a Stripe customer (if absent) and a PaymentIntent for the order total with the card saved for future charges; creates a payment record with status `new`. Money is charged when the client confirms the PaymentSheet.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"orderId\": \"1788231620358546\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Order not found.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-sheet",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-sheet"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "For mobile apps (Stripe PaymentSheet / Apple Pay / Google Pay). Creates a Stripe PaymentIntent for an order\ncreated with `POST /orders` whose payment system is Stripe (orders created with `paymentType: \"intent\"`).\nThe amount is converted from the order currency to USD cents. The card is saved to the Stripe customer for\nfuture off-session auto-renewals. The order becomes `approved` after the Stripe webhook confirms the payment.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** Creates a Stripe customer (if absent) and a PaymentIntent for the order total with the card saved for future charges; creates a payment record with status `new`. Money is charged when the client confirms the PaymentSheet.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"orderId\": \"1788231620358546\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Order not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Order not found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Saved card for auto-renewal",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/payment-system/stripe/payment-method",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "payment-system",
                    "stripe",
                    "payment-method"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the card that will be charged for auto-renewals: the default Stripe payment method of the company,\nor the first saved card if no default is set. `{ \"hasCard\": false }` when nothing is saved.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Default card or `hasCard: false`.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-method",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-method"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the card that will be charged for auto-renewals: the default Stripe payment method of the company,\nor the first saved card if no default is set. `{ \"hasCard\": false }` when nothing is saved.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Default card or `hasCard: false`.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"hasCard\": true,\n  \"brand\": \"visa\",\n  \"last4\": \"4242\",\n  \"expMonth\": 12,\n  \"expYear\": 2028,\n  \"isDefault\": true,\n  \"isExpired\": false\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-method",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-method"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the card that will be charged for auto-renewals: the default Stripe payment method of the company,\nor the first saved card if no default is set. `{ \"hasCard\": false }` when nothing is saved.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-method",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-method"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the card that will be charged for auto-renewals: the default Stripe payment method of the company,\nor the first saved card if no default is set. `{ \"hasCard\": false }` when nothing is saved.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Saved cards",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/payment-system/stripe/payment-methods",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "payment-system",
                    "stripe",
                    "payment-methods"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Lists all cards saved to the company's Stripe customer with the default and expired flags. Duplicate entries of the same physical card are merged on the fly.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Detaches duplicate card entries in Stripe (same card saved twice)."
              },
              "response": [
                {
                  "name": "200 Cards.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-methods",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-methods"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Lists all cards saved to the company's Stripe customer with the default and expired flags. Duplicate entries of the same physical card are merged on the fly.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Detaches duplicate card entries in Stripe (same card saved twice)."
                  },
                  "status": "Cards.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"cards\": [\n    {\n      \"id\": \"pm_********\",\n      \"brand\": \"visa\",\n      \"last4\": \"4242\",\n      \"expMonth\": 12,\n      \"expYear\": 2028,\n      \"isDefault\": true,\n      \"isExpired\": false\n    }\n  ]\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-methods",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-methods"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Lists all cards saved to the company's Stripe customer with the default and expired flags. Duplicate entries of the same physical card are merged on the fly.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Detaches duplicate card entries in Stripe (same card saved twice)."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-methods",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-methods"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Lists all cards saved to the company's Stripe customer with the default and expired flags. Duplicate entries of the same physical card are merged on the fly.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Detaches duplicate card entries in Stripe (same card saved twice)."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Make a card default",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/payment-system/stripe/payment-methods/:id/default",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "payment-system",
                    "stripe",
                    "payment-methods",
                    ":id",
                    "default"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "pm_1Q********",
                      "description": "Stripe payment method id (`pm_...`)."
                    }
                  ]
                },
                "description": "Sets the card as the default payment method; subsequent auto-renewals are charged to it. The card must belong to the company's Stripe customer.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Changes the default payment method in Stripe."
              },
              "response": [
                {
                  "name": "200 Done.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-methods/:id/default",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-methods",
                        ":id",
                        "default"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "pm_1Q********",
                          "description": "Stripe payment method id (`pm_...`)."
                        }
                      ]
                    },
                    "description": "Sets the card as the default payment method; subsequent auto-renewals are charged to it. The card must belong to the company's Stripe customer.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Changes the default payment method in Stripe."
                  },
                  "status": "Done.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"success\": true,\n  \"defaultPaymentMethod\": \"pm_1Q********\"\n}"
                },
                {
                  "name": "400 Card does not belong to the company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-methods/:id/default",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-methods",
                        ":id",
                        "default"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "pm_1Q********",
                          "description": "Stripe payment method id (`pm_...`)."
                        }
                      ]
                    },
                    "description": "Sets the card as the default payment method; subsequent auto-renewals are charged to it. The card must belong to the company's Stripe customer.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Changes the default payment method in Stripe."
                  },
                  "status": "Card does not belong to the company.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"Payment method does not belong to this company\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-methods/:id/default",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-methods",
                        ":id",
                        "default"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "pm_1Q********",
                          "description": "Stripe payment method id (`pm_...`)."
                        }
                      ]
                    },
                    "description": "Sets the card as the default payment method; subsequent auto-renewals are charged to it. The card must belong to the company's Stripe customer.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Changes the default payment method in Stripe."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-methods/:id/default",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-methods",
                        ":id",
                        "default"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "pm_1Q********",
                          "description": "Stripe payment method id (`pm_...`)."
                        }
                      ]
                    },
                    "description": "Sets the card as the default payment method; subsequent auto-renewals are charged to it. The card must belong to the company's Stripe customer.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Changes the default payment method in Stripe."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 The company has no Stripe customer (no saved cards).",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-methods/:id/default",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-methods",
                        ":id",
                        "default"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "pm_1Q********",
                          "description": "Stripe payment method id (`pm_...`)."
                        }
                      ]
                    },
                    "description": "Sets the card as the default payment method; subsequent auto-renewals are charged to it. The card must belong to the company's Stripe customer.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Changes the default payment method in Stripe."
                  },
                  "status": "The company has no Stripe customer (no saved cards).",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Stripe customer not found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Remove a saved card",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/payment-system/stripe/payment-methods/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "payment-system",
                    "stripe",
                    "payment-methods",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "pm_1Q********",
                      "description": "Stripe payment method id (`pm_...`)."
                    }
                  ]
                },
                "description": "Detaches the card from the company's Stripe customer. The last remaining card cannot be removed — to stop\ncharges, disable auto-renewal of the subscription instead (`PUT /subscriptions/update_state/{subscriptionId}`).\nIf the default card is removed, the first remaining card becomes default.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently detaches the card in Stripe; may change the default card."
              },
              "response": [
                {
                  "name": "200 Done.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-methods/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-methods",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "pm_1Q********",
                          "description": "Stripe payment method id (`pm_...`)."
                        }
                      ]
                    },
                    "description": "Detaches the card from the company's Stripe customer. The last remaining card cannot be removed — to stop\ncharges, disable auto-renewal of the subscription instead (`PUT /subscriptions/update_state/{subscriptionId}`).\nIf the default card is removed, the first remaining card becomes default.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently detaches the card in Stripe; may change the default card."
                  },
                  "status": "Done.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"success\": true\n}"
                },
                {
                  "name": "400 Card does not belong to the company or it is the last card.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-methods/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-methods",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "pm_1Q********",
                          "description": "Stripe payment method id (`pm_...`)."
                        }
                      ]
                    },
                    "description": "Detaches the card from the company's Stripe customer. The last remaining card cannot be removed — to stop\ncharges, disable auto-renewal of the subscription instead (`PUT /subscriptions/update_state/{subscriptionId}`).\nIf the default card is removed, the first remaining card becomes default.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently detaches the card in Stripe; may change the default card."
                  },
                  "status": "Card does not belong to the company or it is the last card.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"Payment method does not belong to this company\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-methods/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-methods",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "pm_1Q********",
                          "description": "Stripe payment method id (`pm_...`)."
                        }
                      ]
                    },
                    "description": "Detaches the card from the company's Stripe customer. The last remaining card cannot be removed — to stop\ncharges, disable auto-renewal of the subscription instead (`PUT /subscriptions/update_state/{subscriptionId}`).\nIf the default card is removed, the first remaining card becomes default.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently detaches the card in Stripe; may change the default card."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-methods/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-methods",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "pm_1Q********",
                          "description": "Stripe payment method id (`pm_...`)."
                        }
                      ]
                    },
                    "description": "Detaches the card from the company's Stripe customer. The last remaining card cannot be removed — to stop\ncharges, disable auto-renewal of the subscription instead (`PUT /subscriptions/update_state/{subscriptionId}`).\nIf the default card is removed, the first remaining card becomes default.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently detaches the card in Stripe; may change the default card."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 The company has no Stripe customer.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/payment-system/stripe/payment-methods/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "payment-system",
                        "stripe",
                        "payment-methods",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "pm_1Q********",
                          "description": "Stripe payment method id (`pm_...`)."
                        }
                      ]
                    },
                    "description": "Detaches the card from the company's Stripe customer. The last remaining card cannot be removed — to stop\ncharges, disable auto-renewal of the subscription instead (`PUT /subscriptions/update_state/{subscriptionId}`).\nIf the default card is removed, the first remaining card becomes default.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently detaches the card in Stripe; may change the default card."
                  },
                  "status": "The company has no Stripe customer.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Stripe customer not found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Currencies",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/currencies",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "currencies"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Reference list of currencies used by the platform (USD, EUR, UAH). The company currency is fixed at registration; order and price amounts are in that currency.\n\n**Required role:** Company owner (approved), Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Currencies.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/currencies",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "currencies"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Reference list of currencies used by the platform (USD, EUR, UAH). The company currency is fixed at registration; order and price amounts are in that currency.\n\n**Required role:** Company owner (approved), Finance\n\n**Side effects:** None"
                  },
                  "status": "Currencies.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 1,\n      \"attributes\": {\n        \"name_short\": \"USD\",\n        \"name_long\": \"US Dollar\",\n        \"symbol\": \"$\",\n        \"prefix\": \"\",\n        \"suffix\": \"\",\n        \"createdAt\": \"2024-04-23T20:18:29.106Z\",\n        \"updatedAt\": \"2024-04-23T20:18:29.106Z\"\n      }\n    },\n    {\n      \"id\": 3,\n      \"attributes\": {\n        \"name_short\": \"UAH\",\n        \"name_long\": \"Гривня\",\n        \"symbol\": \"₴\",\n        \"prefix\": \"\",\n        \"suffix\": \"\",\n        \"createdAt\": \"2024-04-23T20:18:29.169Z\",\n        \"updatedAt\": \"2024-05-30T11:45:17.449Z\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 3\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/currencies",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "currencies"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Reference list of currencies used by the platform (USD, EUR, UAH). The company currency is fixed at registration; order and price amounts are in that currency.\n\n**Required role:** Company owner (approved), Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/currencies",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "currencies"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Reference list of currencies used by the platform (USD, EUR, UAH). The company currency is fixed at registration; order and price amounts are in that currency.\n\n**Required role:** Company owner (approved), Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Currency by id",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/currencies/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "currencies",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "1",
                      "description": "Currency id."
                    }
                  ]
                },
                "description": "Returns one currency.\n\n**Required role:** Company owner (approved), Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Currency.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/currencies/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "currencies",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1",
                          "description": "Currency id."
                        }
                      ]
                    },
                    "description": "Returns one currency.\n\n**Required role:** Company owner (approved), Finance\n\n**Side effects:** None"
                  },
                  "status": "Currency.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 1,\n    \"attributes\": {\n      \"name_short\": \"USD\",\n      \"name_long\": \"US Dollar\",\n      \"symbol\": \"$\",\n      \"prefix\": \"\",\n      \"suffix\": \"\",\n      \"createdAt\": \"2024-04-23T20:18:29.106Z\",\n      \"updatedAt\": \"2024-04-23T20:18:29.106Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/currencies/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "currencies",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1",
                          "description": "Currency id."
                        }
                      ]
                    },
                    "description": "Returns one currency.\n\n**Required role:** Company owner (approved), Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/currencies/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "currencies",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1",
                          "description": "Currency id."
                        }
                      ]
                    },
                    "description": "Returns one currency.\n\n**Required role:** Company owner (approved), Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/currencies/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "currencies",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1",
                          "description": "Currency id."
                        }
                      ]
                    },
                    "description": "Returns one currency.\n\n**Required role:** Company owner (approved), Finance\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Tariffs",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/tariffs",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "tariffs"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Catalogue of tariffs (plans). Use `populate[tariff_restrictions]=true` to get the limits (max numbers,\nemployees, domains, widgets) and `populate[prices][populate][price_by_field]=true` to get prices per currency\n(`price` — monthly fee, `domain_cost`, `recall_widget_cost`, `callback_widget_cost`, `per_trunk_price`,\n`sms_incoming_price`, `sms_outgoing_price`). Avoid `populate=*`: it also loads unrelated relations.\nThe company's current tariff is in `GET /companies/my`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Tariffs.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/tariffs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "tariffs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Catalogue of tariffs (plans). Use `populate[tariff_restrictions]=true` to get the limits (max numbers,\nemployees, domains, widgets) and `populate[prices][populate][price_by_field]=true` to get prices per currency\n(`price` — monthly fee, `domain_cost`, `recall_widget_cost`, `callback_widget_cost`, `per_trunk_price`,\n`sms_incoming_price`, `sms_outgoing_price`). Avoid `populate=*`: it also loads unrelated relations.\nThe company's current tariff is in `GET /companies/my`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Tariffs.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 1,\n      \"attributes\": {\n        \"Name\": \"Basic\",\n        \"custom\": false,\n        \"isAi\": false,\n        \"createdAt\": \"2024-02-16T14:04:57.675Z\",\n        \"updatedAt\": \"2026-05-06T09:24:06.362Z\",\n        \"tariff_restrictions\": {\n          \"data\": [\n            {\n              \"id\": 1,\n              \"attributes\": {\n                \"maxPhones\": 4,\n                \"maxEmployees\": 10,\n                \"maxDomains\": 3,\n                \"maxIVRSubVoutines\": 1,\n                \"max_callback_widgets\": 1,\n                \"maxRecallWidgets\": 1\n              }\n            }\n          ]\n        },\n        \"prices\": {\n          \"data\": [\n            {\n              \"id\": 3,\n              \"attributes\": {\n                \"price_by_field\": [\n                  {\n                    \"id\": 11,\n                    \"name\": \"price\",\n                    \"price\": 0,\n                    \"isPriceStatic\": false\n                  },\n                  {\n                    \"id\": 12,\n                    \"name\": \"domain_cost\",\n                    \"price\": 1,\n                    \"isPriceStatic\": false\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 5\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/tariffs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "tariffs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Catalogue of tariffs (plans). Use `populate[tariff_restrictions]=true` to get the limits (max numbers,\nemployees, domains, widgets) and `populate[prices][populate][price_by_field]=true` to get prices per currency\n(`price` — monthly fee, `domain_cost`, `recall_widget_cost`, `callback_widget_cost`, `per_trunk_price`,\n`sms_incoming_price`, `sms_outgoing_price`). Avoid `populate=*`: it also loads unrelated relations.\nThe company's current tariff is in `GET /companies/my`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/tariffs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "tariffs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Catalogue of tariffs (plans). Use `populate[tariff_restrictions]=true` to get the limits (max numbers,\nemployees, domains, widgets) and `populate[prices][populate][price_by_field]=true` to get prices per currency\n(`price` — monthly fee, `domain_cost`, `recall_widget_cost`, `callback_widget_cost`, `per_trunk_price`,\n`sms_incoming_price`, `sms_outgoing_price`). Avoid `populate=*`: it also loads unrelated relations.\nThe company's current tariff is in `GET /companies/my`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Tariff by id",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/tariffs/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "tariffs",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "1",
                      "description": "Tariff id."
                    }
                  ]
                },
                "description": "Returns one tariff. Same `populate` options as in the list.\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Tariff.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/tariffs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "tariffs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1",
                          "description": "Tariff id."
                        }
                      ]
                    },
                    "description": "Returns one tariff. Same `populate` options as in the list.\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Tariff.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 1,\n    \"attributes\": {\n      \"Name\": \"Basic\",\n      \"custom\": false,\n      \"isAi\": false,\n      \"createdAt\": \"2024-02-16T14:04:57.675Z\",\n      \"updatedAt\": \"2026-05-06T09:24:06.362Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/tariffs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "tariffs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1",
                          "description": "Tariff id."
                        }
                      ]
                    },
                    "description": "Returns one tariff. Same `populate` options as in the list.\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/tariffs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "tariffs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1",
                          "description": "Tariff id."
                        }
                      ]
                    },
                    "description": "Returns one tariff. Same `populate` options as in the list.\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/tariffs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "tariffs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1",
                          "description": "Tariff id."
                        }
                      ]
                    },
                    "description": "Returns one tariff. Same `populate` options as in the list.\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Tariff limits",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/tariff-restrictions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "tariff-restrictions"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Limits attached to tariffs: maximum numbers, employees, domains, IVR sub-menus and widgets. Orders and employee creation are validated against the limits of the company tariff.\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Limits.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/tariff-restrictions",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "tariff-restrictions"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Limits attached to tariffs: maximum numbers, employees, domains, IVR sub-menus and widgets. Orders and employee creation are validated against the limits of the company tariff.\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Limits.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 1,\n      \"attributes\": {\n        \"maxPhones\": 4,\n        \"maxEmployees\": 10,\n        \"maxDomains\": 3,\n        \"maxIVRSubVoutines\": 1,\n        \"max_callback_widgets\": 1,\n        \"maxRecallWidgets\": 1,\n        \"createdAt\": \"2023-01-30T13:41:14.528Z\",\n        \"updatedAt\": \"2024-08-15T10:27:28.972Z\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 5\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/tariff-restrictions",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "tariff-restrictions"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Limits attached to tariffs: maximum numbers, employees, domains, IVR sub-menus and widgets. Orders and employee creation are validated against the limits of the company tariff.\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/tariff-restrictions",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "tariff-restrictions"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Limits attached to tariffs: maximum numbers, employees, domains, IVR sub-menus and widgets. Orders and employee creation are validated against the limits of the company tariff.\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Tariff limits by id",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/tariff-restrictions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "tariff-restrictions",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "1",
                      "description": "Limit set id."
                    }
                  ]
                },
                "description": "Returns one set of limits.\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Limits.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/tariff-restrictions/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "tariff-restrictions",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1",
                          "description": "Limit set id."
                        }
                      ]
                    },
                    "description": "Returns one set of limits.\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Limits.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 1,\n    \"attributes\": {\n      \"maxPhones\": 4,\n      \"maxEmployees\": 10,\n      \"maxDomains\": 3,\n      \"maxIVRSubVoutines\": 1,\n      \"max_callback_widgets\": 1,\n      \"maxRecallWidgets\": 1,\n      \"createdAt\": \"2023-01-30T13:41:14.528Z\",\n      \"updatedAt\": \"2024-08-15T10:27:28.972Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/tariff-restrictions/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "tariff-restrictions",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1",
                          "description": "Limit set id."
                        }
                      ]
                    },
                    "description": "Returns one set of limits.\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/tariff-restrictions/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "tariff-restrictions",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1",
                          "description": "Limit set id."
                        }
                      ]
                    },
                    "description": "Returns one set of limits.\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/tariff-restrictions/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "tariff-restrictions",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1",
                          "description": "Limit set id."
                        }
                      ]
                    },
                    "description": "Returns one set of limits.\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Expenses feed",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/orders/expenses",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "orders",
                    "expenses"
                  ],
                  "query": [
                    {
                      "key": "pagination[page]",
                      "value": "1",
                      "description": "Page number, from 1.",
                      "disabled": true
                    },
                    {
                      "key": "pagination[pageSize]",
                      "value": "10",
                      "description": "Rows per page (default 10).",
                      "disabled": true
                    },
                    {
                      "key": "filters[createdAt][$between]",
                      "value": "2026-09-01,2026-09-30",
                      "description": "Period as two dates: `filters[createdAt][$between][0]=2026-09-01&filters[createdAt][$between][1]=2026-09-30`. Without it the whole history is returned.",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Unified list of the company's expenses: purchase orders (`source: order`, any status) plus charges from the\nbalance that have no order (`source: payment` — subscription auto-renewals, SMS, other charges).\nRows are sorted by date descending and paginated in memory. `meta.totals.amount` is the sum of **approved**\nrows over the whole period in the company currency. Period filter: `filters[createdAt][$between][0]=2026-09-01&filters[createdAt][$between][1]=2026-09-30`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Expense rows.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders/expenses",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders",
                        "expenses"
                      ],
                      "query": [
                        {
                          "key": "pagination[page]",
                          "value": "1",
                          "description": "Page number, from 1.",
                          "disabled": true
                        },
                        {
                          "key": "pagination[pageSize]",
                          "value": "10",
                          "description": "Rows per page (default 10).",
                          "disabled": true
                        },
                        {
                          "key": "filters[createdAt][$between]",
                          "value": "2026-09-01,2026-09-30",
                          "description": "Period as two dates: `filters[createdAt][$between][0]=2026-09-01&filters[createdAt][$between][1]=2026-09-30`. Without it the whole history is returned.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Unified list of the company's expenses: purchase orders (`source: order`, any status) plus charges from the\nbalance that have no order (`source: payment` — subscription auto-renewals, SMS, other charges).\nRows are sorted by date descending and paginated in memory. `meta.totals.amount` is the sum of **approved**\nrows over the whole period in the company currency. Period filter: `filters[createdAt][$between][0]=2026-09-01&filters[createdAt][$between][1]=2026-09-30`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Expense rows.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": \"o-42\",\n      \"attributes\": {\n        \"id\": \"o-42\",\n        \"refId\": 42,\n        \"source\": \"order\",\n        \"kind\": \"order\",\n        \"description\": \"Покупка номера\",\n        \"descriptionKey\": \"phone\",\n        \"descriptionParams\": null,\n        \"amount\": 6.49,\n        \"status\": \"approved\",\n        \"paymentMethod\": \"stripe\",\n        \"date\": \"2026-09-10T08:33:05.765Z\",\n        \"currency\": \"USD\"\n      }\n    },\n    {\n      \"id\": \"p-101\",\n      \"attributes\": {\n        \"id\": \"p-101\",\n        \"refId\": 101,\n        \"source\": \"payment\",\n        \"kind\": \"subscription\",\n        \"description\": \"Продление номера\",\n        \"descriptionKey\": \"renewPhone\",\n        \"descriptionParams\": null,\n        \"amount\": 5.99,\n        \"status\": \"approved\",\n        \"paymentMethod\": \"mc-billing\",\n        \"date\": \"2026-09-01T03:00:07.661Z\",\n        \"currency\": \"USD\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 10,\n      \"pageCount\": 3,\n      \"total\": 24\n    },\n    \"totals\": {\n      \"amount\": 118.4,\n      \"currency\": \"USD\"\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders/expenses",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders",
                        "expenses"
                      ],
                      "query": [
                        {
                          "key": "pagination[page]",
                          "value": "1",
                          "description": "Page number, from 1.",
                          "disabled": true
                        },
                        {
                          "key": "pagination[pageSize]",
                          "value": "10",
                          "description": "Rows per page (default 10).",
                          "disabled": true
                        },
                        {
                          "key": "filters[createdAt][$between]",
                          "value": "2026-09-01,2026-09-30",
                          "description": "Period as two dates: `filters[createdAt][$between][0]=2026-09-01&filters[createdAt][$between][1]=2026-09-30`. Without it the whole history is returned.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Unified list of the company's expenses: purchase orders (`source: order`, any status) plus charges from the\nbalance that have no order (`source: payment` — subscription auto-renewals, SMS, other charges).\nRows are sorted by date descending and paginated in memory. `meta.totals.amount` is the sum of **approved**\nrows over the whole period in the company currency. Period filter: `filters[createdAt][$between][0]=2026-09-01&filters[createdAt][$between][1]=2026-09-30`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders/expenses",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders",
                        "expenses"
                      ],
                      "query": [
                        {
                          "key": "pagination[page]",
                          "value": "1",
                          "description": "Page number, from 1.",
                          "disabled": true
                        },
                        {
                          "key": "pagination[pageSize]",
                          "value": "10",
                          "description": "Rows per page (default 10).",
                          "disabled": true
                        },
                        {
                          "key": "filters[createdAt][$between]",
                          "value": "2026-09-01,2026-09-30",
                          "description": "Period as two dates: `filters[createdAt][$between][0]=2026-09-01&filters[createdAt][$between][1]=2026-09-30`. Without it the whole history is returned.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Unified list of the company's expenses: purchase orders (`source: order`, any status) plus charges from the\nbalance that have no order (`source: payment` — subscription auto-renewals, SMS, other charges).\nRows are sorted by date descending and paginated in memory. `meta.totals.amount` is the sum of **approved**\nrows over the whole period in the company currency. Period filter: `filters[createdAt][$between][0]=2026-09-01&filters[createdAt][$between][1]=2026-09-30`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Top-ups feed",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/orders/income",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "orders",
                    "income"
                  ],
                  "query": [
                    {
                      "key": "pagination[page]",
                      "value": "1",
                      "description": "Page number, from 1.",
                      "disabled": true
                    },
                    {
                      "key": "pagination[pageSize]",
                      "value": "10",
                      "description": "Rows per page (default 10).",
                      "disabled": true
                    },
                    {
                      "key": "filters[createdAt][$between]",
                      "value": "2026-09-01,2026-09-30",
                      "description": "Period as two dates: `filters[createdAt][$between][0]=2026-09-01&filters[createdAt][$between][1]=2026-09-30`. Without it the whole history is returned.",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Unified list of balance top-ups: top-up orders (`kind: topup`, any status) plus credits without an order\n(refunds, manual adjustments by support). Purchases paid by card are **not** income — they do not increase\nthe balance and are shown in `GET /orders/expenses`. Same query parameters and response format as the\nexpenses feed; `meta.totals.amount` sums approved rows.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Top-up rows.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders/income",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders",
                        "income"
                      ],
                      "query": [
                        {
                          "key": "pagination[page]",
                          "value": "1",
                          "description": "Page number, from 1.",
                          "disabled": true
                        },
                        {
                          "key": "pagination[pageSize]",
                          "value": "10",
                          "description": "Rows per page (default 10).",
                          "disabled": true
                        },
                        {
                          "key": "filters[createdAt][$between]",
                          "value": "2026-09-01,2026-09-30",
                          "description": "Period as two dates: `filters[createdAt][$between][0]=2026-09-01&filters[createdAt][$between][1]=2026-09-30`. Without it the whole history is returned.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Unified list of balance top-ups: top-up orders (`kind: topup`, any status) plus credits without an order\n(refunds, manual adjustments by support). Purchases paid by card are **not** income — they do not increase\nthe balance and are shown in `GET /orders/expenses`. Same query parameters and response format as the\nexpenses feed; `meta.totals.amount` sums approved rows.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Top-up rows.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": \"o-40\",\n      \"attributes\": {\n        \"id\": \"o-40\",\n        \"refId\": 40,\n        \"source\": \"order\",\n        \"kind\": \"topup\",\n        \"description\": \"Пополнение баланса\",\n        \"descriptionKey\": \"topup\",\n        \"descriptionParams\": null,\n        \"amount\": 30,\n        \"status\": \"approved\",\n        \"paymentMethod\": \"wayforpay\",\n        \"date\": \"2026-01-15T08:33:05.765Z\",\n        \"currency\": \"USD\"\n      }\n    },\n    {\n      \"id\": \"p-77\",\n      \"attributes\": {\n        \"id\": \"p-77\",\n        \"refId\": 77,\n        \"source\": \"payment\",\n        \"kind\": \"manual\",\n        \"description\": \"Зачисление на баланс\",\n        \"descriptionKey\": \"balanceCredit\",\n        \"descriptionParams\": null,\n        \"amount\": 10,\n        \"status\": \"approved\",\n        \"paymentMethod\": \"mc-billing\",\n        \"date\": \"2026-01-10T12:00:00.000Z\",\n        \"currency\": \"USD\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 10,\n      \"pageCount\": 2,\n      \"total\": 19\n    },\n    \"totals\": {\n      \"amount\": 640,\n      \"currency\": \"USD\"\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders/income",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders",
                        "income"
                      ],
                      "query": [
                        {
                          "key": "pagination[page]",
                          "value": "1",
                          "description": "Page number, from 1.",
                          "disabled": true
                        },
                        {
                          "key": "pagination[pageSize]",
                          "value": "10",
                          "description": "Rows per page (default 10).",
                          "disabled": true
                        },
                        {
                          "key": "filters[createdAt][$between]",
                          "value": "2026-09-01,2026-09-30",
                          "description": "Period as two dates: `filters[createdAt][$between][0]=2026-09-01&filters[createdAt][$between][1]=2026-09-30`. Without it the whole history is returned.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Unified list of balance top-ups: top-up orders (`kind: topup`, any status) plus credits without an order\n(refunds, manual adjustments by support). Purchases paid by card are **not** income — they do not increase\nthe balance and are shown in `GET /orders/expenses`. Same query parameters and response format as the\nexpenses feed; `meta.totals.amount` sums approved rows.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders/income",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders",
                        "income"
                      ],
                      "query": [
                        {
                          "key": "pagination[page]",
                          "value": "1",
                          "description": "Page number, from 1.",
                          "disabled": true
                        },
                        {
                          "key": "pagination[pageSize]",
                          "value": "10",
                          "description": "Rows per page (default 10).",
                          "disabled": true
                        },
                        {
                          "key": "filters[createdAt][$between]",
                          "value": "2026-09-01,2026-09-30",
                          "description": "Period as two dates: `filters[createdAt][$between][0]=2026-09-01&filters[createdAt][$between][1]=2026-09-30`. Without it the whole history is returned.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Unified list of balance top-ups: top-up orders (`kind: topup`, any status) plus credits without an order\n(refunds, manual adjustments by support). Purchases paid by card are **not** income — they do not increase\nthe balance and are shown in `GET /orders/expenses`. Same query parameters and response format as the\nexpenses feed; `meta.totals.amount` sums approved rows.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Spent since a date",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/statistics/spentByData?from=1756684800",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "statistics",
                    "spentByData"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "1756684800",
                      "description": "Period start as Unix timestamp in seconds.",
                      "disabled": false
                    }
                  ],
                  "variable": []
                },
                "description": "Total of the company's charges from `from` (Unix seconds, start of that day) to the end of the current day:\nservice charges from the balance plus call costs (the same aggregation as the act preview). The call part is\nfetched from the billing core week by week, so long periods respond slowly. The sign follows how charges are\nrecorded in the act (service charges may be negative); treat the absolute value as the amount spent.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Total.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/spentByData?from=1756684800",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "spentByData"
                      ],
                      "query": [
                        {
                          "key": "from",
                          "value": "1756684800",
                          "description": "Period start as Unix timestamp in seconds.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Total of the company's charges from `from` (Unix seconds, start of that day) to the end of the current day:\nservice charges from the balance plus call costs (the same aggregation as the act preview). The call part is\nfetched from the billing core week by week, so long periods respond slowly. The sign follows how charges are\nrecorded in the act (service charges may be negative); treat the absolute value as the amount spent.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Total.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"attributes\": {\n      \"result\": 12.35\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 `from` is missing or not a number.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/spentByData?from=1756684800",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "spentByData"
                      ],
                      "query": [
                        {
                          "key": "from",
                          "value": "1756684800",
                          "description": "Period start as Unix timestamp in seconds.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Total of the company's charges from `from` (Unix seconds, start of that day) to the end of the current day:\nservice charges from the balance plus call costs (the same aggregation as the act preview). The call part is\nfetched from the billing core week by week, so long periods respond slowly. The sign follows how charges are\nrecorded in the act (service charges may be negative); treat the absolute value as the amount spent.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "`from` is missing or not a number.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"`from` is required\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/spentByData?from=1756684800",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "spentByData"
                      ],
                      "query": [
                        {
                          "key": "from",
                          "value": "1756684800",
                          "description": "Period start as Unix timestamp in seconds.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Total of the company's charges from `from` (Unix seconds, start of that day) to the end of the current day:\nservice charges from the balance plus call costs (the same aggregation as the act preview). The call part is\nfetched from the billing core week by week, so long periods respond slowly. The sign follows how charges are\nrecorded in the act (service charges may be negative); treat the absolute value as the amount spent.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/spentByData?from=1756684800",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "spentByData"
                      ],
                      "query": [
                        {
                          "key": "from",
                          "value": "1756684800",
                          "description": "Period start as Unix timestamp in seconds.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Total of the company's charges from `from` (Unix seconds, start of that day) to the end of the current day:\nservice charges from the balance plus call costs (the same aggregation as the act preview). The call part is\nfetched from the billing core week by week, so long periods respond slowly. The sign follows how charges are\nrecorded in the act (service charges may be negative); treat the absolute value as the amount spent.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            }
          ]
        },
        {
          "name": "Orders",
          "description": "Orders: buying numbers, talk packets, top-ups and other services. Orders are the only way money is charged.",
          "item": [
            {
              "name": "Orders of the company",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "orders"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Strapi core list of the company's orders (the company filter is added automatically). `meta.totals.amount`\nis the sum of `amount` over the whole filtered set in the company currency.\nUseful filters: `filters[orderStatus][$eq]=approved`, `filters[orderType][$eq]=incoming` (top-ups) /\n`outgoing` (purchases), `filters[createdAt][$gte]=2026-01-01`, `sort=createdAt:desc`.\nUseful populate: `populate[payment_system][fields][0]=name`, `populate[currency][fields][0]=name_short`,\n`populate[phones][fields][0]=fullnumber`, `populate[payments]=true`.\n`orderJSON` is the full snapshot of what was ordered and at what price (see `OrdersOrderJSON`).\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of orders with totals.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Strapi core list of the company's orders (the company filter is added automatically). `meta.totals.amount`\nis the sum of `amount` over the whole filtered set in the company currency.\nUseful filters: `filters[orderStatus][$eq]=approved`, `filters[orderType][$eq]=incoming` (top-ups) /\n`outgoing` (purchases), `filters[createdAt][$gte]=2026-01-01`, `sort=createdAt:desc`.\nUseful populate: `populate[payment_system][fields][0]=name`, `populate[currency][fields][0]=name_short`,\n`populate[phones][fields][0]=fullnumber`, `populate[payments]=true`.\n`orderJSON` is the full snapshot of what was ordered and at what price (see `OrdersOrderJSON`).\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Page of orders with totals.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 42,\n      \"attributes\": {\n        \"orderId\": \"1788231620358546\",\n        \"orderStatus\": \"approved\",\n        \"orderType\": \"outgoing\",\n        \"amount\": 6.49,\n        \"auto_renewal\": true,\n        \"redirect_link\": \"global\",\n        \"source\": \"default\",\n        \"template_name\": null,\n        \"additional_data\": null,\n        \"orderJSON\": {\n          \"total\": 6.49,\n          \"goodsTotal\": 5.99,\n          \"starterFee\": 0.5,\n          \"refill\": 0.5,\n          \"tariff\": null,\n          \"esim\": null,\n          \"promo\": null,\n          \"domain\": [],\n          \"recall_widget\": [],\n          \"callback_widget\": [],\n          \"sip-trunk\": [],\n          \"incomingOrderId\": null,\n          \"phones\": [\n            {\n              \"prefix_id\": 9,\n              \"prefix_number\": \"44\",\n              \"quantity\": 1,\n              \"setup_price\": 5.99,\n              \"attached_phones\": [\n                {\n                  \"id\": 25,\n                  \"service\": \"default\",\n                  \"fullnumber\": \"380441234567\"\n                }\n              ]\n            }\n          ],\n          \"payment\": {\n            \"url\": \"https://api.onevoiplanet.com/api/orders/process-payment/1788231620358546\"\n          }\n        },\n        \"createdAt\": \"2026-09-01T03:00:20.402Z\",\n        \"updatedAt\": \"2026-09-01T03:00:25.402Z\",\n        \"payment_system\": {\n          \"data\": {\n            \"id\": 3,\n            \"attributes\": {\n              \"name\": \"Stripe\"\n            }\n          }\n        },\n        \"currency\": {\n          \"data\": {\n            \"id\": 1,\n            \"attributes\": {\n              \"name_short\": \"USD\"\n            }\n          }\n        }\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 2,\n      \"total\": 34\n    },\n    \"totals\": {\n      \"amount\": 942.69,\n      \"currency\": \"USD\"\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Strapi core list of the company's orders (the company filter is added automatically). `meta.totals.amount`\nis the sum of `amount` over the whole filtered set in the company currency.\nUseful filters: `filters[orderStatus][$eq]=approved`, `filters[orderType][$eq]=incoming` (top-ups) /\n`outgoing` (purchases), `filters[createdAt][$gte]=2026-01-01`, `sort=createdAt:desc`.\nUseful populate: `populate[payment_system][fields][0]=name`, `populate[currency][fields][0]=name_short`,\n`populate[phones][fields][0]=fullnumber`, `populate[payments]=true`.\n`orderJSON` is the full snapshot of what was ordered and at what price (see `OrdersOrderJSON`).\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Strapi core list of the company's orders (the company filter is added automatically). `meta.totals.amount`\nis the sum of `amount` over the whole filtered set in the company currency.\nUseful filters: `filters[orderStatus][$eq]=approved`, `filters[orderType][$eq]=incoming` (top-ups) /\n`outgoing` (purchases), `filters[createdAt][$gte]=2026-01-01`, `sort=createdAt:desc`.\nUseful populate: `populate[payment_system][fields][0]=name`, `populate[currency][fields][0]=name_short`,\n`populate[phones][fields][0]=fullnumber`, `populate[payments]=true`.\n`orderJSON` is the full snapshot of what was ordered and at what price (see `OrdersOrderJSON`).\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Create an order and start payment",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/orders",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "orders"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Creates an order **and immediately starts the payment**. This is the only way to buy numbers, talk packets,\ntariffs, eSIM, extra domains/widgets/SIP trunks or to top up the balance.\n\n**Payment method** (`payment_system`):\n* `0` — pay from the company balance. The total is charged right away; the order becomes `approved`\n  (or `declined` with `orderJSON.payment.message = \"Not enough money on balance\"`) within a few seconds.\n* any other number (e.g. `1`) — pay by card. The gateway is chosen by the country of the client IP:\n  Ukraine → WayForPay, elsewhere → Stripe. The response contains `orderJSON.payment.url` (Stripe) or\n  `orderJSON.payment.invoiceUrl` (WayForPay): open it in a browser — it redirects to the gateway checkout page\n  and back to the cabinet. Mobile apps pass `paymentType: \"intent\"` and then call\n  `POST /payment-system/stripe/payment-sheet`. After the gateway confirms, the full total is credited to the\n  balance and the goods price (`total - refill`) is charged from it, so the balance grows only by `refill`.\n\n**What can be ordered** (any combination; all fields optional):\n* `phones` — new numbers: `{ prefix_id, quantity, talk_package_id? }`. Numbers from the own pool are\n  attached immediately; numbers of the DIDWW provider (`attached_phones[].service = \"didww\"`) are bought in\n  the background — money is charged at once, the number appears in `GET /phones` a bit later\n  (progress in `additional_data.didww_pending`). If the provider fails, the amount is refunded to the balance.\n* `phones` — talk packet / renewal for an owned number: `{ prefix_id, phone_id, talk_package_id, quantity: 1 }`.\n  Only the packet price is charged.\n* `tariff` — switch to a tariff (monthly fee is charged; the company must fit the tariff limits).\n* `esim` — eSIM bundle `{ id }` (or `{ id, name, refills: [...] }` for a top-up of an existing eSIM); eSIM is bought from the provider after payment.\n* `domains`, `recall_widgets`, `callback_widgets`, `attachServices` (SIP trunks) — paid extras above the tariff limits.\n* `addMoney` — balance top-up amount (minimum 5). A pure top-up is an `incoming` order; combined with goods the whole order is `outgoing`.\n* `promoCode` — promo code (currently applies to eSIM prices).\n* `auto_renewal` — enable monthly auto-renewal of the subscriptions created by this order (default `true`).\n\n**Starter fee**: when the order contains a number and the balance after purchase would be below the threshold\n(0.5 USD / 20 UAH), the threshold amount is added to `refill` so that the number can receive calls.\n\n**Lifecycle**: `new` → `approved` | `declined`. An unpaid card order expires (becomes `declined`) after 30 minutes\nand reserved numbers are released. On `approved` a subscription is created for every purchased number/tariff/extra\n(see Subscriptions) and the owner receives an email/push; on `declined` reserved items are released.\nUse `POST /orders/calculate-order-price` first to show the price without charging.\nBody is a Strapi envelope `{ \"data\": { ... } }`. Rate limit: 30 requests per 5 minutes on the payment redirect.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** Charges money: with `payment_system: 0` the order total (`orderJSON.total`) is charged from the company balance immediately; with a card gateway the total is charged to the card and the goods part is then debited from the balance (balance grows only by `refill`). Reserves numbers from the pool; buys numbers at DIDWW and eSIM at the provider after approval; creates subscriptions (monthly auto-charges) for every purchased item; sends email/push notifications to the owner; an unpaid order is auto-declined after 30 minutes.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"payment_system\": 0,\n    \"phones\": [\n      {\n        \"prefix_id\": 9,\n        \"quantity\": 1\n      }\n    ],\n    \"auto_renewal\": true\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created order (flat object, not a Strapi envelope). Status is `new`; poll `GET /orders/{id}` for `approved`/`declined`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates an order **and immediately starts the payment**. This is the only way to buy numbers, talk packets,\ntariffs, eSIM, extra domains/widgets/SIP trunks or to top up the balance.\n\n**Payment method** (`payment_system`):\n* `0` — pay from the company balance. The total is charged right away; the order becomes `approved`\n  (or `declined` with `orderJSON.payment.message = \"Not enough money on balance\"`) within a few seconds.\n* any other number (e.g. `1`) — pay by card. The gateway is chosen by the country of the client IP:\n  Ukraine → WayForPay, elsewhere → Stripe. The response contains `orderJSON.payment.url` (Stripe) or\n  `orderJSON.payment.invoiceUrl` (WayForPay): open it in a browser — it redirects to the gateway checkout page\n  and back to the cabinet. Mobile apps pass `paymentType: \"intent\"` and then call\n  `POST /payment-system/stripe/payment-sheet`. After the gateway confirms, the full total is credited to the\n  balance and the goods price (`total - refill`) is charged from it, so the balance grows only by `refill`.\n\n**What can be ordered** (any combination; all fields optional):\n* `phones` — new numbers: `{ prefix_id, quantity, talk_package_id? }`. Numbers from the own pool are\n  attached immediately; numbers of the DIDWW provider (`attached_phones[].service = \"didww\"`) are bought in\n  the background — money is charged at once, the number appears in `GET /phones` a bit later\n  (progress in `additional_data.didww_pending`). If the provider fails, the amount is refunded to the balance.\n* `phones` — talk packet / renewal for an owned number: `{ prefix_id, phone_id, talk_package_id, quantity: 1 }`.\n  Only the packet price is charged.\n* `tariff` — switch to a tariff (monthly fee is charged; the company must fit the tariff limits).\n* `esim` — eSIM bundle `{ id }` (or `{ id, name, refills: [...] }` for a top-up of an existing eSIM); eSIM is bought from the provider after payment.\n* `domains`, `recall_widgets`, `callback_widgets`, `attachServices` (SIP trunks) — paid extras above the tariff limits.\n* `addMoney` — balance top-up amount (minimum 5). A pure top-up is an `incoming` order; combined with goods the whole order is `outgoing`.\n* `promoCode` — promo code (currently applies to eSIM prices).\n* `auto_renewal` — enable monthly auto-renewal of the subscriptions created by this order (default `true`).\n\n**Starter fee**: when the order contains a number and the balance after purchase would be below the threshold\n(0.5 USD / 20 UAH), the threshold amount is added to `refill` so that the number can receive calls.\n\n**Lifecycle**: `new` → `approved` | `declined`. An unpaid card order expires (becomes `declined`) after 30 minutes\nand reserved numbers are released. On `approved` a subscription is created for every purchased number/tariff/extra\n(see Subscriptions) and the owner receives an email/push; on `declined` reserved items are released.\nUse `POST /orders/calculate-order-price` first to show the price without charging.\nBody is a Strapi envelope `{ \"data\": { ... } }`. Rate limit: 30 requests per 5 minutes on the payment redirect.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** Charges money: with `payment_system: 0` the order total (`orderJSON.total`) is charged from the company balance immediately; with a card gateway the total is charged to the card and the goods part is then debited from the balance (balance grows only by `refill`). Reserves numbers from the pool; buys numbers at DIDWW and eSIM at the provider after approval; creates subscriptions (monthly auto-charges) for every purchased item; sends email/push notifications to the owner; an unpaid order is auto-declined after 30 minutes.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"payment_system\": 0,\n    \"phones\": [\n      {\n        \"prefix_id\": 9,\n        \"quantity\": 1\n      }\n    ],\n    \"auto_renewal\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created order (flat object, not a Strapi envelope). Status is `new`; poll `GET /orders/{id}` for `approved`/`declined`.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 43,\n  \"orderId\": \"1790923456789123\",\n  \"orderStatus\": \"new\",\n  \"orderType\": \"outgoing\",\n  \"amount\": 6.49,\n  \"auto_renewal\": true,\n  \"redirect_link\": \"global\",\n  \"source\": \"default\",\n  \"template_name\": null,\n  \"additional_data\": null,\n  \"orderJSON\": {\n    \"total\": 6.49,\n    \"goodsTotal\": 5.99,\n    \"starterFee\": 0.5,\n    \"refill\": 0.5,\n    \"tariff\": null,\n    \"esim\": null,\n    \"promo\": null,\n    \"domain\": [],\n    \"recall_widget\": [],\n    \"callback_widget\": [],\n    \"sip-trunk\": [],\n    \"incomingOrderId\": null,\n    \"user_ip\": \"203.0.113.10\",\n    \"phones\": [\n      {\n        \"prefix_id\": 9,\n        \"prefix_number\": \"44\",\n        \"quantity\": 1,\n        \"setup_price\": 5.99,\n        \"attached_phones\": [\n          {\n            \"id\": 25,\n            \"service\": \"default\",\n            \"fullnumber\": \"380441234567\"\n          }\n        ]\n      }\n    ],\n    \"payment\": {\n      \"url\": \"https://api.onevoiplanet.com/api/orders/process-payment/1790923456789123\"\n    }\n  },\n  \"createdAt\": \"2026-10-02T10:00:00.000Z\",\n  \"updatedAt\": \"2026-10-02T10:00:00.000Z\"\n}"
                },
                {
                  "name": "400 Validation error.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates an order **and immediately starts the payment**. This is the only way to buy numbers, talk packets,\ntariffs, eSIM, extra domains/widgets/SIP trunks or to top up the balance.\n\n**Payment method** (`payment_system`):\n* `0` — pay from the company balance. The total is charged right away; the order becomes `approved`\n  (or `declined` with `orderJSON.payment.message = \"Not enough money on balance\"`) within a few seconds.\n* any other number (e.g. `1`) — pay by card. The gateway is chosen by the country of the client IP:\n  Ukraine → WayForPay, elsewhere → Stripe. The response contains `orderJSON.payment.url` (Stripe) or\n  `orderJSON.payment.invoiceUrl` (WayForPay): open it in a browser — it redirects to the gateway checkout page\n  and back to the cabinet. Mobile apps pass `paymentType: \"intent\"` and then call\n  `POST /payment-system/stripe/payment-sheet`. After the gateway confirms, the full total is credited to the\n  balance and the goods price (`total - refill`) is charged from it, so the balance grows only by `refill`.\n\n**What can be ordered** (any combination; all fields optional):\n* `phones` — new numbers: `{ prefix_id, quantity, talk_package_id? }`. Numbers from the own pool are\n  attached immediately; numbers of the DIDWW provider (`attached_phones[].service = \"didww\"`) are bought in\n  the background — money is charged at once, the number appears in `GET /phones` a bit later\n  (progress in `additional_data.didww_pending`). If the provider fails, the amount is refunded to the balance.\n* `phones` — talk packet / renewal for an owned number: `{ prefix_id, phone_id, talk_package_id, quantity: 1 }`.\n  Only the packet price is charged.\n* `tariff` — switch to a tariff (monthly fee is charged; the company must fit the tariff limits).\n* `esim` — eSIM bundle `{ id }` (or `{ id, name, refills: [...] }` for a top-up of an existing eSIM); eSIM is bought from the provider after payment.\n* `domains`, `recall_widgets`, `callback_widgets`, `attachServices` (SIP trunks) — paid extras above the tariff limits.\n* `addMoney` — balance top-up amount (minimum 5). A pure top-up is an `incoming` order; combined with goods the whole order is `outgoing`.\n* `promoCode` — promo code (currently applies to eSIM prices).\n* `auto_renewal` — enable monthly auto-renewal of the subscriptions created by this order (default `true`).\n\n**Starter fee**: when the order contains a number and the balance after purchase would be below the threshold\n(0.5 USD / 20 UAH), the threshold amount is added to `refill` so that the number can receive calls.\n\n**Lifecycle**: `new` → `approved` | `declined`. An unpaid card order expires (becomes `declined`) after 30 minutes\nand reserved numbers are released. On `approved` a subscription is created for every purchased number/tariff/extra\n(see Subscriptions) and the owner receives an email/push; on `declined` reserved items are released.\nUse `POST /orders/calculate-order-price` first to show the price without charging.\nBody is a Strapi envelope `{ \"data\": { ... } }`. Rate limit: 30 requests per 5 minutes on the payment redirect.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** Charges money: with `payment_system: 0` the order total (`orderJSON.total`) is charged from the company balance immediately; with a card gateway the total is charged to the card and the goods part is then debited from the balance (balance grows only by `refill`). Reserves numbers from the pool; buys numbers at DIDWW and eSIM at the provider after approval; creates subscriptions (monthly auto-charges) for every purchased item; sends email/push notifications to the owner; an unpaid order is auto-declined after 30 minutes.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"payment_system\": 0,\n    \"phones\": [\n      {\n        \"prefix_id\": 9,\n        \"quantity\": 1\n      }\n    ],\n    \"auto_renewal\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"paysystem || payment_system field required\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates an order **and immediately starts the payment**. This is the only way to buy numbers, talk packets,\ntariffs, eSIM, extra domains/widgets/SIP trunks or to top up the balance.\n\n**Payment method** (`payment_system`):\n* `0` — pay from the company balance. The total is charged right away; the order becomes `approved`\n  (or `declined` with `orderJSON.payment.message = \"Not enough money on balance\"`) within a few seconds.\n* any other number (e.g. `1`) — pay by card. The gateway is chosen by the country of the client IP:\n  Ukraine → WayForPay, elsewhere → Stripe. The response contains `orderJSON.payment.url` (Stripe) or\n  `orderJSON.payment.invoiceUrl` (WayForPay): open it in a browser — it redirects to the gateway checkout page\n  and back to the cabinet. Mobile apps pass `paymentType: \"intent\"` and then call\n  `POST /payment-system/stripe/payment-sheet`. After the gateway confirms, the full total is credited to the\n  balance and the goods price (`total - refill`) is charged from it, so the balance grows only by `refill`.\n\n**What can be ordered** (any combination; all fields optional):\n* `phones` — new numbers: `{ prefix_id, quantity, talk_package_id? }`. Numbers from the own pool are\n  attached immediately; numbers of the DIDWW provider (`attached_phones[].service = \"didww\"`) are bought in\n  the background — money is charged at once, the number appears in `GET /phones` a bit later\n  (progress in `additional_data.didww_pending`). If the provider fails, the amount is refunded to the balance.\n* `phones` — talk packet / renewal for an owned number: `{ prefix_id, phone_id, talk_package_id, quantity: 1 }`.\n  Only the packet price is charged.\n* `tariff` — switch to a tariff (monthly fee is charged; the company must fit the tariff limits).\n* `esim` — eSIM bundle `{ id }` (or `{ id, name, refills: [...] }` for a top-up of an existing eSIM); eSIM is bought from the provider after payment.\n* `domains`, `recall_widgets`, `callback_widgets`, `attachServices` (SIP trunks) — paid extras above the tariff limits.\n* `addMoney` — balance top-up amount (minimum 5). A pure top-up is an `incoming` order; combined with goods the whole order is `outgoing`.\n* `promoCode` — promo code (currently applies to eSIM prices).\n* `auto_renewal` — enable monthly auto-renewal of the subscriptions created by this order (default `true`).\n\n**Starter fee**: when the order contains a number and the balance after purchase would be below the threshold\n(0.5 USD / 20 UAH), the threshold amount is added to `refill` so that the number can receive calls.\n\n**Lifecycle**: `new` → `approved` | `declined`. An unpaid card order expires (becomes `declined`) after 30 minutes\nand reserved numbers are released. On `approved` a subscription is created for every purchased number/tariff/extra\n(see Subscriptions) and the owner receives an email/push; on `declined` reserved items are released.\nUse `POST /orders/calculate-order-price` first to show the price without charging.\nBody is a Strapi envelope `{ \"data\": { ... } }`. Rate limit: 30 requests per 5 minutes on the payment redirect.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** Charges money: with `payment_system: 0` the order total (`orderJSON.total`) is charged from the company balance immediately; with a card gateway the total is charged to the card and the goods part is then debited from the balance (balance grows only by `refill`). Reserves numbers from the pool; buys numbers at DIDWW and eSIM at the provider after approval; creates subscriptions (monthly auto-charges) for every purchased item; sends email/push notifications to the owner; an unpaid order is auto-declined after 30 minutes.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"payment_system\": 0,\n    \"phones\": [\n      {\n        \"prefix_id\": 9,\n        \"quantity\": 1\n      }\n    ],\n    \"auto_renewal\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates an order **and immediately starts the payment**. This is the only way to buy numbers, talk packets,\ntariffs, eSIM, extra domains/widgets/SIP trunks or to top up the balance.\n\n**Payment method** (`payment_system`):\n* `0` — pay from the company balance. The total is charged right away; the order becomes `approved`\n  (or `declined` with `orderJSON.payment.message = \"Not enough money on balance\"`) within a few seconds.\n* any other number (e.g. `1`) — pay by card. The gateway is chosen by the country of the client IP:\n  Ukraine → WayForPay, elsewhere → Stripe. The response contains `orderJSON.payment.url` (Stripe) or\n  `orderJSON.payment.invoiceUrl` (WayForPay): open it in a browser — it redirects to the gateway checkout page\n  and back to the cabinet. Mobile apps pass `paymentType: \"intent\"` and then call\n  `POST /payment-system/stripe/payment-sheet`. After the gateway confirms, the full total is credited to the\n  balance and the goods price (`total - refill`) is charged from it, so the balance grows only by `refill`.\n\n**What can be ordered** (any combination; all fields optional):\n* `phones` — new numbers: `{ prefix_id, quantity, talk_package_id? }`. Numbers from the own pool are\n  attached immediately; numbers of the DIDWW provider (`attached_phones[].service = \"didww\"`) are bought in\n  the background — money is charged at once, the number appears in `GET /phones` a bit later\n  (progress in `additional_data.didww_pending`). If the provider fails, the amount is refunded to the balance.\n* `phones` — talk packet / renewal for an owned number: `{ prefix_id, phone_id, talk_package_id, quantity: 1 }`.\n  Only the packet price is charged.\n* `tariff` — switch to a tariff (monthly fee is charged; the company must fit the tariff limits).\n* `esim` — eSIM bundle `{ id }` (or `{ id, name, refills: [...] }` for a top-up of an existing eSIM); eSIM is bought from the provider after payment.\n* `domains`, `recall_widgets`, `callback_widgets`, `attachServices` (SIP trunks) — paid extras above the tariff limits.\n* `addMoney` — balance top-up amount (minimum 5). A pure top-up is an `incoming` order; combined with goods the whole order is `outgoing`.\n* `promoCode` — promo code (currently applies to eSIM prices).\n* `auto_renewal` — enable monthly auto-renewal of the subscriptions created by this order (default `true`).\n\n**Starter fee**: when the order contains a number and the balance after purchase would be below the threshold\n(0.5 USD / 20 UAH), the threshold amount is added to `refill` so that the number can receive calls.\n\n**Lifecycle**: `new` → `approved` | `declined`. An unpaid card order expires (becomes `declined`) after 30 minutes\nand reserved numbers are released. On `approved` a subscription is created for every purchased number/tariff/extra\n(see Subscriptions) and the owner receives an email/push; on `declined` reserved items are released.\nUse `POST /orders/calculate-order-price` first to show the price without charging.\nBody is a Strapi envelope `{ \"data\": { ... } }`. Rate limit: 30 requests per 5 minutes on the payment redirect.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** Charges money: with `payment_system: 0` the order total (`orderJSON.total`) is charged from the company balance immediately; with a card gateway the total is charged to the card and the goods part is then debited from the balance (balance grows only by `refill`). Reserves numbers from the pool; buys numbers at DIDWW and eSIM at the provider after approval; creates subscriptions (monthly auto-charges) for every purchased item; sends email/push notifications to the owner; an unpaid order is auto-declined after 30 minutes.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"payment_system\": 0,\n    \"phones\": [\n      {\n        \"prefix_id\": 9,\n        \"quantity\": 1\n      }\n    ],\n    \"auto_renewal\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates an order **and immediately starts the payment**. This is the only way to buy numbers, talk packets,\ntariffs, eSIM, extra domains/widgets/SIP trunks or to top up the balance.\n\n**Payment method** (`payment_system`):\n* `0` — pay from the company balance. The total is charged right away; the order becomes `approved`\n  (or `declined` with `orderJSON.payment.message = \"Not enough money on balance\"`) within a few seconds.\n* any other number (e.g. `1`) — pay by card. The gateway is chosen by the country of the client IP:\n  Ukraine → WayForPay, elsewhere → Stripe. The response contains `orderJSON.payment.url` (Stripe) or\n  `orderJSON.payment.invoiceUrl` (WayForPay): open it in a browser — it redirects to the gateway checkout page\n  and back to the cabinet. Mobile apps pass `paymentType: \"intent\"` and then call\n  `POST /payment-system/stripe/payment-sheet`. After the gateway confirms, the full total is credited to the\n  balance and the goods price (`total - refill`) is charged from it, so the balance grows only by `refill`.\n\n**What can be ordered** (any combination; all fields optional):\n* `phones` — new numbers: `{ prefix_id, quantity, talk_package_id? }`. Numbers from the own pool are\n  attached immediately; numbers of the DIDWW provider (`attached_phones[].service = \"didww\"`) are bought in\n  the background — money is charged at once, the number appears in `GET /phones` a bit later\n  (progress in `additional_data.didww_pending`). If the provider fails, the amount is refunded to the balance.\n* `phones` — talk packet / renewal for an owned number: `{ prefix_id, phone_id, talk_package_id, quantity: 1 }`.\n  Only the packet price is charged.\n* `tariff` — switch to a tariff (monthly fee is charged; the company must fit the tariff limits).\n* `esim` — eSIM bundle `{ id }` (or `{ id, name, refills: [...] }` for a top-up of an existing eSIM); eSIM is bought from the provider after payment.\n* `domains`, `recall_widgets`, `callback_widgets`, `attachServices` (SIP trunks) — paid extras above the tariff limits.\n* `addMoney` — balance top-up amount (minimum 5). A pure top-up is an `incoming` order; combined with goods the whole order is `outgoing`.\n* `promoCode` — promo code (currently applies to eSIM prices).\n* `auto_renewal` — enable monthly auto-renewal of the subscriptions created by this order (default `true`).\n\n**Starter fee**: when the order contains a number and the balance after purchase would be below the threshold\n(0.5 USD / 20 UAH), the threshold amount is added to `refill` so that the number can receive calls.\n\n**Lifecycle**: `new` → `approved` | `declined`. An unpaid card order expires (becomes `declined`) after 30 minutes\nand reserved numbers are released. On `approved` a subscription is created for every purchased number/tariff/extra\n(see Subscriptions) and the owner receives an email/push; on `declined` reserved items are released.\nUse `POST /orders/calculate-order-price` first to show the price without charging.\nBody is a Strapi envelope `{ \"data\": { ... } }`. Rate limit: 30 requests per 5 minutes on the payment redirect.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** Charges money: with `payment_system: 0` the order total (`orderJSON.total`) is charged from the company balance immediately; with a card gateway the total is charged to the card and the goods part is then debited from the balance (balance grows only by `refill`). Reserves numbers from the pool; buys numbers at DIDWW and eSIM at the provider after approval; creates subscriptions (monthly auto-charges) for every purchased item; sends email/push notifications to the owner; an unpaid order is auto-declined after 30 minutes.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"payment_system\": 0,\n    \"phones\": [\n      {\n        \"prefix_id\": 9,\n        \"quantity\": 1\n      }\n    ],\n    \"auto_renewal\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Order by id",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/orders/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "orders",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "42",
                      "description": "Order id."
                    }
                  ]
                },
                "description": "Returns one order by its numeric `id` (not `orderId`). Poll it after `POST /orders` until `orderStatus`\nbecomes `approved` or `declined`; on decline see `orderJSON.payment.message`. Use `populate` for\n`payment_system`, `currency`, `phones`, `payments`. Request only orders of your own company.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Order.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "42",
                          "description": "Order id."
                        }
                      ]
                    },
                    "description": "Returns one order by its numeric `id` (not `orderId`). Poll it after `POST /orders` until `orderStatus`\nbecomes `approved` or `declined`; on decline see `orderJSON.payment.message`. Use `populate` for\n`payment_system`, `currency`, `phones`, `payments`. Request only orders of your own company.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Order.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 42,\n    \"attributes\": {\n      \"orderId\": \"1788231620358546\",\n      \"orderStatus\": \"declined\",\n      \"orderType\": \"outgoing\",\n      \"amount\": 6.49,\n      \"auto_renewal\": true,\n      \"redirect_link\": \"global\",\n      \"source\": \"default\",\n      \"template_name\": null,\n      \"additional_data\": null,\n      \"orderJSON\": {\n        \"total\": 6.49,\n        \"goodsTotal\": 5.99,\n        \"starterFee\": 0.5,\n        \"refill\": 0.5,\n        \"tariff\": null,\n        \"esim\": null,\n        \"promo\": null,\n        \"domain\": [],\n        \"recall_widget\": [],\n        \"callback_widget\": [],\n        \"sip-trunk\": [],\n        \"incomingOrderId\": null,\n        \"phones\": [\n          {\n            \"prefix_id\": 9,\n            \"prefix_number\": \"44\",\n            \"quantity\": 1,\n            \"setup_price\": 5.99,\n            \"attached_phones\": [\n              {\n                \"id\": 25,\n                \"service\": \"default\",\n                \"fullnumber\": \"380441234567\"\n              }\n            ]\n          }\n        ],\n        \"payment\": {\n          \"processUrl\": \"https://api.onevoiplanet.com/api/orders/process-payment/1788231620358546\",\n          \"message\": \"Not enough money on balance\"\n        }\n      },\n      \"createdAt\": \"2026-09-01T03:00:20.402Z\",\n      \"updatedAt\": \"2026-09-01T03:00:25.402Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "42",
                          "description": "Order id."
                        }
                      ]
                    },
                    "description": "Returns one order by its numeric `id` (not `orderId`). Poll it after `POST /orders` until `orderStatus`\nbecomes `approved` or `declined`; on decline see `orderJSON.payment.message`. Use `populate` for\n`payment_system`, `currency`, `phones`, `payments`. Request only orders of your own company.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "42",
                          "description": "Order id."
                        }
                      ]
                    },
                    "description": "Returns one order by its numeric `id` (not `orderId`). Poll it after `POST /orders` until `orderStatus`\nbecomes `approved` or `declined`; on decline see `orderJSON.payment.message`. Use `populate` for\n`payment_system`, `currency`, `phones`, `payments`. Request only orders of your own company.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "42",
                          "description": "Order id."
                        }
                      ]
                    },
                    "description": "Returns one order by its numeric `id` (not `orderId`). Poll it after `POST /orders` until `orderStatus`\nbecomes `approved` or `declined`; on decline see `orderJSON.payment.message`. Use `populate` for\n`payment_system`, `currency`, `phones`, `payments`. Request only orders of your own company.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Calculate order price (no charge)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/orders/calculate-order-price",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "orders",
                    "calculate-order-price"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Calculates the same `orderJSON` as `POST /orders` would produce — prices of numbers, packets, tariff, eSIM,\nextras, starter fee and total — **without creating an order or charging anything**. Accepts the same fields;\nthe top-up amount is passed as `amount` here. The company and currency are taken from the token.\n`goodsTotal` is the price of goods only (compare with the balance to decide whether paying from the balance\nis possible), `total` includes `refill` (top-up + starter fee). Rate limit: 30 requests per minute.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"phones\": [\n      {\n        \"prefix_id\": 9,\n        \"quantity\": 1,\n        \"talk_package_id\": 2\n      }\n    ],\n    \"amount\": 0\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Calculated order snapshot (flat object).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders/calculate-order-price",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders",
                        "calculate-order-price"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Calculates the same `orderJSON` as `POST /orders` would produce — prices of numbers, packets, tariff, eSIM,\nextras, starter fee and total — **without creating an order or charging anything**. Accepts the same fields;\nthe top-up amount is passed as `amount` here. The company and currency are taken from the token.\n`goodsTotal` is the price of goods only (compare with the balance to decide whether paying from the balance\nis possible), `total` includes `refill` (top-up + starter fee). Rate limit: 30 requests per minute.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phones\": [\n      {\n        \"prefix_id\": 9,\n        \"quantity\": 1,\n        \"talk_package_id\": 2\n      }\n    ],\n    \"amount\": 0\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Calculated order snapshot (flat object).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"total\": 10.49,\n  \"goodsTotal\": 9.99,\n  \"starterFee\": 0.5,\n  \"refill\": 0.5,\n  \"tariff\": null,\n  \"esim\": null,\n  \"promo\": null,\n  \"domain\": [],\n  \"recall_widget\": [],\n  \"callback_widget\": [],\n  \"sip-trunk\": [],\n  \"incomingOrderId\": null,\n  \"user_ip\": null,\n  \"payment\": null,\n  \"phones\": [\n    {\n      \"prefix_id\": 9,\n      \"prefix_number\": \"44\",\n      \"quantity\": 1,\n      \"talk_package_id\": 2,\n      \"setup_price\": 5.99,\n      \"talk_package_price\": 4\n    }\n  ]\n}"
                },
                {
                  "name": "400 Validation error (same messages as `POST /orders`).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders/calculate-order-price",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders",
                        "calculate-order-price"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Calculates the same `orderJSON` as `POST /orders` would produce — prices of numbers, packets, tariff, eSIM,\nextras, starter fee and total — **without creating an order or charging anything**. Accepts the same fields;\nthe top-up amount is passed as `amount` here. The company and currency are taken from the token.\n`goodsTotal` is the price of goods only (compare with the balance to decide whether paying from the balance\nis possible), `total` includes `refill` (top-up + starter fee). Rate limit: 30 requests per minute.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phones\": [\n      {\n        \"prefix_id\": 9,\n        \"quantity\": 1,\n        \"talk_package_id\": 2\n      }\n    ],\n    \"amount\": 0\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error (same messages as `POST /orders`).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Prefix 44 has no price for your currency!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders/calculate-order-price",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders",
                        "calculate-order-price"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Calculates the same `orderJSON` as `POST /orders` would produce — prices of numbers, packets, tariff, eSIM,\nextras, starter fee and total — **without creating an order or charging anything**. Accepts the same fields;\nthe top-up amount is passed as `amount` here. The company and currency are taken from the token.\n`goodsTotal` is the price of goods only (compare with the balance to decide whether paying from the balance\nis possible), `total` includes `refill` (top-up + starter fee). Rate limit: 30 requests per minute.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phones\": [\n      {\n        \"prefix_id\": 9,\n        \"quantity\": 1,\n        \"talk_package_id\": 2\n      }\n    ],\n    \"amount\": 0\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders/calculate-order-price",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders",
                        "calculate-order-price"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Calculates the same `orderJSON` as `POST /orders` would produce — prices of numbers, packets, tariff, eSIM,\nextras, starter fee and total — **without creating an order or charging anything**. Accepts the same fields;\nthe top-up amount is passed as `amount` here. The company and currency are taken from the token.\n`goodsTotal` is the price of goods only (compare with the balance to decide whether paying from the balance\nis possible), `total` includes `refill` (top-up + starter fee). Rate limit: 30 requests per minute.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phones\": [\n      {\n        \"prefix_id\": 9,\n        \"quantity\": 1,\n        \"talk_package_id\": 2\n      }\n    ],\n    \"amount\": 0\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/orders/calculate-order-price",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "orders",
                        "calculate-order-price"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Calculates the same `orderJSON` as `POST /orders` would produce — prices of numbers, packets, tariff, eSIM,\nextras, starter fee and total — **without creating an order or charging anything**. Accepts the same fields;\nthe top-up amount is passed as `amount` here. The company and currency are taken from the token.\n`goodsTotal` is the price of goods only (compare with the balance to decide whether paying from the balance\nis possible), `total` includes `refill` (top-up + starter fee). Rate limit: 30 requests per minute.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phones\": [\n      {\n        \"prefix_id\": 9,\n        \"quantity\": 1,\n        \"talk_package_id\": 2\n      }\n    ],\n    \"amount\": 0\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                }
              ]
            }
          ]
        },
        {
          "name": "Subscriptions",
          "description": "Monthly subscriptions for numbers and services: renewal, auto-renew, restore.",
          "item": [
            {
              "name": "Subscriptions of the company",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/subscriptions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "subscriptions"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Strapi core list of the company's subscriptions (the company filter is added automatically). A subscription\nis created for every paid item (number, tariff, domain, widget, SIP trunk, external number) when an order is\napproved. Lifecycle: every night at 03:00 (server time, UTC) subscriptions whose `next_billing_date` has come\nare charged: `amount` is debited from the balance; if the balance is insufficient and a card is saved, the card\nis charged. On success `payeed` becomes `true` and `next_billing_date` moves one month ahead. On failure\n`payeed` stays `false`: the number stops working but can be restored within 30 days\n(`POST /subscriptions/{id}/restore`); after 30 days the number is released and cannot be restored.\n`active` is the auto-renewal switch (`PUT /subscriptions/update_state/{subscriptionId}`); inactive subscriptions\nare not charged and expire at `next_billing_date`.\nUseful: `populate[service_name][populate]=*` (what the subscription is for), `populate[payments]=true`,\n`filters[active][$eq]=true`, `filters[payeed][$eq]=false`, `sort=next_billing_date:asc`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of subscriptions.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/subscriptions",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "subscriptions"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Strapi core list of the company's subscriptions (the company filter is added automatically). A subscription\nis created for every paid item (number, tariff, domain, widget, SIP trunk, external number) when an order is\napproved. Lifecycle: every night at 03:00 (server time, UTC) subscriptions whose `next_billing_date` has come\nare charged: `amount` is debited from the balance; if the balance is insufficient and a card is saved, the card\nis charged. On success `payeed` becomes `true` and `next_billing_date` moves one month ahead. On failure\n`payeed` stays `false`: the number stops working but can be restored within 30 days\n(`POST /subscriptions/{id}/restore`); after 30 days the number is released and cannot be restored.\n`active` is the auto-renewal switch (`PUT /subscriptions/update_state/{subscriptionId}`); inactive subscriptions\nare not charged and expire at `next_billing_date`.\nUseful: `populate[service_name][populate]=*` (what the subscription is for), `populate[payments]=true`,\n`filters[active][$eq]=true`, `filters[payeed][$eq]=false`, `sort=next_billing_date:asc`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Page of subscriptions.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 12,\n      \"attributes\": {\n        \"next_billing_date\": \"2026-11-01\",\n        \"amount\": 5.99,\n        \"payeed\": true,\n        \"active\": true,\n        \"createdAt\": \"2026-04-22T07:08:01.714Z\",\n        \"updatedAt\": \"2026-10-01T03:00:04.393Z\",\n        \"service_name\": [\n          {\n            \"id\": 385,\n            \"__component\": \"subscription-service.phones\",\n            \"phones\": {\n              \"data\": {\n                \"id\": 25,\n                \"attributes\": {\n                  \"fullnumber\": \"380441234567\"\n                }\n              }\n            }\n          }\n        ],\n        \"payments\": {\n          \"data\": [\n            {\n              \"id\": 101,\n              \"attributes\": {\n                \"status\": \"approved\",\n                \"amount\": -5.99,\n                \"commentary\": \"Payment: 191703\",\n                \"createdAt\": \"2026-10-01T03:00:04.488Z\",\n                \"updatedAt\": \"2026-10-01T03:00:04.911Z\"\n              }\n            }\n          ]\n        },\n        \"payment_system\": {\n          \"data\": null\n        }\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 9\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/subscriptions",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "subscriptions"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Strapi core list of the company's subscriptions (the company filter is added automatically). A subscription\nis created for every paid item (number, tariff, domain, widget, SIP trunk, external number) when an order is\napproved. Lifecycle: every night at 03:00 (server time, UTC) subscriptions whose `next_billing_date` has come\nare charged: `amount` is debited from the balance; if the balance is insufficient and a card is saved, the card\nis charged. On success `payeed` becomes `true` and `next_billing_date` moves one month ahead. On failure\n`payeed` stays `false`: the number stops working but can be restored within 30 days\n(`POST /subscriptions/{id}/restore`); after 30 days the number is released and cannot be restored.\n`active` is the auto-renewal switch (`PUT /subscriptions/update_state/{subscriptionId}`); inactive subscriptions\nare not charged and expire at `next_billing_date`.\nUseful: `populate[service_name][populate]=*` (what the subscription is for), `populate[payments]=true`,\n`filters[active][$eq]=true`, `filters[payeed][$eq]=false`, `sort=next_billing_date:asc`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/subscriptions",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "subscriptions"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Strapi core list of the company's subscriptions (the company filter is added automatically). A subscription\nis created for every paid item (number, tariff, domain, widget, SIP trunk, external number) when an order is\napproved. Lifecycle: every night at 03:00 (server time, UTC) subscriptions whose `next_billing_date` has come\nare charged: `amount` is debited from the balance; if the balance is insufficient and a card is saved, the card\nis charged. On success `payeed` becomes `true` and `next_billing_date` moves one month ahead. On failure\n`payeed` stays `false`: the number stops working but can be restored within 30 days\n(`POST /subscriptions/{id}/restore`); after 30 days the number is released and cannot be restored.\n`active` is the auto-renewal switch (`PUT /subscriptions/update_state/{subscriptionId}`); inactive subscriptions\nare not charged and expire at `next_billing_date`.\nUseful: `populate[service_name][populate]=*` (what the subscription is for), `populate[payments]=true`,\n`filters[active][$eq]=true`, `filters[payeed][$eq]=false`, `sort=next_billing_date:asc`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Switch auto-renewal",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/subscriptions/update_state/:subscriptionId",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "subscriptions",
                    "update_state",
                    ":subscriptionId"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "subscriptionId",
                      "value": "12",
                      "description": "Subscription id."
                    }
                  ]
                },
                "description": "Enables or disables auto-renewal (`active`) of a paid subscription of your company. Only subscriptions with\n`payeed: true` can be switched; for an unpaid one restore it first. With `active: false` the subscription is\nnot charged at night and the service expires at `next_billing_date`. If the subscription is not found, belongs\nto another company or is not paid, `data` is `null`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Changes the auto-renewal flag; sends an `autorenew_enabled`/`autorenew_cancelled` notification to the owner (Telegram/webhook).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"active\": false\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated state, or `data: null` if nothing was updated.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/subscriptions/update_state/:subscriptionId",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "subscriptions",
                        "update_state",
                        ":subscriptionId"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "subscriptionId",
                          "value": "12",
                          "description": "Subscription id."
                        }
                      ]
                    },
                    "description": "Enables or disables auto-renewal (`active`) of a paid subscription of your company. Only subscriptions with\n`payeed: true` can be switched; for an unpaid one restore it first. With `active: false` the subscription is\nnot charged at night and the service expires at `next_billing_date`. If the subscription is not found, belongs\nto another company or is not paid, `data` is `null`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Changes the auto-renewal flag; sends an `autorenew_enabled`/`autorenew_cancelled` notification to the owner (Telegram/webhook).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"active\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated state, or `data: null` if nothing was updated.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 12,\n    \"attributes\": {\n      \"active\": false,\n      \"next_billing_date\": \"2026-11-01\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 `active` is missing.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/subscriptions/update_state/:subscriptionId",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "subscriptions",
                        "update_state",
                        ":subscriptionId"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "subscriptionId",
                          "value": "12",
                          "description": "Subscription id."
                        }
                      ]
                    },
                    "description": "Enables or disables auto-renewal (`active`) of a paid subscription of your company. Only subscriptions with\n`payeed: true` can be switched; for an unpaid one restore it first. With `active: false` the subscription is\nnot charged at night and the service expires at `next_billing_date`. If the subscription is not found, belongs\nto another company or is not paid, `data` is `null`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Changes the auto-renewal flag; sends an `autorenew_enabled`/`autorenew_cancelled` notification to the owner (Telegram/webhook).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"active\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`active` is missing.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"`active` field must be provided\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/subscriptions/update_state/:subscriptionId",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "subscriptions",
                        "update_state",
                        ":subscriptionId"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "subscriptionId",
                          "value": "12",
                          "description": "Subscription id."
                        }
                      ]
                    },
                    "description": "Enables or disables auto-renewal (`active`) of a paid subscription of your company. Only subscriptions with\n`payeed: true` can be switched; for an unpaid one restore it first. With `active: false` the subscription is\nnot charged at night and the service expires at `next_billing_date`. If the subscription is not found, belongs\nto another company or is not paid, `data` is `null`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Changes the auto-renewal flag; sends an `autorenew_enabled`/`autorenew_cancelled` notification to the owner (Telegram/webhook).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"active\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/subscriptions/update_state/:subscriptionId",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "subscriptions",
                        "update_state",
                        ":subscriptionId"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "subscriptionId",
                          "value": "12",
                          "description": "Subscription id."
                        }
                      ]
                    },
                    "description": "Enables or disables auto-renewal (`active`) of a paid subscription of your company. Only subscriptions with\n`payeed: true` can be switched; for an unpaid one restore it first. With `active: false` the subscription is\nnot charged at night and the service expires at `next_billing_date`. If the subscription is not found, belongs\nto another company or is not paid, `data` is `null`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Changes the auto-renewal flag; sends an `autorenew_enabled`/`autorenew_cancelled` notification to the owner (Telegram/webhook).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"active\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Restore an expired subscription (pay from balance)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/subscriptions/:id/restore",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "subscriptions",
                    ":id",
                    "restore"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "12",
                      "description": "Subscription id (see `subscription_id` in `GET /phones/subscriptions-list`)."
                    }
                  ]
                },
                "description": "Pays an overdue subscription of a number **from the company balance** and thereby restores the number.\nPossible within 30 days after `next_billing_date` (`recovery_status: restorable` in `GET /phones/subscriptions-list`).\nThe charged amount is the subscription `amount` or, if it is 0, the monthly price of the number prefix.\nNo card fallback: if the balance is insufficient the response is `{ ok: false, reason: \"insufficient_balance\" }` —\ntop up first (`POST /orders` with `addMoney`). The charge is asynchronous: the response is `status: \"processing\"`;\nwithin a few seconds `payeed` becomes `true` and `next_billing_date` moves forward (check `GET /subscriptions`).\nAuto-renewal (`active`) is **not** switched on — enable it separately. A repeated call within 2 minutes while\na charge is in flight does not charge twice.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Charges the subscription amount (or the number's monthly price) from the company balance; on success marks the subscription paid, moves `next_billing_date` one month ahead and re-activates the number."
              },
              "response": [
                {
                  "name": "200 Result. `ok: true` — charge started; `ok: false` — see `reason`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/subscriptions/:id/restore",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "subscriptions",
                        ":id",
                        "restore"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Subscription id (see `subscription_id` in `GET /phones/subscriptions-list`)."
                        }
                      ]
                    },
                    "description": "Pays an overdue subscription of a number **from the company balance** and thereby restores the number.\nPossible within 30 days after `next_billing_date` (`recovery_status: restorable` in `GET /phones/subscriptions-list`).\nThe charged amount is the subscription `amount` or, if it is 0, the monthly price of the number prefix.\nNo card fallback: if the balance is insufficient the response is `{ ok: false, reason: \"insufficient_balance\" }` —\ntop up first (`POST /orders` with `addMoney`). The charge is asynchronous: the response is `status: \"processing\"`;\nwithin a few seconds `payeed` becomes `true` and `next_billing_date` moves forward (check `GET /subscriptions`).\nAuto-renewal (`active`) is **not** switched on — enable it separately. A repeated call within 2 minutes while\na charge is in flight does not charge twice.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Charges the subscription amount (or the number's monthly price) from the company balance; on success marks the subscription paid, moves `next_billing_date` one month ahead and re-activates the number."
                  },
                  "status": "Result. `ok: true` — charge started; `ok: false` — see `reason`.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"ok\": true,\n  \"status\": \"processing\",\n  \"subscriptionId\": 12,\n  \"amount\": 5.99\n}"
                },
                {
                  "name": "400 Invalid id or the price cannot be resolved.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/subscriptions/:id/restore",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "subscriptions",
                        ":id",
                        "restore"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Subscription id (see `subscription_id` in `GET /phones/subscriptions-list`)."
                        }
                      ]
                    },
                    "description": "Pays an overdue subscription of a number **from the company balance** and thereby restores the number.\nPossible within 30 days after `next_billing_date` (`recovery_status: restorable` in `GET /phones/subscriptions-list`).\nThe charged amount is the subscription `amount` or, if it is 0, the monthly price of the number prefix.\nNo card fallback: if the balance is insufficient the response is `{ ok: false, reason: \"insufficient_balance\" }` —\ntop up first (`POST /orders` with `addMoney`). The charge is asynchronous: the response is `status: \"processing\"`;\nwithin a few seconds `payeed` becomes `true` and `next_billing_date` moves forward (check `GET /subscriptions`).\nAuto-renewal (`active`) is **not** switched on — enable it separately. A repeated call within 2 minutes while\na charge is in flight does not charge twice.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Charges the subscription amount (or the number's monthly price) from the company balance; on success marks the subscription paid, moves `next_billing_date` one month ahead and re-activates the number."
                  },
                  "status": "Invalid id or the price cannot be resolved.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"subscription id required\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/subscriptions/:id/restore",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "subscriptions",
                        ":id",
                        "restore"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Subscription id (see `subscription_id` in `GET /phones/subscriptions-list`)."
                        }
                      ]
                    },
                    "description": "Pays an overdue subscription of a number **from the company balance** and thereby restores the number.\nPossible within 30 days after `next_billing_date` (`recovery_status: restorable` in `GET /phones/subscriptions-list`).\nThe charged amount is the subscription `amount` or, if it is 0, the monthly price of the number prefix.\nNo card fallback: if the balance is insufficient the response is `{ ok: false, reason: \"insufficient_balance\" }` —\ntop up first (`POST /orders` with `addMoney`). The charge is asynchronous: the response is `status: \"processing\"`;\nwithin a few seconds `payeed` becomes `true` and `next_billing_date` moves forward (check `GET /subscriptions`).\nAuto-renewal (`active`) is **not** switched on — enable it separately. A repeated call within 2 minutes while\na charge is in flight does not charge twice.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Charges the subscription amount (or the number's monthly price) from the company balance; on success marks the subscription paid, moves `next_billing_date` one month ahead and re-activates the number."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/subscriptions/:id/restore",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "subscriptions",
                        ":id",
                        "restore"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Subscription id (see `subscription_id` in `GET /phones/subscriptions-list`)."
                        }
                      ]
                    },
                    "description": "Pays an overdue subscription of a number **from the company balance** and thereby restores the number.\nPossible within 30 days after `next_billing_date` (`recovery_status: restorable` in `GET /phones/subscriptions-list`).\nThe charged amount is the subscription `amount` or, if it is 0, the monthly price of the number prefix.\nNo card fallback: if the balance is insufficient the response is `{ ok: false, reason: \"insufficient_balance\" }` —\ntop up first (`POST /orders` with `addMoney`). The charge is asynchronous: the response is `status: \"processing\"`;\nwithin a few seconds `payeed` becomes `true` and `next_billing_date` moves forward (check `GET /subscriptions`).\nAuto-renewal (`active`) is **not** switched on — enable it separately. A repeated call within 2 minutes while\na charge is in flight does not charge twice.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Charges the subscription amount (or the number's monthly price) from the company balance; on success marks the subscription paid, moves `next_billing_date` one month ahead and re-activates the number."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Subscription not found or belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/subscriptions/:id/restore",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "subscriptions",
                        ":id",
                        "restore"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Subscription id (see `subscription_id` in `GET /phones/subscriptions-list`)."
                        }
                      ]
                    },
                    "description": "Pays an overdue subscription of a number **from the company balance** and thereby restores the number.\nPossible within 30 days after `next_billing_date` (`recovery_status: restorable` in `GET /phones/subscriptions-list`).\nThe charged amount is the subscription `amount` or, if it is 0, the monthly price of the number prefix.\nNo card fallback: if the balance is insufficient the response is `{ ok: false, reason: \"insufficient_balance\" }` —\ntop up first (`POST /orders` with `addMoney`). The charge is asynchronous: the response is `status: \"processing\"`;\nwithin a few seconds `payeed` becomes `true` and `next_billing_date` moves forward (check `GET /subscriptions`).\nAuto-renewal (`active`) is **not** switched on — enable it separately. A repeated call within 2 minutes while\na charge is in flight does not charge twice.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Charges the subscription amount (or the number's monthly price) from the company balance; on success marks the subscription paid, moves `next_billing_date` one month ahead and re-activates the number."
                  },
                  "status": "Subscription not found or belongs to another company.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Subscription not found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Numbers with subscription status",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/phones/subscriptions-list",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "phones",
                    "subscriptions-list"
                  ],
                  "query": [
                    {
                      "key": "page",
                      "value": "1",
                      "description": "Page number, from 1.",
                      "disabled": true
                    },
                    {
                      "key": "pageSize",
                      "value": "20",
                      "description": "Rows per page (1–100, default 20).",
                      "disabled": true
                    },
                    {
                      "key": "tab",
                      "value": "all",
                      "description": "Filter by status: `all`, `active`, `expired`.",
                      "disabled": true
                    },
                    {
                      "key": "sortBy",
                      "value": "fullnumber",
                      "description": "Sort field: `fullnumber`, `next_billing_date`, `created_at`, `status`, `recovery_status`.",
                      "disabled": true
                    },
                    {
                      "key": "sortOrder",
                      "value": "asc",
                      "description": "`asc` or `desc`.",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "One row per company number joined with its subscription: paid state, next billing date, price, catalogue data\n(prefix, owner, country), lifecycle status (`active` / `expired`) and whether an expired number can still be\nrestored (`recovery_status`: `restorable` — within 30 days after the billing date, `non_restorable` — later,\n`not_applicable` — active, `unknown` — no billing anchor). Numbers already detached from the company but still\nreferenced by its old subscriptions are included with `is_detached: true` (history). Also contains the\nregulator verification status of the number. Designed for the \"My numbers\" screen; employees may call it.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Rows (note: items have `attributes` only, without `id`).",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/subscriptions-list",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "subscriptions-list"
                      ],
                      "query": [
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Page number, from 1.",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "20",
                          "description": "Rows per page (1–100, default 20).",
                          "disabled": true
                        },
                        {
                          "key": "tab",
                          "value": "all",
                          "description": "Filter by status: `all`, `active`, `expired`.",
                          "disabled": true
                        },
                        {
                          "key": "sortBy",
                          "value": "fullnumber",
                          "description": "Sort field: `fullnumber`, `next_billing_date`, `created_at`, `status`, `recovery_status`.",
                          "disabled": true
                        },
                        {
                          "key": "sortOrder",
                          "value": "asc",
                          "description": "`asc` or `desc`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "One row per company number joined with its subscription: paid state, next billing date, price, catalogue data\n(prefix, owner, country), lifecycle status (`active` / `expired`) and whether an expired number can still be\nrestored (`recovery_status`: `restorable` — within 30 days after the billing date, `non_restorable` — later,\n`not_applicable` — active, `unknown` — no billing anchor). Numbers already detached from the company but still\nreferenced by its old subscriptions are included with `is_detached: true` (history). Also contains the\nregulator verification status of the number. Designed for the \"My numbers\" screen; employees may call it.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Rows (note: items have `attributes` only, without `id`).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"attributes\": {\n        \"phone_id\": 25,\n        \"fullnumber\": \"380441234567\",\n        \"number\": \"1234567\",\n        \"custom\": null,\n        \"verification_required\": null,\n        \"verified_at\": null,\n        \"created_at\": \"2026-04-07T12:25:18.282Z\",\n        \"updated_at\": \"2026-10-01T03:00:04.393Z\",\n        \"company_id\": 7,\n        \"subscription_id\": 12,\n        \"active\": true,\n        \"payeed\": true,\n        \"next_billing_date\": \"2026-11-01\",\n        \"subscription_amount\": 5.99,\n        \"prefix_id\": 9,\n        \"prefix\": \"44\",\n        \"owner_name\": \"Kyiv\",\n        \"owner_type\": \"city\",\n        \"country_iso\": \"UA\",\n        \"prefix_price\": 5.99,\n        \"status\": \"active\",\n        \"recovery_status\": \"not_applicable\",\n        \"verification\": {\n          \"required\": false,\n          \"status\": \"none\",\n          \"verification_id\": null,\n          \"reject_reasons\": null,\n          \"reject_comment\": null,\n          \"verified_at\": null\n        },\n        \"lifecycle_anchor_date\": \"2026-11-01\",\n        \"lifecycle_days_after_anchor\": -30,\n        \"is_detached\": false\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 20,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/subscriptions-list",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "subscriptions-list"
                      ],
                      "query": [
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Page number, from 1.",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "20",
                          "description": "Rows per page (1–100, default 20).",
                          "disabled": true
                        },
                        {
                          "key": "tab",
                          "value": "all",
                          "description": "Filter by status: `all`, `active`, `expired`.",
                          "disabled": true
                        },
                        {
                          "key": "sortBy",
                          "value": "fullnumber",
                          "description": "Sort field: `fullnumber`, `next_billing_date`, `created_at`, `status`, `recovery_status`.",
                          "disabled": true
                        },
                        {
                          "key": "sortOrder",
                          "value": "asc",
                          "description": "`asc` or `desc`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "One row per company number joined with its subscription: paid state, next billing date, price, catalogue data\n(prefix, owner, country), lifecycle status (`active` / `expired`) and whether an expired number can still be\nrestored (`recovery_status`: `restorable` — within 30 days after the billing date, `non_restorable` — later,\n`not_applicable` — active, `unknown` — no billing anchor). Numbers already detached from the company but still\nreferenced by its old subscriptions are included with `is_detached: true` (history). Also contains the\nregulator verification status of the number. Designed for the \"My numbers\" screen; employees may call it.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/subscriptions-list",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "subscriptions-list"
                      ],
                      "query": [
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Page number, from 1.",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "20",
                          "description": "Rows per page (1–100, default 20).",
                          "disabled": true
                        },
                        {
                          "key": "tab",
                          "value": "all",
                          "description": "Filter by status: `all`, `active`, `expired`.",
                          "disabled": true
                        },
                        {
                          "key": "sortBy",
                          "value": "fullnumber",
                          "description": "Sort field: `fullnumber`, `next_billing_date`, `created_at`, `status`, `recovery_status`.",
                          "disabled": true
                        },
                        {
                          "key": "sortOrder",
                          "value": "asc",
                          "description": "`asc` or `desc`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "One row per company number joined with its subscription: paid state, next billing date, price, catalogue data\n(prefix, owner, country), lifecycle status (`active` / `expired`) and whether an expired number can still be\nrestored (`recovery_status`: `restorable` — within 30 days after the billing date, `non_restorable` — later,\n`not_applicable` — active, `unknown` — no billing anchor). Numbers already detached from the company but still\nreferenced by its old subscriptions are included with `is_detached: true` (history). Also contains the\nregulator verification status of the number. Designed for the \"My numbers\" screen; employees may call it.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "Telephony",
      "item": [
        {
          "name": "Numbers",
          "description": "Phone numbers of the company, the public number catalogue, external (own) numbers and identity verification required by regulators.",
          "item": [
            {
              "name": "Numbers available for purchase",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/phones",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "phones"
                  ],
                  "query": [
                    {
                      "key": "currency",
                      "value": "3",
                      "description": "Currency id: return only numbers that have a price in this currency.",
                      "disabled": true
                    },
                    {
                      "key": "phonesNumber",
                      "value": "4412",
                      "description": "Substring search in `fullnumber` (digits only).",
                      "disabled": true
                    },
                    {
                      "key": "phonesCity",
                      "value": "1",
                      "description": "Id of the prefix owner (city/operator, `phone_prefix_owner`). Alias: `phonesOperator`.",
                      "disabled": true
                    },
                    {
                      "key": "phonesOperator",
                      "value": "1",
                      "description": "Same as `phonesCity` (used when `phonesCity` is absent).",
                      "disabled": true
                    },
                    {
                      "key": "phonesType",
                      "value": "simple",
                      "description": "Number class.",
                      "disabled": true
                    },
                    {
                      "key": "tab",
                      "value": "urban",
                      "description": "Prefix owner type: `all` (default), `0800` — national (toll-free), `urban` — city, `mobiles` — mobile.",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Catalogue of free numbers (the marketplace): only numbers that are not assigned to any company and not reserved\n(`reserved: false`) are returned. It does **not** return the numbers of your company — use `GET /companies/my` with\n`populate[phones]` or `GET /companies/phone/{id}` for that.\n\nStandard Strapi `filters`, `sort` and `populate` are ignored by this method; use the specific query parameters\nbelow. The response always includes `country_prefix`, `phone_prefix` (with `phone_prefix_owner`, its prices and\nlocalized names) and the per-number `prices`. `fullnumber` is the full number in E.164 without the leading plus\n(e.g. `380441234567`). The purchase itself is done through Orders.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of free numbers.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones"
                      ],
                      "query": [
                        {
                          "key": "currency",
                          "value": "3",
                          "description": "Currency id: return only numbers that have a price in this currency.",
                          "disabled": true
                        },
                        {
                          "key": "phonesNumber",
                          "value": "4412",
                          "description": "Substring search in `fullnumber` (digits only).",
                          "disabled": true
                        },
                        {
                          "key": "phonesCity",
                          "value": "1",
                          "description": "Id of the prefix owner (city/operator, `phone_prefix_owner`). Alias: `phonesOperator`.",
                          "disabled": true
                        },
                        {
                          "key": "phonesOperator",
                          "value": "1",
                          "description": "Same as `phonesCity` (used when `phonesCity` is absent).",
                          "disabled": true
                        },
                        {
                          "key": "phonesType",
                          "value": "simple",
                          "description": "Number class.",
                          "disabled": true
                        },
                        {
                          "key": "tab",
                          "value": "urban",
                          "description": "Prefix owner type: `all` (default), `0800` — national (toll-free), `urban` — city, `mobiles` — mobile.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Catalogue of free numbers (the marketplace): only numbers that are not assigned to any company and not reserved\n(`reserved: false`) are returned. It does **not** return the numbers of your company — use `GET /companies/my` with\n`populate[phones]` or `GET /companies/phone/{id}` for that.\n\nStandard Strapi `filters`, `sort` and `populate` are ignored by this method; use the specific query parameters\nbelow. The response always includes `country_prefix`, `phone_prefix` (with `phone_prefix_owner`, its prices and\nlocalized names) and the per-number `prices`. `fullnumber` is the full number in E.164 without the leading plus\n(e.g. `380441234567`). The purchase itself is done through Orders.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Page of free numbers.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 101,\n      \"attributes\": {\n        \"number\": \"1234567\",\n        \"channels\": 4,\n        \"type\": \"simple\",\n        \"reserved\": false,\n        \"verificationRequired\": false,\n        \"verifiedAt\": null,\n        \"fullnumber\": \"380441234567\",\n        \"priority\": 3,\n        \"prefix_type\": \"urban\",\n        \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n        \"updatedAt\": \"2026-01-15T10:00:00.000Z\",\n        \"company\": {\n          \"data\": null\n        },\n        \"country_prefix\": {\n          \"data\": {\n            \"id\": 1,\n            \"attributes\": {\n              \"country\": \"UA\",\n              \"iso\": \"UA\",\n              \"prefix\": \"380\",\n              \"isAvailable\": true,\n              \"outgoing_calls\": true,\n              \"incoming_calls\": true,\n              \"outgoing_sms\": false,\n              \"incoming_sms\": true\n            }\n          }\n        },\n        \"phone_prefix\": {\n          \"data\": {\n            \"id\": 9,\n            \"attributes\": {\n              \"prefix\": \"44\",\n              \"capacity\": null,\n              \"validation\": false,\n              \"call\": \"INT\",\n              \"incoming_sms\": false,\n              \"outgoing_sms\": false,\n              \"phone_prefix_owner\": {\n                \"data\": {\n                  \"id\": 1,\n                  \"attributes\": {\n                    \"owner\": \"м. Київ\",\n                    \"type\": \"city\",\n                    \"available_call_directions\": \"both\",\n                    \"prices\": {\n                      \"data\": []\n                    },\n                    \"names\": [\n                      {\n                        \"id\": 1,\n                        \"locales\": \"uk-UA\",\n                        \"name\": \"м. Київ\"\n                      },\n                      {\n                        \"id\": 2,\n                        \"locales\": \"en\",\n                        \"name\": \"Kyiv\"\n                      }\n                    ]\n                  }\n                }\n              }\n            }\n          }\n        },\n        \"prices\": {\n          \"data\": [\n            {\n              \"id\": 55,\n              \"attributes\": {\n                \"currency\": {\n                  \"data\": {\n                    \"id\": 3,\n                    \"attributes\": {\n                      \"name_short\": \"UAH\",\n                      \"name_long\": \"Гривня\",\n                      \"symbol\": \"₴\"\n                    }\n                  }\n                },\n                \"price_by_field\": [\n                  {\n                    \"id\": 7,\n                    \"name\": \"price\",\n                    \"price\": 500,\n                    \"isPriceStatic\": false\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 40,\n      \"total\": 1000\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones"
                      ],
                      "query": [
                        {
                          "key": "currency",
                          "value": "3",
                          "description": "Currency id: return only numbers that have a price in this currency.",
                          "disabled": true
                        },
                        {
                          "key": "phonesNumber",
                          "value": "4412",
                          "description": "Substring search in `fullnumber` (digits only).",
                          "disabled": true
                        },
                        {
                          "key": "phonesCity",
                          "value": "1",
                          "description": "Id of the prefix owner (city/operator, `phone_prefix_owner`). Alias: `phonesOperator`.",
                          "disabled": true
                        },
                        {
                          "key": "phonesOperator",
                          "value": "1",
                          "description": "Same as `phonesCity` (used when `phonesCity` is absent).",
                          "disabled": true
                        },
                        {
                          "key": "phonesType",
                          "value": "simple",
                          "description": "Number class.",
                          "disabled": true
                        },
                        {
                          "key": "tab",
                          "value": "urban",
                          "description": "Prefix owner type: `all` (default), `0800` — national (toll-free), `urban` — city, `mobiles` — mobile.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Catalogue of free numbers (the marketplace): only numbers that are not assigned to any company and not reserved\n(`reserved: false`) are returned. It does **not** return the numbers of your company — use `GET /companies/my` with\n`populate[phones]` or `GET /companies/phone/{id}` for that.\n\nStandard Strapi `filters`, `sort` and `populate` are ignored by this method; use the specific query parameters\nbelow. The response always includes `country_prefix`, `phone_prefix` (with `phone_prefix_owner`, its prices and\nlocalized names) and the per-number `prices`. `fullnumber` is the full number in E.164 without the leading plus\n(e.g. `380441234567`). The purchase itself is done through Orders.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones"
                      ],
                      "query": [
                        {
                          "key": "currency",
                          "value": "3",
                          "description": "Currency id: return only numbers that have a price in this currency.",
                          "disabled": true
                        },
                        {
                          "key": "phonesNumber",
                          "value": "4412",
                          "description": "Substring search in `fullnumber` (digits only).",
                          "disabled": true
                        },
                        {
                          "key": "phonesCity",
                          "value": "1",
                          "description": "Id of the prefix owner (city/operator, `phone_prefix_owner`). Alias: `phonesOperator`.",
                          "disabled": true
                        },
                        {
                          "key": "phonesOperator",
                          "value": "1",
                          "description": "Same as `phonesCity` (used when `phonesCity` is absent).",
                          "disabled": true
                        },
                        {
                          "key": "phonesType",
                          "value": "simple",
                          "description": "Number class.",
                          "disabled": true
                        },
                        {
                          "key": "tab",
                          "value": "urban",
                          "description": "Prefix owner type: `all` (default), `0800` — national (toll-free), `urban` — city, `mobiles` — mobile.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Catalogue of free numbers (the marketplace): only numbers that are not assigned to any company and not reserved\n(`reserved: false`) are returned. It does **not** return the numbers of your company — use `GET /companies/my` with\n`populate[phones]` or `GET /companies/phone/{id}` for that.\n\nStandard Strapi `filters`, `sort` and `populate` are ignored by this method; use the specific query parameters\nbelow. The response always includes `country_prefix`, `phone_prefix` (with `phone_prefix_owner`, its prices and\nlocalized names) and the per-number `prices`. `fullnumber` is the full number in E.164 without the leading plus\n(e.g. `380441234567`). The purchase itself is done through Orders.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get a number of my company",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/phones/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "phones",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "35",
                      "description": "Number id."
                    }
                  ]
                },
                "description": "Returns one number that belongs to the company of the current user. Numbers of other companies (and free\nmarketplace numbers) answer `404`. Relations are included only when requested via `populate`, e.g.\n`populate[0]=inSip&populate[1]=out_sip_lines&populate[2]=country_prefix&populate[3]=sip_trunk`.\n\nSpecial option `populate[balances]=true` adds the `balances` object with the remaining minutes of talk packets\nattached to the number, grouped by expiration date (empty object when the number has no packets).\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 The number.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "35",
                          "description": "Number id."
                        }
                      ]
                    },
                    "description": "Returns one number that belongs to the company of the current user. Numbers of other companies (and free\nmarketplace numbers) answer `404`. Relations are included only when requested via `populate`, e.g.\n`populate[0]=inSip&populate[1]=out_sip_lines&populate[2]=country_prefix&populate[3]=sip_trunk`.\n\nSpecial option `populate[balances]=true` adds the `balances` object with the remaining minutes of talk packets\nattached to the number, grouped by expiration date (empty object when the number has no packets).\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The number.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 35,\n    \"attributes\": {\n      \"number\": \"1234567\",\n      \"channels\": 4,\n      \"type\": \"exclusive\",\n      \"reserved\": false,\n      \"verificationRequired\": false,\n      \"verifiedAt\": null,\n      \"fullnumber\": \"380441234567\",\n      \"priority\": 5,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T10:00:00.000Z\",\n      \"country_prefix\": {\n        \"data\": {\n          \"id\": 1,\n          \"attributes\": {\n            \"country\": \"UA\",\n            \"iso\": \"UA\",\n            \"prefix\": \"380\",\n            \"isAvailable\": true,\n            \"outgoing_calls\": true,\n            \"incoming_calls\": true,\n            \"outgoing_sms\": false,\n            \"incoming_sms\": true\n          }\n        }\n      },\n      \"inSip\": {\n        \"data\": {\n          \"id\": 12,\n          \"attributes\": {\n            \"number\": \"010\",\n            \"password\": \"********\",\n            \"record_call\": true,\n            \"call_forwarding\": \"off\",\n            \"redirectActivity\": false,\n            \"redirectTo\": null\n          }\n        }\n      },\n      \"sip_trunk\": {\n        \"data\": null\n      },\n      \"balances\": {\n        \"2026-03-01T00:00:00Z\": [\n          {\n            \"side\": \"in\",\n            \"seconds_left\": 54000,\n            \"total\": 60000\n          },\n          {\n            \"side\": \"out\",\n            \"seconds_left\": 1200,\n            \"total\": 6000\n          }\n        ]\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "35",
                          "description": "Number id."
                        }
                      ]
                    },
                    "description": "Returns one number that belongs to the company of the current user. Numbers of other companies (and free\nmarketplace numbers) answer `404`. Relations are included only when requested via `populate`, e.g.\n`populate[0]=inSip&populate[1]=out_sip_lines&populate[2]=country_prefix&populate[3]=sip_trunk`.\n\nSpecial option `populate[balances]=true` adds the `balances` object with the remaining minutes of talk packets\nattached to the number, grouped by expiration date (empty object when the number has no packets).\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "35",
                          "description": "Number id."
                        }
                      ]
                    },
                    "description": "Returns one number that belongs to the company of the current user. Numbers of other companies (and free\nmarketplace numbers) answer `404`. Relations are included only when requested via `populate`, e.g.\n`populate[0]=inSip&populate[1]=out_sip_lines&populate[2]=country_prefix&populate[3]=sip_trunk`.\n\nSpecial option `populate[balances]=true` adds the `balances` object with the remaining minutes of talk packets\nattached to the number, grouped by expiration date (empty object when the number has no packets).\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "35",
                          "description": "Number id."
                        }
                      ]
                    },
                    "description": "Returns one number that belongs to the company of the current user. Numbers of other companies (and free\nmarketplace numbers) answer `404`. Relations are included only when requested via `populate`, e.g.\n`populate[0]=inSip&populate[1]=out_sip_lines&populate[2]=country_prefix&populate[3]=sip_trunk`.\n\nSpecial option `populate[balances]=true` adds the `balances` object with the remaining minutes of talk packets\nattached to the number, grouped by expiration date (empty object when the number has no packets).\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update number settings",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/phones/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "phones",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "35",
                      "description": "Number id."
                    }
                  ]
                },
                "description": "Standard Strapi update: `{ \"data\": { ... } }`. Intended for the routing settings of a number: incoming line\n(`inSip` — SIP line, `in_group` — call group, `in_ivr_line` — IVR; only one of them should be set), outgoing lines\n(`out_sip_lines`, `out_group_lines`, `out_ivr_lines` — many-to-many, pass `{ \"connect\": [...], \"disconnect\": [...] }`\nor a full array of ids), `priority` and `channels`. For the validated variants use `POST /phones/addInPhone` and\n`POST /phones/addOutPhone`.\n\nThe class `type`, `number`, `fullnumber`, `reserved`, `verificationRequired`, `verifiedAt` and `company` are managed by the\nplatform — do not send them. Changing `company` is treated as attaching/detaching the number and triggers tariff\nre-provisioning and internal notifications.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions call routing for the number in the telephony core (asynchronous job `kamailioPhoneLineAssign`); if the number is connected via a SIP trunk, the trunk registration is re-created. Changing `company` additionally changes tariff plans and sends an internal notification.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"inSip\": 12,\n    \"out_sip_lines\": {\n      \"connect\": [\n        12,\n        13\n      ],\n      \"disconnect\": []\n    },\n    \"priority\": 1\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated number.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "35",
                          "description": "Number id."
                        }
                      ]
                    },
                    "description": "Standard Strapi update: `{ \"data\": { ... } }`. Intended for the routing settings of a number: incoming line\n(`inSip` — SIP line, `in_group` — call group, `in_ivr_line` — IVR; only one of them should be set), outgoing lines\n(`out_sip_lines`, `out_group_lines`, `out_ivr_lines` — many-to-many, pass `{ \"connect\": [...], \"disconnect\": [...] }`\nor a full array of ids), `priority` and `channels`. For the validated variants use `POST /phones/addInPhone` and\n`POST /phones/addOutPhone`.\n\nThe class `type`, `number`, `fullnumber`, `reserved`, `verificationRequired`, `verifiedAt` and `company` are managed by the\nplatform — do not send them. Changing `company` is treated as attaching/detaching the number and triggers tariff\nre-provisioning and internal notifications.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions call routing for the number in the telephony core (asynchronous job `kamailioPhoneLineAssign`); if the number is connected via a SIP trunk, the trunk registration is re-created. Changing `company` additionally changes tariff plans and sends an internal notification.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"inSip\": 12,\n    \"out_sip_lines\": {\n      \"connect\": [\n        12,\n        13\n      ],\n      \"disconnect\": []\n    },\n    \"priority\": 1\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated number.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 35,\n    \"attributes\": {\n      \"number\": \"1234567\",\n      \"channels\": 4,\n      \"type\": \"exclusive\",\n      \"reserved\": false,\n      \"verificationRequired\": false,\n      \"verifiedAt\": null,\n      \"fullnumber\": \"380441234567\",\n      \"priority\": 1,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Missing `data` envelope.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "35",
                          "description": "Number id."
                        }
                      ]
                    },
                    "description": "Standard Strapi update: `{ \"data\": { ... } }`. Intended for the routing settings of a number: incoming line\n(`inSip` — SIP line, `in_group` — call group, `in_ivr_line` — IVR; only one of them should be set), outgoing lines\n(`out_sip_lines`, `out_group_lines`, `out_ivr_lines` — many-to-many, pass `{ \"connect\": [...], \"disconnect\": [...] }`\nor a full array of ids), `priority` and `channels`. For the validated variants use `POST /phones/addInPhone` and\n`POST /phones/addOutPhone`.\n\nThe class `type`, `number`, `fullnumber`, `reserved`, `verificationRequired`, `verifiedAt` and `company` are managed by the\nplatform — do not send them. Changing `company` is treated as attaching/detaching the number and triggers tariff\nre-provisioning and internal notifications.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions call routing for the number in the telephony core (asynchronous job `kamailioPhoneLineAssign`); if the number is connected via a SIP trunk, the trunk registration is re-created. Changing `company` additionally changes tariff plans and sends an internal notification.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"inSip\": 12,\n    \"out_sip_lines\": {\n      \"connect\": [\n        12,\n        13\n      ],\n      \"disconnect\": []\n    },\n    \"priority\": 1\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing `data` envelope.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Missing \\\"data\\\" payload in the request body\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "35",
                          "description": "Number id."
                        }
                      ]
                    },
                    "description": "Standard Strapi update: `{ \"data\": { ... } }`. Intended for the routing settings of a number: incoming line\n(`inSip` — SIP line, `in_group` — call group, `in_ivr_line` — IVR; only one of them should be set), outgoing lines\n(`out_sip_lines`, `out_group_lines`, `out_ivr_lines` — many-to-many, pass `{ \"connect\": [...], \"disconnect\": [...] }`\nor a full array of ids), `priority` and `channels`. For the validated variants use `POST /phones/addInPhone` and\n`POST /phones/addOutPhone`.\n\nThe class `type`, `number`, `fullnumber`, `reserved`, `verificationRequired`, `verifiedAt` and `company` are managed by the\nplatform — do not send them. Changing `company` is treated as attaching/detaching the number and triggers tariff\nre-provisioning and internal notifications.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions call routing for the number in the telephony core (asynchronous job `kamailioPhoneLineAssign`); if the number is connected via a SIP trunk, the trunk registration is re-created. Changing `company` additionally changes tariff plans and sends an internal notification.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"inSip\": 12,\n    \"out_sip_lines\": {\n      \"connect\": [\n        12,\n        13\n      ],\n      \"disconnect\": []\n    },\n    \"priority\": 1\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "35",
                          "description": "Number id."
                        }
                      ]
                    },
                    "description": "Standard Strapi update: `{ \"data\": { ... } }`. Intended for the routing settings of a number: incoming line\n(`inSip` — SIP line, `in_group` — call group, `in_ivr_line` — IVR; only one of them should be set), outgoing lines\n(`out_sip_lines`, `out_group_lines`, `out_ivr_lines` — many-to-many, pass `{ \"connect\": [...], \"disconnect\": [...] }`\nor a full array of ids), `priority` and `channels`. For the validated variants use `POST /phones/addInPhone` and\n`POST /phones/addOutPhone`.\n\nThe class `type`, `number`, `fullnumber`, `reserved`, `verificationRequired`, `verifiedAt` and `company` are managed by the\nplatform — do not send them. Changing `company` is treated as attaching/detaching the number and triggers tariff\nre-provisioning and internal notifications.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions call routing for the number in the telephony core (asynchronous job `kamailioPhoneLineAssign`); if the number is connected via a SIP trunk, the trunk registration is re-created. Changing `company` additionally changes tariff plans and sends an internal notification.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"inSip\": 12,\n    \"out_sip_lines\": {\n      \"connect\": [\n        12,\n        13\n      ],\n      \"disconnect\": []\n    },\n    \"priority\": 1\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "35",
                          "description": "Number id."
                        }
                      ]
                    },
                    "description": "Standard Strapi update: `{ \"data\": { ... } }`. Intended for the routing settings of a number: incoming line\n(`inSip` — SIP line, `in_group` — call group, `in_ivr_line` — IVR; only one of them should be set), outgoing lines\n(`out_sip_lines`, `out_group_lines`, `out_ivr_lines` — many-to-many, pass `{ \"connect\": [...], \"disconnect\": [...] }`\nor a full array of ids), `priority` and `channels`. For the validated variants use `POST /phones/addInPhone` and\n`POST /phones/addOutPhone`.\n\nThe class `type`, `number`, `fullnumber`, `reserved`, `verificationRequired`, `verifiedAt` and `company` are managed by the\nplatform — do not send them. Changing `company` is treated as attaching/detaching the number and triggers tariff\nre-provisioning and internal notifications.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions call routing for the number in the telephony core (asynchronous job `kamailioPhoneLineAssign`); if the number is connected via a SIP trunk, the trunk registration is re-created. Changing `company` additionally changes tariff plans and sends an internal notification.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"inSip\": 12,\n    \"out_sip_lines\": {\n      \"connect\": [\n        12,\n        13\n      ],\n      \"disconnect\": []\n    },\n    \"priority\": 1\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Set the incoming line of a number",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/phones/addInPhone",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "phones",
                    "addInPhone"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Assigns where incoming calls to the number go: a SIP line (`sip` → `inSip`), a call group (`group` → `in_group`)\nor an IVR (`ivr` → `in_ivr_line`). Setting `sip` clears `in_group` and vice versa; setting `ivr` clears\n`out_ivr_lines`. The number must belong to your company. If the number already has an incoming line, the request\nmust `disconnect` it (its id must be present in `data[1].disconnect`), otherwise `Phone line already in use!`.\n\nBody: `phone` — number id, `data` — a 2-element array `[kind, relation]` where `relation` is a Strapi relation\npayload `{ \"connect\": [id], \"disconnect\": [id] }`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions call routing for the number in the telephony core (asynchronous job).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": 35,\n  \"data\": [\n    \"sip\",\n    {\n      \"connect\": [\n        12\n      ],\n      \"disconnect\": [\n        11\n      ]\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated number (flat object) with `inSip` (with `user`) and `in_group` populated.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/addInPhone",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "addInPhone"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Assigns where incoming calls to the number go: a SIP line (`sip` → `inSip`), a call group (`group` → `in_group`)\nor an IVR (`ivr` → `in_ivr_line`). Setting `sip` clears `in_group` and vice versa; setting `ivr` clears\n`out_ivr_lines`. The number must belong to your company. If the number already has an incoming line, the request\nmust `disconnect` it (its id must be present in `data[1].disconnect`), otherwise `Phone line already in use!`.\n\nBody: `phone` — number id, `data` — a 2-element array `[kind, relation]` where `relation` is a Strapi relation\npayload `{ \"connect\": [id], \"disconnect\": [id] }`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions call routing for the number in the telephony core (asynchronous job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": 35,\n  \"data\": [\n    \"sip\",\n    {\n      \"connect\": [\n        12\n      ],\n      \"disconnect\": [\n        11\n      ]\n    }\n  ]\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated number (flat object) with `inSip` (with `user`) and `in_group` populated.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 35,\n  \"number\": \"1234567\",\n  \"channels\": 4,\n  \"type\": \"exclusive\",\n  \"reserved\": false,\n  \"verificationRequired\": false,\n  \"verifiedAt\": null,\n  \"fullnumber\": \"380441234567\",\n  \"priority\": 5,\n  \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n  \"updatedAt\": \"2026-02-01T10:00:00.000Z\",\n  \"inSip\": {\n    \"id\": 12,\n    \"number\": \"010\",\n    \"password\": \"********\",\n    \"record_call\": true,\n    \"call_forwarding\": \"off\",\n    \"user\": {\n      \"id\": 7,\n      \"username\": \"John Doe\",\n      \"email\": \"john@example.com\"\n    }\n  },\n  \"in_group\": null\n}"
                },
                {
                  "name": "400 Validation error. Messages: `Fields: \\`data\\`, \\`phone\\` must be defined!`, `Data length must be 2!`, `Phones id\\`s not valid!` (number is not in your company), `Phone line already in use!`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/addInPhone",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "addInPhone"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Assigns where incoming calls to the number go: a SIP line (`sip` → `inSip`), a call group (`group` → `in_group`)\nor an IVR (`ivr` → `in_ivr_line`). Setting `sip` clears `in_group` and vice versa; setting `ivr` clears\n`out_ivr_lines`. The number must belong to your company. If the number already has an incoming line, the request\nmust `disconnect` it (its id must be present in `data[1].disconnect`), otherwise `Phone line already in use!`.\n\nBody: `phone` — number id, `data` — a 2-element array `[kind, relation]` where `relation` is a Strapi relation\npayload `{ \"connect\": [id], \"disconnect\": [id] }`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions call routing for the number in the telephony core (asynchronous job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": 35,\n  \"data\": [\n    \"sip\",\n    {\n      \"connect\": [\n        12\n      ],\n      \"disconnect\": [\n        11\n      ]\n    }\n  ]\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error. Messages: `Fields: \\`data\\`, \\`phone\\` must be defined!`, `Data length must be 2!`, `Phones id\\`s not valid!` (number is not in your company), `Phone line already in use!`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"Phone line already in use!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/addInPhone",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "addInPhone"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Assigns where incoming calls to the number go: a SIP line (`sip` → `inSip`), a call group (`group` → `in_group`)\nor an IVR (`ivr` → `in_ivr_line`). Setting `sip` clears `in_group` and vice versa; setting `ivr` clears\n`out_ivr_lines`. The number must belong to your company. If the number already has an incoming line, the request\nmust `disconnect` it (its id must be present in `data[1].disconnect`), otherwise `Phone line already in use!`.\n\nBody: `phone` — number id, `data` — a 2-element array `[kind, relation]` where `relation` is a Strapi relation\npayload `{ \"connect\": [id], \"disconnect\": [id] }`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions call routing for the number in the telephony core (asynchronous job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": 35,\n  \"data\": [\n    \"sip\",\n    {\n      \"connect\": [\n        12\n      ],\n      \"disconnect\": [\n        11\n      ]\n    }\n  ]\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/addInPhone",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "addInPhone"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Assigns where incoming calls to the number go: a SIP line (`sip` → `inSip`), a call group (`group` → `in_group`)\nor an IVR (`ivr` → `in_ivr_line`). Setting `sip` clears `in_group` and vice versa; setting `ivr` clears\n`out_ivr_lines`. The number must belong to your company. If the number already has an incoming line, the request\nmust `disconnect` it (its id must be present in `data[1].disconnect`), otherwise `Phone line already in use!`.\n\nBody: `phone` — number id, `data` — a 2-element array `[kind, relation]` where `relation` is a Strapi relation\npayload `{ \"connect\": [id], \"disconnect\": [id] }`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions call routing for the number in the telephony core (asynchronous job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": 35,\n  \"data\": [\n    \"sip\",\n    {\n      \"connect\": [\n        12\n      ],\n      \"disconnect\": [\n        11\n      ]\n    }\n  ]\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Attach outgoing lines to a number",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/phones/addOutPhone",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "phones",
                    "addOutPhone"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Sets which SIP lines (`sip` → `out_sip_lines`), call groups (`group` → `out_group_lines`) or IVR menus\n(`ivr` → `out_ivr_lines`) use this number as the caller id for outgoing calls. The number must belong to your\ncompany. Body format is the same as for `POST /phones/addInPhone`: `data = [kind, { connect, disconnect }]`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions call routing for the number in the telephony core (asynchronous job).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": 35,\n  \"data\": [\n    \"sip\",\n    {\n      \"connect\": [\n        12,\n        13\n      ],\n      \"disconnect\": []\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated number (flat object) with `out_sip_lines` (with `user`) and `out_group_lines` populated.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/addOutPhone",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "addOutPhone"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Sets which SIP lines (`sip` → `out_sip_lines`), call groups (`group` → `out_group_lines`) or IVR menus\n(`ivr` → `out_ivr_lines`) use this number as the caller id for outgoing calls. The number must belong to your\ncompany. Body format is the same as for `POST /phones/addInPhone`: `data = [kind, { connect, disconnect }]`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions call routing for the number in the telephony core (asynchronous job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": 35,\n  \"data\": [\n    \"sip\",\n    {\n      \"connect\": [\n        12,\n        13\n      ],\n      \"disconnect\": []\n    }\n  ]\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated number (flat object) with `out_sip_lines` (with `user`) and `out_group_lines` populated.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 35,\n  \"number\": \"1234567\",\n  \"channels\": 4,\n  \"type\": \"exclusive\",\n  \"reserved\": false,\n  \"verificationRequired\": false,\n  \"verifiedAt\": null,\n  \"fullnumber\": \"380441234567\",\n  \"priority\": 5,\n  \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n  \"updatedAt\": \"2026-02-01T10:00:00.000Z\",\n  \"out_sip_lines\": [\n    {\n      \"id\": 12,\n      \"number\": \"010\",\n      \"password\": \"********\",\n      \"record_call\": true,\n      \"call_forwarding\": \"off\",\n      \"user\": {\n        \"id\": 7,\n        \"username\": \"John Doe\",\n        \"email\": \"john@example.com\"\n      }\n    }\n  ],\n  \"out_group_lines\": []\n}"
                },
                {
                  "name": "400 Validation error. Messages: `Fields: \\`data\\`, \\`phone\\` must be defined!`, `Data length must be 2!`, `Phones id\\`s not valid!`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/addOutPhone",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "addOutPhone"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Sets which SIP lines (`sip` → `out_sip_lines`), call groups (`group` → `out_group_lines`) or IVR menus\n(`ivr` → `out_ivr_lines`) use this number as the caller id for outgoing calls. The number must belong to your\ncompany. Body format is the same as for `POST /phones/addInPhone`: `data = [kind, { connect, disconnect }]`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions call routing for the number in the telephony core (asynchronous job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": 35,\n  \"data\": [\n    \"sip\",\n    {\n      \"connect\": [\n        12,\n        13\n      ],\n      \"disconnect\": []\n    }\n  ]\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error. Messages: `Fields: \\`data\\`, \\`phone\\` must be defined!`, `Data length must be 2!`, `Phones id\\`s not valid!`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Phones id`s not valid!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/addOutPhone",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "addOutPhone"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Sets which SIP lines (`sip` → `out_sip_lines`), call groups (`group` → `out_group_lines`) or IVR menus\n(`ivr` → `out_ivr_lines`) use this number as the caller id for outgoing calls. The number must belong to your\ncompany. Body format is the same as for `POST /phones/addInPhone`: `data = [kind, { connect, disconnect }]`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions call routing for the number in the telephony core (asynchronous job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": 35,\n  \"data\": [\n    \"sip\",\n    {\n      \"connect\": [\n        12,\n        13\n      ],\n      \"disconnect\": []\n    }\n  ]\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/addOutPhone",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "addOutPhone"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Sets which SIP lines (`sip` → `out_sip_lines`), call groups (`group` → `out_group_lines`) or IVR menus\n(`ivr` → `out_ivr_lines`) use this number as the caller id for outgoing calls. The number must belong to your\ncompany. Body format is the same as for `POST /phones/addInPhone`: `data = [kind, { connect, disconnect }]`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions call routing for the number in the telephony core (asynchronous job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": 35,\n  \"data\": [\n    \"sip\",\n    {\n      \"connect\": [\n        12,\n        13\n      ],\n      \"disconnect\": []\n    }\n  ]\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Count free numbers by class",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/phones/countByTypes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "phones",
                    "countByTypes"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns how many free (unassigned, not reserved) numbers of each class have a price in the currency of your\ncompany. Useful for marketplace tabs. The body is optional; any Strapi query (e.g. `filters`) passed in it is\nmerged into the search, e.g. `{ \"filters\": { \"phone_prefix\": { \"phone_prefix_owner\": 1 } } }`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"filters\": {\n    \"phone_prefix\": {\n      \"phone_prefix_owner\": 1\n    }\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Counts per class.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/countByTypes",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "countByTypes"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns how many free (unassigned, not reserved) numbers of each class have a price in the currency of your\ncompany. Useful for marketplace tabs. The body is optional; any Strapi query (e.g. `filters`) passed in it is\nmerged into the search, e.g. `{ \"filters\": { \"phone_prefix\": { \"phone_prefix_owner\": 1 } } }`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"filters\": {\n    \"phone_prefix\": {\n      \"phone_prefix_owner\": 1\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Counts per class.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"simple\": 120,\n  \"bronze\": 30,\n  \"silver\": 12,\n  \"golden\": 5,\n  \"platinum\": 2,\n  \"exclusive\": 1\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/countByTypes",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "countByTypes"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns how many free (unassigned, not reserved) numbers of each class have a price in the currency of your\ncompany. Useful for marketplace tabs. The body is optional; any Strapi query (e.g. `filters`) passed in it is\nmerged into the search, e.g. `{ \"filters\": { \"phone_prefix\": { \"phone_prefix_owner\": 1 } } }`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"filters\": {\n    \"phone_prefix\": {\n      \"phone_prefix_owner\": 1\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/countByTypes",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "countByTypes"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns how many free (unassigned, not reserved) numbers of each class have a price in the currency of your\ncompany. Useful for marketplace tabs. The body is optional; any Strapi query (e.g. `filters`) passed in it is\nmerged into the search, e.g. `{ \"filters\": { \"phone_prefix\": { \"phone_prefix_owner\": 1 } } }`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"filters\": {\n    \"phone_prefix\": {\n      \"phone_prefix_owner\": 1\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Check whether a number may take another call",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/phones/line-restrictions/:phone",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "phones",
                    "line-restrictions",
                    ":phone"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "phone",
                      "value": "380441234567",
                      "description": "Number in E.164 without plus."
                    }
                  ]
                },
                "description": "Service endpoint used by the telephony core: compares the number of active dialogs on the number with its\n`channels` limit and answers whether one more call is allowed. `phone` is the number as dialled (E.164 without\nplus, e.g. `380441234567`); the value `0` and internal SIP usernames always get `can_call: \"true\"`.\nValues are strings, not booleans. No token required.\n\n\n**Required role:** Public, Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Decision.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/line-restrictions/:phone",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "line-restrictions",
                        ":phone"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone",
                          "value": "380441234567",
                          "description": "Number in E.164 without plus."
                        }
                      ]
                    },
                    "description": "Service endpoint used by the telephony core: compares the number of active dialogs on the number with its\n`channels` limit and answers whether one more call is allowed. `phone` is the number as dialled (E.164 without\nplus, e.g. `380441234567`); the value `0` and internal SIP usernames always get `can_call: \"true\"`.\nValues are strings, not booleans. No token required.\n\n\n**Required role:** Public, Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Decision.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"can_call\": \"true\"\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/line-restrictions/:phone",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "line-restrictions",
                        ":phone"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone",
                          "value": "380441234567",
                          "description": "Number in E.164 without plus."
                        }
                      ]
                    },
                    "description": "Service endpoint used by the telephony core: compares the number of active dialogs on the number with its\n`channels` limit and answers whether one more call is allowed. `phone` is the number as dialled (E.164 without\nplus, e.g. `380441234567`); the value `0` and internal SIP usernames always get `can_call: \"true\"`.\nValues are strings, not booleans. No token required.\n\n\n**Required role:** Public, Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phones/line-restrictions/:phone",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phones",
                        "line-restrictions",
                        ":phone"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone",
                          "value": "380441234567",
                          "description": "Number in E.164 without plus."
                        }
                      ]
                    },
                    "description": "Service endpoint used by the telephony core: compares the number of active dialogs on the number with its\n`channels` limit and answers whether one more call is allowed. `phone` is the number as dialled (E.164 without\nplus, e.g. `380441234567`); the value `0` and internal SIP usernames always get `can_call: \"true\"`.\nValues are strings, not booleans. No token required.\n\n\n**Required role:** Public, Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Number prefixes catalogue",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/phone-prefixes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "phone-prefixes"
                  ],
                  "query": [
                    {
                      "key": "priceSort",
                      "value": "price:asc",
                      "description": "Sort by a price field: `price:asc|desc` or `setup_price:asc|desc`. Requires `priceSortCurrency`; replaces `sort`.",
                      "disabled": true
                    },
                    {
                      "key": "priceSortCurrency",
                      "value": "3",
                      "description": "Currency id whose price is used for `priceSort`.",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Standard Strapi list of number prefixes (city/operator codes) with prices and talk packets. Public, no token\nneeded. Each prefix belongs to a `phone_prefix_owner` (city, operator, national 0800 range...) which in turn\nbelongs to a `country_prefix`. Prices are in `prices[].price_by_field`: `price` — monthly fee, `setup_price` —\nconnection fee, `phone_channel_price` — extra channel, `sms_incoming_price`/`sms_outgoing_price` — SMS; one\n`prices` entry per currency. `validation: true` means the regulator requires identity verification before a\nnumber from this prefix can be used (see `GET /didww-verifications/requirements`).\n\nUseful: `populate[phone_prefix_owner][populate][0]=country_prefix&populate[phone_prefix_owner][populate][1]=names`,\n`populate[prices][populate]=*`, `populate[talk_packets][populate]=*`,\n`filters[phone_prefix_owner][country_prefix][iso][$eq]=UA`, `filters[prefix][$startsWith]=44`.\nExtra sort by price: `priceSort=price:asc` or `setup_price:desc` together with `priceSortCurrency=<currency id>`\n(prefixes without a price in that currency go last).\n\n\n**Required role:** Public, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of prefixes.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phone-prefixes",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phone-prefixes"
                      ],
                      "query": [
                        {
                          "key": "priceSort",
                          "value": "price:asc",
                          "description": "Sort by a price field: `price:asc|desc` or `setup_price:asc|desc`. Requires `priceSortCurrency`; replaces `sort`.",
                          "disabled": true
                        },
                        {
                          "key": "priceSortCurrency",
                          "value": "3",
                          "description": "Currency id whose price is used for `priceSort`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Standard Strapi list of number prefixes (city/operator codes) with prices and talk packets. Public, no token\nneeded. Each prefix belongs to a `phone_prefix_owner` (city, operator, national 0800 range...) which in turn\nbelongs to a `country_prefix`. Prices are in `prices[].price_by_field`: `price` — monthly fee, `setup_price` —\nconnection fee, `phone_channel_price` — extra channel, `sms_incoming_price`/`sms_outgoing_price` — SMS; one\n`prices` entry per currency. `validation: true` means the regulator requires identity verification before a\nnumber from this prefix can be used (see `GET /didww-verifications/requirements`).\n\nUseful: `populate[phone_prefix_owner][populate][0]=country_prefix&populate[phone_prefix_owner][populate][1]=names`,\n`populate[prices][populate]=*`, `populate[talk_packets][populate]=*`,\n`filters[phone_prefix_owner][country_prefix][iso][$eq]=UA`, `filters[prefix][$startsWith]=44`.\nExtra sort by price: `priceSort=price:asc` or `setup_price:desc` together with `priceSortCurrency=<currency id>`\n(prefixes without a price in that currency go last).\n\n\n**Required role:** Public, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Page of prefixes.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 9,\n      \"attributes\": {\n        \"prefix\": \"44\",\n        \"capacity\": null,\n        \"validation\": false,\n        \"call\": \"INT\",\n        \"incoming_sms\": false,\n        \"outgoing_sms\": false,\n        \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n        \"updatedAt\": \"2026-01-15T10:00:00.000Z\",\n        \"phone_prefix_owner\": {\n          \"data\": {\n            \"id\": 1,\n            \"attributes\": {\n              \"owner\": \"м. Київ\",\n              \"type\": \"city\",\n              \"available_call_directions\": \"both\",\n              \"country_prefix\": {\n                \"data\": {\n                  \"id\": 1,\n                  \"attributes\": {\n                    \"country\": \"UA\",\n                    \"iso\": \"UA\",\n                    \"prefix\": \"380\",\n                    \"isAvailable\": true,\n                    \"outgoing_calls\": true,\n                    \"incoming_calls\": true,\n                    \"outgoing_sms\": false,\n                    \"incoming_sms\": true\n                  }\n                }\n              },\n              \"names\": [\n                {\n                  \"id\": 1,\n                  \"locales\": \"uk-UA\",\n                  \"name\": \"м. Київ\"\n                },\n                {\n                  \"id\": 2,\n                  \"locales\": \"en\",\n                  \"name\": \"Kyiv\"\n                }\n              ]\n            }\n          }\n        },\n        \"prices\": {\n          \"data\": [\n            {\n              \"id\": 501,\n              \"attributes\": {\n                \"description\": \"Virtual numbers price\",\n                \"currency\": {\n                  \"data\": {\n                    \"id\": 3,\n                    \"attributes\": {\n                      \"name_short\": \"UAH\",\n                      \"name_long\": \"Гривня\",\n                      \"symbol\": \"₴\",\n                      \"prefix\": \"\",\n                      \"suffix\": \"\"\n                    }\n                  }\n                },\n                \"price_by_field\": [\n                  {\n                    \"id\": 1,\n                    \"name\": \"price\",\n                    \"price\": 229,\n                    \"isPriceStatic\": false\n                  },\n                  {\n                    \"id\": 2,\n                    \"name\": \"setup_price\",\n                    \"price\": 229,\n                    \"isPriceStatic\": false\n                  }\n                ]\n              }\n            }\n          ]\n        },\n        \"talk_packets\": {\n          \"data\": [\n            {\n              \"id\": 3,\n              \"attributes\": {\n                \"type\": \"small\",\n                \"incomming_seconds_included\": \"60000\",\n                \"outgoing_seconds_included\": \"6000\",\n                \"prices\": {\n                  \"data\": [\n                    {\n                      \"id\": 77,\n                      \"attributes\": {\n                        \"currency\": {\n                          \"data\": {\n                            \"id\": 3,\n                            \"attributes\": {\n                              \"name_short\": \"UAH\",\n                              \"name_long\": \"Гривня\",\n                              \"symbol\": \"₴\"\n                            }\n                          }\n                        },\n                        \"price_by_field\": [\n                          {\n                            \"id\": 9,\n                            \"name\": \"price\",\n                            \"price\": 150,\n                            \"isPriceStatic\": false\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                }\n              }\n            }\n          ]\n        },\n        \"validation_fileds\": []\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 230,\n      \"total\": 5742\n    }\n  }\n}"
                },
                {
                  "name": "400 Validation error or malformed request.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phone-prefixes",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phone-prefixes"
                      ],
                      "query": [
                        {
                          "key": "priceSort",
                          "value": "price:asc",
                          "description": "Sort by a price field: `price:asc|desc` or `setup_price:asc|desc`. Requires `priceSortCurrency`; replaces `sort`.",
                          "disabled": true
                        },
                        {
                          "key": "priceSortCurrency",
                          "value": "3",
                          "description": "Currency id whose price is used for `priceSort`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Standard Strapi list of number prefixes (city/operator codes) with prices and talk packets. Public, no token\nneeded. Each prefix belongs to a `phone_prefix_owner` (city, operator, national 0800 range...) which in turn\nbelongs to a `country_prefix`. Prices are in `prices[].price_by_field`: `price` — monthly fee, `setup_price` —\nconnection fee, `phone_channel_price` — extra channel, `sms_incoming_price`/`sms_outgoing_price` — SMS; one\n`prices` entry per currency. `validation: true` means the regulator requires identity verification before a\nnumber from this prefix can be used (see `GET /didww-verifications/requirements`).\n\nUseful: `populate[phone_prefix_owner][populate][0]=country_prefix&populate[phone_prefix_owner][populate][1]=names`,\n`populate[prices][populate]=*`, `populate[talk_packets][populate]=*`,\n`filters[phone_prefix_owner][country_prefix][iso][$eq]=UA`, `filters[prefix][$startsWith]=44`.\nExtra sort by price: `priceSort=price:asc` or `setup_price:desc` together with `priceSortCurrency=<currency id>`\n(prefixes without a price in that currency go last).\n\n\n**Required role:** Public, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Validation error or malformed request.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"email must be a valid email\",\n    \"details\": {\n      \"errors\": [\n        {\n          \"path\": [\n            \"email\"\n          ],\n          \"message\": \"email must be a valid email\",\n          \"name\": \"ValidationError\"\n        }\n      ]\n    }\n  }\n}"
                }
              ]
            },
            {
              "name": "Get a number prefix",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/phone-prefixes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "phone-prefixes",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "9",
                      "description": "Prefix id."
                    }
                  ]
                },
                "description": "One prefix by id. Public. Use `populate` to include the owner, country, prices and talk packets (see list method).\n\n**Required role:** Public, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 The prefix.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phone-prefixes/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phone-prefixes",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "9",
                          "description": "Prefix id."
                        }
                      ]
                    },
                    "description": "One prefix by id. Public. Use `populate` to include the owner, country, prices and talk packets (see list method).\n\n**Required role:** Public, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The prefix.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 9,\n    \"attributes\": {\n      \"prefix\": \"44\",\n      \"capacity\": null,\n      \"validation\": false,\n      \"call\": \"INT\",\n      \"incoming_sms\": false,\n      \"outgoing_sms\": false,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/phone-prefixes/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "phone-prefixes",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "9",
                          "description": "Prefix id."
                        }
                      ]
                    },
                    "description": "One prefix by id. Public. Use `populate` to include the owner, country, prices and talk packets (see list method).\n\n**Required role:** Public, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Countries and dialling codes",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/country-prefixes",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "country-prefixes"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Standard Strapi list of countries supported by the platform with their dialling codes and capabilities\n(`isAvailable` — numbers can be bought, `outgoing_calls`, `incoming_calls`, `outgoing_sms`, `incoming_sms`).\nPublic. Useful: `filters[isAvailable][$eq]=true`, `sort=country:asc`, `populate[phone_prefix_owners]=*`.\n\n\n**Required role:** Public, Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of countries.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/country-prefixes",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "country-prefixes"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Standard Strapi list of countries supported by the platform with their dialling codes and capabilities\n(`isAvailable` — numbers can be bought, `outgoing_calls`, `incoming_calls`, `outgoing_sms`, `incoming_sms`).\nPublic. Useful: `filters[isAvailable][$eq]=true`, `sort=country:asc`, `populate[phone_prefix_owners]=*`.\n\n\n**Required role:** Public, Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Page of countries.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 1,\n      \"attributes\": {\n        \"country\": \"UA\",\n        \"iso\": \"UA\",\n        \"prefix\": \"380\",\n        \"isAvailable\": true,\n        \"outgoing_calls\": true,\n        \"incoming_calls\": true,\n        \"outgoing_sms\": false,\n        \"incoming_sms\": true,\n        \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n        \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 4,\n      \"total\": 96\n    }\n  }\n}"
                },
                {
                  "name": "400 Validation error or malformed request.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/country-prefixes",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "country-prefixes"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Standard Strapi list of countries supported by the platform with their dialling codes and capabilities\n(`isAvailable` — numbers can be bought, `outgoing_calls`, `incoming_calls`, `outgoing_sms`, `incoming_sms`).\nPublic. Useful: `filters[isAvailable][$eq]=true`, `sort=country:asc`, `populate[phone_prefix_owners]=*`.\n\n\n**Required role:** Public, Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Validation error or malformed request.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"email must be a valid email\",\n    \"details\": {\n      \"errors\": [\n        {\n          \"path\": [\n            \"email\"\n          ],\n          \"message\": \"email must be a valid email\",\n          \"name\": \"ValidationError\"\n        }\n      ]\n    }\n  }\n}"
                }
              ]
            },
            {
              "name": "Get a country",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/country-prefixes/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "country-prefixes",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "1",
                      "description": "Country id."
                    }
                  ]
                },
                "description": "One country by id. Public.\n\n**Required role:** Public, Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 The country.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/country-prefixes/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "country-prefixes",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1",
                          "description": "Country id."
                        }
                      ]
                    },
                    "description": "One country by id. Public.\n\n**Required role:** Public, Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The country.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 1,\n    \"attributes\": {\n      \"country\": \"UA\",\n      \"iso\": \"UA\",\n      \"prefix\": \"380\",\n      \"isAvailable\": true,\n      \"outgoing_calls\": true,\n      \"incoming_calls\": true,\n      \"outgoing_sms\": false,\n      \"incoming_sms\": true,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/country-prefixes/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "country-prefixes",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1",
                          "description": "Country id."
                        }
                      ]
                    },
                    "description": "One country by id. Public.\n\n**Required role:** Public, Company owner (approved), Company owner (registered, not yet approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get a number of my company (flat form)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/companies/phone/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "companies",
                    "phone",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "35",
                      "description": "Number id."
                    }
                  ]
                },
                "description": "Returns one number of the current user's company. Unlike `GET /phones/{id}`, populated relations are returned as\nplain objects/arrays (without the `data`/`attributes` wrapper). `populate` works, e.g.\n`populate[0]=country_prefix&populate[1]=inSip&populate[2]=out_sip_lines`. Numbers of other companies answer with\n`data: null`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 The number, or `data: null` if it is not in your company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/phone/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "phone",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "35",
                          "description": "Number id."
                        }
                      ]
                    },
                    "description": "Returns one number of the current user's company. Unlike `GET /phones/{id}`, populated relations are returned as\nplain objects/arrays (without the `data`/`attributes` wrapper). `populate` works, e.g.\n`populate[0]=country_prefix&populate[1]=inSip&populate[2]=out_sip_lines`. Numbers of other companies answer with\n`data: null`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The number, or `data: null` if it is not in your company.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 35,\n    \"attributes\": {\n      \"number\": \"1234567\",\n      \"channels\": 4,\n      \"type\": \"exclusive\",\n      \"reserved\": false,\n      \"verificationRequired\": false,\n      \"verifiedAt\": null,\n      \"fullnumber\": \"380441234567\",\n      \"priority\": 5,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T10:00:00.000Z\",\n      \"country_prefix\": {\n        \"id\": 1,\n        \"country\": \"UA\",\n        \"iso\": \"UA\",\n        \"prefix\": \"380\",\n        \"isAvailable\": true,\n        \"outgoing_calls\": true,\n        \"incoming_calls\": true,\n        \"outgoing_sms\": false,\n        \"incoming_sms\": true\n      },\n      \"inSip\": {\n        \"id\": 12,\n        \"number\": \"010\",\n        \"password\": \"********\",\n        \"record_call\": true,\n        \"call_forwarding\": \"off\",\n        \"redirectActivity\": false,\n        \"redirectTo\": null\n      },\n      \"out_sip_lines\": [\n        {\n          \"id\": 13,\n          \"number\": \"011\",\n          \"password\": \"********\",\n          \"record_call\": true,\n          \"call_forwarding\": \"off\",\n          \"redirectActivity\": null,\n          \"redirectTo\": null\n        }\n      ]\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/phone/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "phone",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "35",
                          "description": "Number id."
                        }
                      ]
                    },
                    "description": "Returns one number of the current user's company. Unlike `GET /phones/{id}`, populated relations are returned as\nplain objects/arrays (without the `data`/`attributes` wrapper). `populate` works, e.g.\n`populate[0]=country_prefix&populate[1]=inSip&populate[2]=out_sip_lines`. Numbers of other companies answer with\n`data: null`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/phone/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "phone",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "35",
                          "description": "Number id."
                        }
                      ]
                    },
                    "description": "Returns one number of the current user's company. Unlike `GET /phones/{id}`, populated relations are returned as\nplain objects/arrays (without the `data`/`attributes` wrapper). `populate` works, e.g.\n`populate[0]=country_prefix&populate[1]=inSip&populate[2]=out_sip_lines`. Numbers of other companies answer with\n`data: null`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "International numbers: summary by country",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-catalog/public/numbers/countries",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-catalog",
                    "public",
                    "numbers",
                    "countries"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Public price list of international virtual numbers (DIDWW catalogue): for every country — number of available\nprefix groups, number types, monthly price range (USD), whether numbers are in stock and whether owner\nverification is required (`none` — buy immediately, `all` — documents required everywhere, `partial` — both).\nPrices are the platform's selling prices; the connection fee is already included in the monthly price\n(`setup_from` is always 0). Data is refreshed on catalogue sync (`updatedAt`), responses are cached for 5 minutes\n(`Cache-Control: public, max-age=300`). No token required; limit 120 requests per minute per IP.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Summary by country.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-catalog/public/numbers/countries",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-catalog",
                        "public",
                        "numbers",
                        "countries"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Public price list of international virtual numbers (DIDWW catalogue): for every country — number of available\nprefix groups, number types, monthly price range (USD), whether numbers are in stock and whether owner\nverification is required (`none` — buy immediately, `all` — documents required everywhere, `partial` — both).\nPrices are the platform's selling prices; the connection fee is already included in the monthly price\n(`setup_from` is always 0). Data is refreshed on catalogue sync (`updatedAt`), responses are cached for 5 minutes\n(`Cache-Control: public, max-age=300`). No token required; limit 120 requests per minute per IP.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
                  },
                  "status": "Summary by country.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"currency\": \"USD\",\n  \"updatedAt\": \"2026-09-02T15:47:05.918Z\",\n  \"data\": [\n    {\n      \"country\": \"United States\",\n      \"iso\": \"US\",\n      \"code\": \"1\",\n      \"groups\": 320,\n      \"types\": [\n        \"Local\",\n        \"Toll-free\"\n      ],\n      \"monthly_from\": 3.99,\n      \"monthly_to\": 24.99,\n      \"setup_from\": 0,\n      \"in_stock\": true,\n      \"verification\": \"partial\",\n      \"verification_groups\": 12,\n      \"monthly_from_no_verification\": 3.99\n    }\n  ]\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-catalog/public/numbers/countries",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-catalog",
                        "public",
                        "numbers",
                        "countries"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Public price list of international virtual numbers (DIDWW catalogue): for every country — number of available\nprefix groups, number types, monthly price range (USD), whether numbers are in stock and whether owner\nverification is required (`none` — buy immediately, `all` — documents required everywhere, `partial` — both).\nPrices are the platform's selling prices; the connection fee is already included in the monthly price\n(`setup_from` is always 0). Data is refreshed on catalogue sync (`updatedAt`), responses are cached for 5 minutes\n(`Cache-Control: public, max-age=300`). No token required; limit 120 requests per minute per IP.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-catalog/public/numbers/countries",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-catalog",
                        "public",
                        "numbers",
                        "countries"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Public price list of international virtual numbers (DIDWW catalogue): for every country — number of available\nprefix groups, number types, monthly price range (USD), whether numbers are in stock and whether owner\nverification is required (`none` — buy immediately, `all` — documents required everywhere, `partial` — both).\nPrices are the platform's selling prices; the connection fee is already included in the monthly price\n(`setup_from` is always 0). Data is refreshed on catalogue sync (`updatedAt`), responses are cached for 5 minutes\n(`Cache-Control: public, max-age=300`). No token required; limit 120 requests per minute per IP.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "International numbers: prefix groups with prices",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-catalog/public/numbers",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-catalog",
                    "public",
                    "numbers"
                  ],
                  "query": [
                    {
                      "key": "country",
                      "value": "US",
                      "description": "ISO-2 country code (e.g. `US`) or exact country name from the summary.",
                      "disabled": true
                    },
                    {
                      "key": "type",
                      "value": "Local",
                      "description": "Number type as returned in `type` (e.g. `Local`, `National`, `Mobile`, `Toll-free`).",
                      "disabled": true
                    },
                    {
                      "key": "feature",
                      "value": "sms",
                      "description": "Required feature: `voice`, `sms`, `t38` (alias `fax`).",
                      "disabled": true
                    },
                    {
                      "key": "verification",
                      "value": "none",
                      "description": "`none` — only groups that can be bought without documents; `required` — only groups that need owner verification.",
                      "disabled": true
                    },
                    {
                      "key": "search",
                      "value": "New York",
                      "description": "Digits — prefix starts with; text — country/area/city name contains.",
                      "disabled": true
                    },
                    {
                      "key": "sort",
                      "value": "price",
                      "description": "Sort field (default `country`).",
                      "disabled": true
                    },
                    {
                      "key": "dir",
                      "value": "asc",
                      "description": "Sort direction (default `asc`).",
                      "disabled": true
                    },
                    {
                      "key": "page",
                      "value": "1",
                      "description": "Page number, from 1.",
                      "disabled": true
                    },
                    {
                      "key": "pageSize",
                      "value": "50",
                      "description": "Page size (1–200, default 50).",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Public paginated list of international number groups (country + prefix/area) with the monthly price in USD,\nfeatures (`voice_in`, `voice_out`, `sms_in`, `sms_out`, `t38`), stock flag and whether owner verification is\nrequired. Filter by country (ISO-2 or exact country name), type, feature, verification and search; sort by\n`country`, `prefix` or `price`. No token required; limit 120 requests per minute per IP; cached 5 minutes.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of number groups.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-catalog/public/numbers",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-catalog",
                        "public",
                        "numbers"
                      ],
                      "query": [
                        {
                          "key": "country",
                          "value": "US",
                          "description": "ISO-2 country code (e.g. `US`) or exact country name from the summary.",
                          "disabled": true
                        },
                        {
                          "key": "type",
                          "value": "Local",
                          "description": "Number type as returned in `type` (e.g. `Local`, `National`, `Mobile`, `Toll-free`).",
                          "disabled": true
                        },
                        {
                          "key": "feature",
                          "value": "sms",
                          "description": "Required feature: `voice`, `sms`, `t38` (alias `fax`).",
                          "disabled": true
                        },
                        {
                          "key": "verification",
                          "value": "none",
                          "description": "`none` — only groups that can be bought without documents; `required` — only groups that need owner verification.",
                          "disabled": true
                        },
                        {
                          "key": "search",
                          "value": "New York",
                          "description": "Digits — prefix starts with; text — country/area/city name contains.",
                          "disabled": true
                        },
                        {
                          "key": "sort",
                          "value": "price",
                          "description": "Sort field (default `country`).",
                          "disabled": true
                        },
                        {
                          "key": "dir",
                          "value": "asc",
                          "description": "Sort direction (default `asc`).",
                          "disabled": true
                        },
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Page number, from 1.",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "50",
                          "description": "Page size (1–200, default 50).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Public paginated list of international number groups (country + prefix/area) with the monthly price in USD,\nfeatures (`voice_in`, `voice_out`, `sms_in`, `sms_out`, `t38`), stock flag and whether owner verification is\nrequired. Filter by country (ISO-2 or exact country name), type, feature, verification and search; sort by\n`country`, `prefix` or `price`. No token required; limit 120 requests per minute per IP; cached 5 minutes.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
                  },
                  "status": "Page of number groups.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"currency\": \"USD\",\n  \"updatedAt\": \"2026-09-02T15:47:05.918Z\",\n  \"meta\": {\n    \"page\": 1,\n    \"pageSize\": 50,\n    \"total\": 5612\n  },\n  \"data\": [\n    {\n      \"id\": \"0f1e2d3c-0000-4000-8000-000000000001\",\n      \"country\": \"United States\",\n      \"iso\": \"US\",\n      \"code\": \"1\",\n      \"prefix\": \"212\",\n      \"area\": \"New York\",\n      \"city\": \"New York\",\n      \"region\": \"NY\",\n      \"type\": \"Local\",\n      \"features\": [\n        \"voice_in\",\n        \"voice_out\",\n        \"sms_in\"\n      ],\n      \"monthly\": 3.99,\n      \"setup\": 0,\n      \"in_stock\": true,\n      \"needs_verification\": false\n    }\n  ]\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-catalog/public/numbers",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-catalog",
                        "public",
                        "numbers"
                      ],
                      "query": [
                        {
                          "key": "country",
                          "value": "US",
                          "description": "ISO-2 country code (e.g. `US`) or exact country name from the summary.",
                          "disabled": true
                        },
                        {
                          "key": "type",
                          "value": "Local",
                          "description": "Number type as returned in `type` (e.g. `Local`, `National`, `Mobile`, `Toll-free`).",
                          "disabled": true
                        },
                        {
                          "key": "feature",
                          "value": "sms",
                          "description": "Required feature: `voice`, `sms`, `t38` (alias `fax`).",
                          "disabled": true
                        },
                        {
                          "key": "verification",
                          "value": "none",
                          "description": "`none` — only groups that can be bought without documents; `required` — only groups that need owner verification.",
                          "disabled": true
                        },
                        {
                          "key": "search",
                          "value": "New York",
                          "description": "Digits — prefix starts with; text — country/area/city name contains.",
                          "disabled": true
                        },
                        {
                          "key": "sort",
                          "value": "price",
                          "description": "Sort field (default `country`).",
                          "disabled": true
                        },
                        {
                          "key": "dir",
                          "value": "asc",
                          "description": "Sort direction (default `asc`).",
                          "disabled": true
                        },
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Page number, from 1.",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "50",
                          "description": "Page size (1–200, default 50).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Public paginated list of international number groups (country + prefix/area) with the monthly price in USD,\nfeatures (`voice_in`, `voice_out`, `sms_in`, `sms_out`, `t38`), stock flag and whether owner verification is\nrequired. Filter by country (ISO-2 or exact country name), type, feature, verification and search; sort by\n`country`, `prefix` or `price`. No token required; limit 120 requests per minute per IP; cached 5 minutes.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-catalog/public/numbers",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-catalog",
                        "public",
                        "numbers"
                      ],
                      "query": [
                        {
                          "key": "country",
                          "value": "US",
                          "description": "ISO-2 country code (e.g. `US`) or exact country name from the summary.",
                          "disabled": true
                        },
                        {
                          "key": "type",
                          "value": "Local",
                          "description": "Number type as returned in `type` (e.g. `Local`, `National`, `Mobile`, `Toll-free`).",
                          "disabled": true
                        },
                        {
                          "key": "feature",
                          "value": "sms",
                          "description": "Required feature: `voice`, `sms`, `t38` (alias `fax`).",
                          "disabled": true
                        },
                        {
                          "key": "verification",
                          "value": "none",
                          "description": "`none` — only groups that can be bought without documents; `required` — only groups that need owner verification.",
                          "disabled": true
                        },
                        {
                          "key": "search",
                          "value": "New York",
                          "description": "Digits — prefix starts with; text — country/area/city name contains.",
                          "disabled": true
                        },
                        {
                          "key": "sort",
                          "value": "price",
                          "description": "Sort field (default `country`).",
                          "disabled": true
                        },
                        {
                          "key": "dir",
                          "value": "asc",
                          "description": "Sort direction (default `asc`).",
                          "disabled": true
                        },
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Page number, from 1.",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "50",
                          "description": "Page size (1–200, default 50).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Public paginated list of international number groups (country + prefix/area) with the monthly price in USD,\nfeatures (`voice_in`, `voice_out`, `sms_in`, `sms_out`, `t38`), stock flag and whether owner verification is\nrequired. Filter by country (ISO-2 or exact country name), type, feature, verification and search; sort by\n`country`, `prefix` or `price`. No token required; limit 120 requests per minute per IP; cached 5 minutes.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Outgoing call rates: summary by country",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-catalog/public/rates/countries",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-catalog",
                    "public",
                    "rates",
                    "countries"
                  ],
                  "query": [
                    {
                      "key": "route",
                      "value": "international",
                      "description": "Route type (default `international`).",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Public summary of per-minute rates for outgoing calls by destination country: number of prefixes and the\nprice range in **US cents per minute**. `route=international` (default) — calls from abroad; `local` — calls\noriginating in the same country; `all` — both. No token required; limit 120 requests per minute per IP; cached 5 minutes.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Summary by country.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-catalog/public/rates/countries",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-catalog",
                        "public",
                        "rates",
                        "countries"
                      ],
                      "query": [
                        {
                          "key": "route",
                          "value": "international",
                          "description": "Route type (default `international`).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Public summary of per-minute rates for outgoing calls by destination country: number of prefixes and the\nprice range in **US cents per minute**. `route=international` (default) — calls from abroad; `local` — calls\noriginating in the same country; `all` — both. No token required; limit 120 requests per minute per IP; cached 5 minutes.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
                  },
                  "status": "Summary by country.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"currency\": \"USD\",\n  \"unit\": \"cent_per_minute\",\n  \"route\": \"international\",\n  \"updatedAt\": \"2026-09-30T17:12:39.461Z\",\n  \"data\": [\n    {\n      \"country\": \"United States\",\n      \"iso\": \"US\",\n      \"prefixes\": 25,\n      \"price_from\": 2,\n      \"price_to\": 15\n    }\n  ]\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-catalog/public/rates/countries",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-catalog",
                        "public",
                        "rates",
                        "countries"
                      ],
                      "query": [
                        {
                          "key": "route",
                          "value": "international",
                          "description": "Route type (default `international`).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Public summary of per-minute rates for outgoing calls by destination country: number of prefixes and the\nprice range in **US cents per minute**. `route=international` (default) — calls from abroad; `local` — calls\noriginating in the same country; `all` — both. No token required; limit 120 requests per minute per IP; cached 5 minutes.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-catalog/public/rates/countries",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-catalog",
                        "public",
                        "rates",
                        "countries"
                      ],
                      "query": [
                        {
                          "key": "route",
                          "value": "international",
                          "description": "Route type (default `international`).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Public summary of per-minute rates for outgoing calls by destination country: number of prefixes and the\nprice range in **US cents per minute**. `route=international` (default) — calls from abroad; `local` — calls\noriginating in the same country; `all` — both. No token required; limit 120 requests per minute per IP; cached 5 minutes.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Outgoing call rates by prefix",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-catalog/public/rates",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-catalog",
                    "public",
                    "rates"
                  ],
                  "query": [
                    {
                      "key": "country",
                      "value": "US",
                      "description": "ISO-2 country code or exact country name.",
                      "disabled": true
                    },
                    {
                      "key": "route",
                      "value": "international",
                      "description": "Route type (default `international`).",
                      "disabled": true
                    },
                    {
                      "key": "search",
                      "value": "1212",
                      "description": "Digits — prefix starts with; text — country/network contains.",
                      "disabled": true
                    },
                    {
                      "key": "sort",
                      "value": "price",
                      "description": "Sort field (default `country`).",
                      "disabled": true
                    },
                    {
                      "key": "dir",
                      "value": "asc",
                      "description": "Sort direction (default `asc`).",
                      "disabled": true
                    },
                    {
                      "key": "page",
                      "value": "1",
                      "description": "Page number, from 1.",
                      "disabled": true
                    },
                    {
                      "key": "pageSize",
                      "value": "50",
                      "description": "Page size (1–200, default 50).",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Public paginated list of per-minute rates for outgoing calls by destination prefix (US cents per minute) with\nbilling increments. Filter by country (ISO-2 or exact name), route and search (digits — prefix starts with;\ntext — country or network name contains); sort by `country`, `prefix` or `price`. No token required; limit 120\nrequests per minute per IP; cached 5 minutes.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of rates.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-catalog/public/rates",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-catalog",
                        "public",
                        "rates"
                      ],
                      "query": [
                        {
                          "key": "country",
                          "value": "US",
                          "description": "ISO-2 country code or exact country name.",
                          "disabled": true
                        },
                        {
                          "key": "route",
                          "value": "international",
                          "description": "Route type (default `international`).",
                          "disabled": true
                        },
                        {
                          "key": "search",
                          "value": "1212",
                          "description": "Digits — prefix starts with; text — country/network contains.",
                          "disabled": true
                        },
                        {
                          "key": "sort",
                          "value": "price",
                          "description": "Sort field (default `country`).",
                          "disabled": true
                        },
                        {
                          "key": "dir",
                          "value": "asc",
                          "description": "Sort direction (default `asc`).",
                          "disabled": true
                        },
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Page number, from 1.",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "50",
                          "description": "Page size (1–200, default 50).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Public paginated list of per-minute rates for outgoing calls by destination prefix (US cents per minute) with\nbilling increments. Filter by country (ISO-2 or exact name), route and search (digits — prefix starts with;\ntext — country or network name contains); sort by `country`, `prefix` or `price`. No token required; limit 120\nrequests per minute per IP; cached 5 minutes.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
                  },
                  "status": "Page of rates.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"currency\": \"USD\",\n  \"unit\": \"cent_per_minute\",\n  \"route\": \"international\",\n  \"updatedAt\": \"2026-09-30T17:12:39.461Z\",\n  \"meta\": {\n    \"page\": 1,\n    \"pageSize\": 50,\n    \"total\": 112477\n  },\n  \"data\": [\n    {\n      \"prefix\": \"1212\",\n      \"country\": \"United States\",\n      \"iso\": \"US\",\n      \"network\": \"US Fixed\",\n      \"route\": \"international\",\n      \"price\": 2,\n      \"increments\": {\n        \"initial\": 1,\n        \"recurring\": 1\n      }\n    }\n  ]\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-catalog/public/rates",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-catalog",
                        "public",
                        "rates"
                      ],
                      "query": [
                        {
                          "key": "country",
                          "value": "US",
                          "description": "ISO-2 country code or exact country name.",
                          "disabled": true
                        },
                        {
                          "key": "route",
                          "value": "international",
                          "description": "Route type (default `international`).",
                          "disabled": true
                        },
                        {
                          "key": "search",
                          "value": "1212",
                          "description": "Digits — prefix starts with; text — country/network contains.",
                          "disabled": true
                        },
                        {
                          "key": "sort",
                          "value": "price",
                          "description": "Sort field (default `country`).",
                          "disabled": true
                        },
                        {
                          "key": "dir",
                          "value": "asc",
                          "description": "Sort direction (default `asc`).",
                          "disabled": true
                        },
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Page number, from 1.",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "50",
                          "description": "Page size (1–200, default 50).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Public paginated list of per-minute rates for outgoing calls by destination prefix (US cents per minute) with\nbilling increments. Filter by country (ISO-2 or exact name), route and search (digits — prefix starts with;\ntext — country or network name contains); sort by `country`, `prefix` or `price`. No token required; limit 120\nrequests per minute per IP; cached 5 minutes.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-catalog/public/rates",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-catalog",
                        "public",
                        "rates"
                      ],
                      "query": [
                        {
                          "key": "country",
                          "value": "US",
                          "description": "ISO-2 country code or exact country name.",
                          "disabled": true
                        },
                        {
                          "key": "route",
                          "value": "international",
                          "description": "Route type (default `international`).",
                          "disabled": true
                        },
                        {
                          "key": "search",
                          "value": "1212",
                          "description": "Digits — prefix starts with; text — country/network contains.",
                          "disabled": true
                        },
                        {
                          "key": "sort",
                          "value": "price",
                          "description": "Sort field (default `country`).",
                          "disabled": true
                        },
                        {
                          "key": "dir",
                          "value": "asc",
                          "description": "Sort direction (default `asc`).",
                          "disabled": true
                        },
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Page number, from 1.",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "50",
                          "description": "Page size (1–200, default 50).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Public paginated list of per-minute rates for outgoing calls by destination prefix (US cents per minute) with\nbilling increments. Filter by country (ISO-2 or exact name), route and search (digits — prefix starts with;\ntext — country or network name contains); sort by `country`, `prefix` or `price`. No token required; limit 120\nrequests per minute per IP; cached 5 minutes.\n\n\n**Required role:** no token required (public)\n\n**Side effects:** None"
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "List identities of my company",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-identities",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-identities"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Identities (a person or a business) are the owner records that regulators require before an international\nnumber from a regulated country can be activated. They are stored at the number provider and mirrored here.\nReturns all identities of the current user's company with their addresses, newest first (plain array, no\nStrapi envelope). Reuse a verified identity/address for new verification requests.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Identities with addresses.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Identities (a person or a business) are the owner records that regulators require before an international\nnumber from a regulated country can be activated. They are stored at the number provider and mirrored here.\nReturns all identities of the current user's company with their addresses, newest first (plain array, no\nStrapi envelope). Reuse a verified identity/address for new verification requests.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Identities with addresses.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "[\n  {\n    \"id\": 5,\n    \"identity_type\": \"business\",\n    \"first_name\": \"John\",\n    \"last_name\": \"Doe\",\n    \"phone_number\": \"+380441234567\",\n    \"company_name\": \"Example LLC\",\n    \"company_reg_number\": \"12345678\",\n    \"vat_id\": null,\n    \"birth_date\": null,\n    \"id_number\": null,\n    \"personal_tax_id\": null,\n    \"contact_email\": \"owner@example.com\",\n    \"country_iso\": \"UA\",\n    \"birth_country_iso\": null,\n    \"verified\": true,\n    \"proofs\": [\n      {\n        \"didww_proof_id\": \"9a1b2c3d-0000-4000-8000-000000000001\",\n        \"proof_type_id\": \"7f0e1d2c-0000-4000-8000-000000000002\",\n        \"files\": [\n          {\n            \"name\": \"passport.pdf\"\n          }\n        ],\n        \"expires_at\": \"2027-01-15T00:00:00.000Z\",\n        \"created_at\": \"2026-01-15T10:00:00.000Z\"\n      }\n    ],\n    \"permanent_documents\": [],\n    \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n    \"addresses\": [\n      {\n        \"id\": 8,\n        \"country_iso\": \"UA\",\n        \"city_name\": \"Kyiv\",\n        \"postal_code\": \"01001\",\n        \"address\": \"1 Example St\",\n        \"description\": null,\n        \"verified\": true,\n        \"proofs\": [],\n        \"createdAt\": \"2026-01-15T10:05:00.000Z\"\n      }\n    ]\n  }\n]"
                },
                {
                  "name": "400 The user has no company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Identities (a person or a business) are the owner records that regulators require before an international\nnumber from a regulated country can be activated. They are stored at the number provider and mirrored here.\nReturns all identities of the current user's company with their addresses, newest first (plain array, no\nStrapi envelope). Reuse a verified identity/address for new verification requests.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The user has no company.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"User has no company\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Identities (a person or a business) are the owner records that regulators require before an international\nnumber from a regulated country can be activated. They are stored at the number provider and mirrored here.\nReturns all identities of the current user's company with their addresses, newest first (plain array, no\nStrapi envelope). Reuse a verified identity/address for new verification requests.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Identities (a person or a business) are the owner records that regulators require before an international\nnumber from a regulated country can be activated. They are stored at the number provider and mirrored here.\nReturns all identities of the current user's company with their addresses, newest first (plain array, no\nStrapi envelope). Reuse a verified identity/address for new verification requests.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Create an identity",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-identities",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-identities"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Creates an owner identity for number verification. The record is first created at the number provider and\nthen mirrored locally (if the provider rejects it, nothing is saved). Required: `identity_type`, `first_name`,\n`last_name`, `phone_number`; for `business` also `company_name`. Which other fields are mandatory for a given\ncountry/number type is returned by `GET /didww-verifications/requirements` (`mandatory_fields`).\nAfter creation add an address (`POST /didww-identities/{id}/addresses`) and upload proofs.\nLimit: 120 modifying requests per 5 minutes per IP across all identity/verification endpoints.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates the identity at the number provider (DIDWW). No charge.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"identity_type\": \"business\",\n    \"first_name\": \"John\",\n    \"last_name\": \"Doe\",\n    \"phone_number\": \"+380441234567\",\n    \"company_name\": \"Example LLC\",\n    \"company_reg_number\": \"12345678\",\n    \"contact_email\": \"owner@example.com\",\n    \"country_iso\": \"UA\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created identity (plain object).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates an owner identity for number verification. The record is first created at the number provider and\nthen mirrored locally (if the provider rejects it, nothing is saved). Required: `identity_type`, `first_name`,\n`last_name`, `phone_number`; for `business` also `company_name`. Which other fields are mandatory for a given\ncountry/number type is returned by `GET /didww-verifications/requirements` (`mandatory_fields`).\nAfter creation add an address (`POST /didww-identities/{id}/addresses`) and upload proofs.\nLimit: 120 modifying requests per 5 minutes per IP across all identity/verification endpoints.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates the identity at the number provider (DIDWW). No charge.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"identity_type\": \"business\",\n    \"first_name\": \"John\",\n    \"last_name\": \"Doe\",\n    \"phone_number\": \"+380441234567\",\n    \"company_name\": \"Example LLC\",\n    \"company_reg_number\": \"12345678\",\n    \"contact_email\": \"owner@example.com\",\n    \"country_iso\": \"UA\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created identity (plain object).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 5,\n  \"identity_type\": \"business\",\n  \"first_name\": \"John\",\n  \"last_name\": \"Doe\",\n  \"phone_number\": \"+380441234567\",\n  \"company_name\": \"Example LLC\",\n  \"company_reg_number\": \"12345678\",\n  \"vat_id\": null,\n  \"birth_date\": null,\n  \"id_number\": null,\n  \"personal_tax_id\": null,\n  \"contact_email\": \"owner@example.com\",\n  \"country_iso\": \"UA\",\n  \"birth_country_iso\": null,\n  \"verified\": false,\n  \"proofs\": [],\n  \"permanent_documents\": [],\n  \"createdAt\": \"2026-01-15T10:00:00.000Z\"\n}"
                },
                {
                  "name": "400 Validation error. Messages: `identity_type must be personal or business`, `company_name is required for business identity`, `first_name is required`, `last_name is required`, `phone_number is required`, `User has no company`; or an error text from the provider.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates an owner identity for number verification. The record is first created at the number provider and\nthen mirrored locally (if the provider rejects it, nothing is saved). Required: `identity_type`, `first_name`,\n`last_name`, `phone_number`; for `business` also `company_name`. Which other fields are mandatory for a given\ncountry/number type is returned by `GET /didww-verifications/requirements` (`mandatory_fields`).\nAfter creation add an address (`POST /didww-identities/{id}/addresses`) and upload proofs.\nLimit: 120 modifying requests per 5 minutes per IP across all identity/verification endpoints.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates the identity at the number provider (DIDWW). No charge.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"identity_type\": \"business\",\n    \"first_name\": \"John\",\n    \"last_name\": \"Doe\",\n    \"phone_number\": \"+380441234567\",\n    \"company_name\": \"Example LLC\",\n    \"company_reg_number\": \"12345678\",\n    \"contact_email\": \"owner@example.com\",\n    \"country_iso\": \"UA\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error. Messages: `identity_type must be personal or business`, `company_name is required for business identity`, `first_name is required`, `last_name is required`, `phone_number is required`, `User has no company`; or an error text from the provider.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"company_name is required for business identity\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates an owner identity for number verification. The record is first created at the number provider and\nthen mirrored locally (if the provider rejects it, nothing is saved). Required: `identity_type`, `first_name`,\n`last_name`, `phone_number`; for `business` also `company_name`. Which other fields are mandatory for a given\ncountry/number type is returned by `GET /didww-verifications/requirements` (`mandatory_fields`).\nAfter creation add an address (`POST /didww-identities/{id}/addresses`) and upload proofs.\nLimit: 120 modifying requests per 5 minutes per IP across all identity/verification endpoints.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates the identity at the number provider (DIDWW). No charge.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"identity_type\": \"business\",\n    \"first_name\": \"John\",\n    \"last_name\": \"Doe\",\n    \"phone_number\": \"+380441234567\",\n    \"company_name\": \"Example LLC\",\n    \"company_reg_number\": \"12345678\",\n    \"contact_email\": \"owner@example.com\",\n    \"country_iso\": \"UA\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 No permission, or the company is disabled (`Company disabled`).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates an owner identity for number verification. The record is first created at the number provider and\nthen mirrored locally (if the provider rejects it, nothing is saved). Required: `identity_type`, `first_name`,\n`last_name`, `phone_number`; for `business` also `company_name`. Which other fields are mandatory for a given\ncountry/number type is returned by `GET /didww-verifications/requirements` (`mandatory_fields`).\nAfter creation add an address (`POST /didww-identities/{id}/addresses`) and upload proofs.\nLimit: 120 modifying requests per 5 minutes per IP across all identity/verification endpoints.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates the identity at the number provider (DIDWW). No charge.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"identity_type\": \"business\",\n    \"first_name\": \"John\",\n    \"last_name\": \"Doe\",\n    \"phone_number\": \"+380441234567\",\n    \"company_name\": \"Example LLC\",\n    \"company_reg_number\": \"12345678\",\n    \"contact_email\": \"owner@example.com\",\n    \"country_iso\": \"UA\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "No permission, or the company is disabled (`Company disabled`).",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Company disabled\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates an owner identity for number verification. The record is first created at the number provider and\nthen mirrored locally (if the provider rejects it, nothing is saved). Required: `identity_type`, `first_name`,\n`last_name`, `phone_number`; for `business` also `company_name`. Which other fields are mandatory for a given\ncountry/number type is returned by `GET /didww-verifications/requirements` (`mandatory_fields`).\nAfter creation add an address (`POST /didww-identities/{id}/addresses`) and upload proofs.\nLimit: 120 modifying requests per 5 minutes per IP across all identity/verification endpoints.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates the identity at the number provider (DIDWW). No charge.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"identity_type\": \"business\",\n    \"first_name\": \"John\",\n    \"last_name\": \"Doe\",\n    \"phone_number\": \"+380441234567\",\n    \"company_name\": \"Example LLC\",\n    \"company_reg_number\": \"12345678\",\n    \"contact_email\": \"owner@example.com\",\n    \"country_iso\": \"UA\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update an identity",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-identities/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-identities",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "5",
                      "description": "Identity id."
                    }
                  ]
                },
                "description": "Updates the identity at the provider and locally. Only these fields can be changed: `first_name`, `last_name`,\n`phone_number`, `company_name`, `company_reg_number`, `vat_id`, `birth_date`, `id_number`, `personal_tax_id`,\n`contact_email`. `identity_type`, `country_iso`, `birth_country_iso` cannot be changed — create a new identity.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Updates the identity at the number provider (DIDWW).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"phone_number\": \"+380441234568\",\n    \"contact_email\": \"owner@example.com\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated identity.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Updates the identity at the provider and locally. Only these fields can be changed: `first_name`, `last_name`,\n`phone_number`, `company_name`, `company_reg_number`, `vat_id`, `birth_date`, `id_number`, `personal_tax_id`,\n`contact_email`. `identity_type`, `country_iso`, `birth_country_iso` cannot be changed — create a new identity.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Updates the identity at the number provider (DIDWW).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phone_number\": \"+380441234568\",\n    \"contact_email\": \"owner@example.com\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated identity.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 5,\n  \"identity_type\": \"business\",\n  \"first_name\": \"John\",\n  \"last_name\": \"Doe\",\n  \"phone_number\": \"+380441234568\",\n  \"company_name\": \"Example LLC\",\n  \"company_reg_number\": \"12345678\",\n  \"vat_id\": null,\n  \"birth_date\": null,\n  \"id_number\": null,\n  \"personal_tax_id\": null,\n  \"contact_email\": \"owner@example.com\",\n  \"country_iso\": \"UA\",\n  \"birth_country_iso\": null,\n  \"verified\": false,\n  \"proofs\": [],\n  \"permanent_documents\": [],\n  \"createdAt\": \"2026-01-15T10:00:00.000Z\"\n}"
                },
                {
                  "name": "400 Validation error or malformed request.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Updates the identity at the provider and locally. Only these fields can be changed: `first_name`, `last_name`,\n`phone_number`, `company_name`, `company_reg_number`, `vat_id`, `birth_date`, `id_number`, `personal_tax_id`,\n`contact_email`. `identity_type`, `country_iso`, `birth_country_iso` cannot be changed — create a new identity.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Updates the identity at the number provider (DIDWW).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phone_number\": \"+380441234568\",\n    \"contact_email\": \"owner@example.com\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error or malformed request.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"email must be a valid email\",\n    \"details\": {\n      \"errors\": [\n        {\n          \"path\": [\n            \"email\"\n          ],\n          \"message\": \"email must be a valid email\",\n          \"name\": \"ValidationError\"\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Updates the identity at the provider and locally. Only these fields can be changed: `first_name`, `last_name`,\n`phone_number`, `company_name`, `company_reg_number`, `vat_id`, `birth_date`, `id_number`, `personal_tax_id`,\n`contact_email`. `identity_type`, `country_iso`, `birth_country_iso` cannot be changed — create a new identity.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Updates the identity at the number provider (DIDWW).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phone_number\": \"+380441234568\",\n    \"contact_email\": \"owner@example.com\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Updates the identity at the provider and locally. Only these fields can be changed: `first_name`, `last_name`,\n`phone_number`, `company_name`, `company_reg_number`, `vat_id`, `birth_date`, `id_number`, `personal_tax_id`,\n`contact_email`. `identity_type`, `country_iso`, `birth_country_iso` cannot be changed — create a new identity.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Updates the identity at the number provider (DIDWW).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phone_number\": \"+380441234568\",\n    \"contact_email\": \"owner@example.com\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Identity not found in your company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Updates the identity at the provider and locally. Only these fields can be changed: `first_name`, `last_name`,\n`phone_number`, `company_name`, `company_reg_number`, `vat_id`, `birth_date`, `id_number`, `personal_tax_id`,\n`contact_email`. `identity_type`, `country_iso`, `birth_country_iso` cannot be changed — create a new identity.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Updates the identity at the number provider (DIDWW).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phone_number\": \"+380441234568\",\n    \"contact_email\": \"owner@example.com\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Identity not found in your company.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Identity not found\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Updates the identity at the provider and locally. Only these fields can be changed: `first_name`, `last_name`,\n`phone_number`, `company_name`, `company_reg_number`, `vat_id`, `birth_date`, `id_number`, `personal_tax_id`,\n`contact_email`. `identity_type`, `country_iso`, `birth_country_iso` cannot be changed — create a new identity.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Updates the identity at the number provider (DIDWW).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phone_number\": \"+380441234568\",\n    \"contact_email\": \"owner@example.com\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete an identity",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-identities/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-identities",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "5",
                      "description": "Identity id."
                    }
                  ]
                },
                "description": "Deletes the identity and all its addresses at the provider and locally. Not allowed while a verification\nrequest with this identity is `pending`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the identity and its addresses at the number provider and locally."
              },
              "response": [
                {
                  "name": "200 Deleted.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Deletes the identity and all its addresses at the provider and locally. Not allowed while a verification\nrequest with this identity is `pending`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the identity and its addresses at the number provider and locally."
                  },
                  "status": "Deleted.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"ok\": true\n}"
                },
                {
                  "name": "400 `Identity is used in a pending verification. Wait for its result first.`",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Deletes the identity and all its addresses at the provider and locally. Not allowed while a verification\nrequest with this identity is `pending`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the identity and its addresses at the number provider and locally."
                  },
                  "status": "`Identity is used in a pending verification. Wait for its result first.`",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Identity is used in a pending verification. Wait for its result first.\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Deletes the identity and all its addresses at the provider and locally. Not allowed while a verification\nrequest with this identity is `pending`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the identity and its addresses at the number provider and locally."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Deletes the identity and all its addresses at the provider and locally. Not allowed while a verification\nrequest with this identity is `pending`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the identity and its addresses at the number provider and locally."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Identity not found in your company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Deletes the identity and all its addresses at the provider and locally. Not allowed while a verification\nrequest with this identity is `pending`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the identity and its addresses at the number provider and locally."
                  },
                  "status": "Identity not found in your company.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Identity not found\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Deletes the identity and all its addresses at the provider and locally. Not allowed while a verification\nrequest with this identity is `pending`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the identity and its addresses at the number provider and locally."
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Add an address to an identity",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-identities/:id/addresses",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-identities",
                    ":id",
                    "addresses"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "5",
                      "description": "Identity id."
                    }
                  ]
                },
                "description": "Creates an address (registered/service address) for the identity at the provider and locally. Required:\n`country_iso`, `city_name`, `postal_code`, `address`. The address is then used in verification requests\n(`address_id`) and may need its own proofs (`POST /didww-identities/addresses/{id}/proofs`).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates the address at the number provider (DIDWW).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"country_iso\": \"UA\",\n    \"city_name\": \"Kyiv\",\n    \"postal_code\": \"01001\",\n    \"address\": \"1 Example St\",\n    \"description\": \"Head office\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created address.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/addresses",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "addresses"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Creates an address (registered/service address) for the identity at the provider and locally. Required:\n`country_iso`, `city_name`, `postal_code`, `address`. The address is then used in verification requests\n(`address_id`) and may need its own proofs (`POST /didww-identities/addresses/{id}/proofs`).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates the address at the number provider (DIDWW).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"country_iso\": \"UA\",\n    \"city_name\": \"Kyiv\",\n    \"postal_code\": \"01001\",\n    \"address\": \"1 Example St\",\n    \"description\": \"Head office\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created address.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 8,\n  \"country_iso\": \"UA\",\n  \"city_name\": \"Kyiv\",\n  \"postal_code\": \"01001\",\n  \"address\": \"1 Example St\",\n  \"description\": \"Head office\",\n  \"verified\": false,\n  \"proofs\": [],\n  \"createdAt\": \"2026-01-15T10:05:00.000Z\"\n}"
                },
                {
                  "name": "400 Validation error: `country_iso is required`, `city_name is required`, `postal_code is required`, `address is required`, or a provider error.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/addresses",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "addresses"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Creates an address (registered/service address) for the identity at the provider and locally. Required:\n`country_iso`, `city_name`, `postal_code`, `address`. The address is then used in verification requests\n(`address_id`) and may need its own proofs (`POST /didww-identities/addresses/{id}/proofs`).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates the address at the number provider (DIDWW).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"country_iso\": \"UA\",\n    \"city_name\": \"Kyiv\",\n    \"postal_code\": \"01001\",\n    \"address\": \"1 Example St\",\n    \"description\": \"Head office\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error: `country_iso is required`, `city_name is required`, `postal_code is required`, `address is required`, or a provider error.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"postal_code is required\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/addresses",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "addresses"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Creates an address (registered/service address) for the identity at the provider and locally. Required:\n`country_iso`, `city_name`, `postal_code`, `address`. The address is then used in verification requests\n(`address_id`) and may need its own proofs (`POST /didww-identities/addresses/{id}/proofs`).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates the address at the number provider (DIDWW).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"country_iso\": \"UA\",\n    \"city_name\": \"Kyiv\",\n    \"postal_code\": \"01001\",\n    \"address\": \"1 Example St\",\n    \"description\": \"Head office\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/addresses",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "addresses"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Creates an address (registered/service address) for the identity at the provider and locally. Required:\n`country_iso`, `city_name`, `postal_code`, `address`. The address is then used in verification requests\n(`address_id`) and may need its own proofs (`POST /didww-identities/addresses/{id}/proofs`).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates the address at the number provider (DIDWW).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"country_iso\": \"UA\",\n    \"city_name\": \"Kyiv\",\n    \"postal_code\": \"01001\",\n    \"address\": \"1 Example St\",\n    \"description\": \"Head office\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Identity not found in your company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/addresses",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "addresses"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Creates an address (registered/service address) for the identity at the provider and locally. Required:\n`country_iso`, `city_name`, `postal_code`, `address`. The address is then used in verification requests\n(`address_id`) and may need its own proofs (`POST /didww-identities/addresses/{id}/proofs`).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates the address at the number provider (DIDWW).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"country_iso\": \"UA\",\n    \"city_name\": \"Kyiv\",\n    \"postal_code\": \"01001\",\n    \"address\": \"1 Example St\",\n    \"description\": \"Head office\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Identity not found in your company.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Identity not found\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/addresses",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "addresses"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "Creates an address (registered/service address) for the identity at the provider and locally. Required:\n`country_iso`, `city_name`, `postal_code`, `address`. The address is then used in verification requests\n(`address_id`) and may need its own proofs (`POST /didww-identities/addresses/{id}/proofs`).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates the address at the number provider (DIDWW).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"country_iso\": \"UA\",\n    \"city_name\": \"Kyiv\",\n    \"postal_code\": \"01001\",\n    \"address\": \"1 Example St\",\n    \"description\": \"Head office\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete an address",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-identities/addresses/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-identities",
                    "addresses",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "8",
                      "description": "Address id."
                    }
                  ]
                },
                "description": "Deletes the address at the provider and locally. Not allowed while a `pending` verification uses it.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the address at the number provider and locally."
              },
              "response": [
                {
                  "name": "200 Deleted.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/addresses/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        "addresses",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "8",
                          "description": "Address id."
                        }
                      ]
                    },
                    "description": "Deletes the address at the provider and locally. Not allowed while a `pending` verification uses it.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the address at the number provider and locally."
                  },
                  "status": "Deleted.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"ok\": true\n}"
                },
                {
                  "name": "400 `Address is used in a pending verification. Wait for its result first.`",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/addresses/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        "addresses",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "8",
                          "description": "Address id."
                        }
                      ]
                    },
                    "description": "Deletes the address at the provider and locally. Not allowed while a `pending` verification uses it.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the address at the number provider and locally."
                  },
                  "status": "`Address is used in a pending verification. Wait for its result first.`",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Address is used in a pending verification. Wait for its result first.\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/addresses/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        "addresses",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "8",
                          "description": "Address id."
                        }
                      ]
                    },
                    "description": "Deletes the address at the provider and locally. Not allowed while a `pending` verification uses it.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the address at the number provider and locally."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/addresses/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        "addresses",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "8",
                          "description": "Address id."
                        }
                      ]
                    },
                    "description": "Deletes the address at the provider and locally. Not allowed while a `pending` verification uses it.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the address at the number provider and locally."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Address not found in your company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/addresses/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        "addresses",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "8",
                          "description": "Address id."
                        }
                      ]
                    },
                    "description": "Deletes the address at the provider and locally. Not allowed while a `pending` verification uses it.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the address at the number provider and locally."
                  },
                  "status": "Address not found in your company.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Address not found\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/addresses/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        "addresses",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "8",
                          "description": "Address id."
                        }
                      ]
                    },
                    "description": "Deletes the address at the provider and locally. Not allowed while a `pending` verification uses it.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the address at the number provider and locally."
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Upload identity proof documents",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-identities/:id/proofs",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-identities",
                    ":id",
                    "proofs"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "5",
                      "description": "Identity id."
                    }
                  ]
                },
                "description": "`multipart/form-data`: one or more files in the `files` field plus `proof_type_id` — the id of a proof type from\n`GET /didww-verifications/requirements` (`personal.proof_types` / `business.proof_types`). Files are encrypted and\nsent to the provider; the platform keeps only a journal entry (file names, proof type, expiry) in `proofs`.\nAllowed: JPG, PNG, PDF, max 10 MB each.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the documents to the number provider (DIDWW) and attaches them to the identity. Files are not stored on the platform."
              },
              "response": [
                {
                  "name": "200 Updated proofs journal.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/proofs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "proofs"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "`multipart/form-data`: one or more files in the `files` field plus `proof_type_id` — the id of a proof type from\n`GET /didww-verifications/requirements` (`personal.proof_types` / `business.proof_types`). Files are encrypted and\nsent to the provider; the platform keeps only a journal entry (file names, proof type, expiry) in `proofs`.\nAllowed: JPG, PNG, PDF, max 10 MB each.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the documents to the number provider (DIDWW) and attaches them to the identity. Files are not stored on the platform."
                  },
                  "status": "Updated proofs journal.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"proofs\": [\n    {\n      \"didww_proof_id\": \"9a1b2c3d-0000-4000-8000-000000000001\",\n      \"proof_type_id\": \"7f0e1d2c-0000-4000-8000-000000000002\",\n      \"files\": [\n        {\n          \"name\": \"passport.pdf\"\n        }\n      ],\n      \"expires_at\": \"2027-01-15T00:00:00.000Z\",\n      \"created_at\": \"2026-01-15T10:00:00.000Z\"\n    }\n  ]\n}"
                },
                {
                  "name": "400 Validation error: `proof_type_id is required`, `No files provided`, `File \"x\": only JPG, PNG or PDF allowed`, `File \"x\": max size is 10MB`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/proofs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "proofs"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "`multipart/form-data`: one or more files in the `files` field plus `proof_type_id` — the id of a proof type from\n`GET /didww-verifications/requirements` (`personal.proof_types` / `business.proof_types`). Files are encrypted and\nsent to the provider; the platform keeps only a journal entry (file names, proof type, expiry) in `proofs`.\nAllowed: JPG, PNG, PDF, max 10 MB each.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the documents to the number provider (DIDWW) and attaches them to the identity. Files are not stored on the platform."
                  },
                  "status": "Validation error: `proof_type_id is required`, `No files provided`, `File \"x\": only JPG, PNG or PDF allowed`, `File \"x\": max size is 10MB`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"No files provided\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/proofs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "proofs"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "`multipart/form-data`: one or more files in the `files` field plus `proof_type_id` — the id of a proof type from\n`GET /didww-verifications/requirements` (`personal.proof_types` / `business.proof_types`). Files are encrypted and\nsent to the provider; the platform keeps only a journal entry (file names, proof type, expiry) in `proofs`.\nAllowed: JPG, PNG, PDF, max 10 MB each.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the documents to the number provider (DIDWW) and attaches them to the identity. Files are not stored on the platform."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/proofs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "proofs"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "`multipart/form-data`: one or more files in the `files` field plus `proof_type_id` — the id of a proof type from\n`GET /didww-verifications/requirements` (`personal.proof_types` / `business.proof_types`). Files are encrypted and\nsent to the provider; the platform keeps only a journal entry (file names, proof type, expiry) in `proofs`.\nAllowed: JPG, PNG, PDF, max 10 MB each.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the documents to the number provider (DIDWW) and attaches them to the identity. Files are not stored on the platform."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Identity not found in your company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/proofs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "proofs"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "`multipart/form-data`: one or more files in the `files` field plus `proof_type_id` — the id of a proof type from\n`GET /didww-verifications/requirements` (`personal.proof_types` / `business.proof_types`). Files are encrypted and\nsent to the provider; the platform keeps only a journal entry (file names, proof type, expiry) in `proofs`.\nAllowed: JPG, PNG, PDF, max 10 MB each.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the documents to the number provider (DIDWW) and attaches them to the identity. Files are not stored on the platform."
                  },
                  "status": "Identity not found in your company.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Identity not found\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/proofs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "proofs"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "`multipart/form-data`: one or more files in the `files` field plus `proof_type_id` — the id of a proof type from\n`GET /didww-verifications/requirements` (`personal.proof_types` / `business.proof_types`). Files are encrypted and\nsent to the provider; the platform keeps only a journal entry (file names, proof type, expiry) in `proofs`.\nAllowed: JPG, PNG, PDF, max 10 MB each.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the documents to the number provider (DIDWW) and attaches them to the identity. Files are not stored on the platform."
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Upload address proof documents",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-identities/addresses/:id/proofs",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-identities",
                    "addresses",
                    ":id",
                    "proofs"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "8",
                      "description": "Address id."
                    }
                  ]
                },
                "description": "Same as identity proofs, but for an address (`address.proof_types` in the requirements). `multipart/form-data` with `files` and `proof_type_id`.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the documents to the number provider (DIDWW) and attaches them to the address."
              },
              "response": [
                {
                  "name": "200 Updated proofs journal of the address.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/addresses/:id/proofs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        "addresses",
                        ":id",
                        "proofs"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "8",
                          "description": "Address id."
                        }
                      ]
                    },
                    "description": "Same as identity proofs, but for an address (`address.proof_types` in the requirements). `multipart/form-data` with `files` and `proof_type_id`.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the documents to the number provider (DIDWW) and attaches them to the address."
                  },
                  "status": "Updated proofs journal of the address.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"proofs\": [\n    {\n      \"didww_proof_id\": \"9a1b2c3d-0000-4000-8000-000000000004\",\n      \"proof_type_id\": \"7f0e1d2c-0000-4000-8000-000000000003\",\n      \"files\": [\n        {\n          \"name\": \"utility-bill.pdf\"\n        }\n      ],\n      \"expires_at\": null,\n      \"created_at\": \"2026-01-15T10:10:00.000Z\"\n    }\n  ]\n}"
                },
                {
                  "name": "400 Validation error: `proof_type_id is required`, `No files provided`, file type/size errors.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/addresses/:id/proofs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        "addresses",
                        ":id",
                        "proofs"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "8",
                          "description": "Address id."
                        }
                      ]
                    },
                    "description": "Same as identity proofs, but for an address (`address.proof_types` in the requirements). `multipart/form-data` with `files` and `proof_type_id`.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the documents to the number provider (DIDWW) and attaches them to the address."
                  },
                  "status": "Validation error: `proof_type_id is required`, `No files provided`, file type/size errors.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"proof_type_id is required\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/addresses/:id/proofs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        "addresses",
                        ":id",
                        "proofs"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "8",
                          "description": "Address id."
                        }
                      ]
                    },
                    "description": "Same as identity proofs, but for an address (`address.proof_types` in the requirements). `multipart/form-data` with `files` and `proof_type_id`.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the documents to the number provider (DIDWW) and attaches them to the address."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/addresses/:id/proofs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        "addresses",
                        ":id",
                        "proofs"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "8",
                          "description": "Address id."
                        }
                      ]
                    },
                    "description": "Same as identity proofs, but for an address (`address.proof_types` in the requirements). `multipart/form-data` with `files` and `proof_type_id`.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the documents to the number provider (DIDWW) and attaches them to the address."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Address not found in your company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/addresses/:id/proofs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        "addresses",
                        ":id",
                        "proofs"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "8",
                          "description": "Address id."
                        }
                      ]
                    },
                    "description": "Same as identity proofs, but for an address (`address.proof_types` in the requirements). `multipart/form-data` with `files` and `proof_type_id`.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the documents to the number provider (DIDWW) and attaches them to the address."
                  },
                  "status": "Address not found in your company.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Address not found\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/addresses/:id/proofs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        "addresses",
                        ":id",
                        "proofs"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "8",
                          "description": "Address id."
                        }
                      ]
                    },
                    "description": "Same as identity proofs, but for an address (`address.proof_types` in the requirements). `multipart/form-data` with `files` and `proof_type_id`.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the documents to the number provider (DIDWW) and attaches them to the address."
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Upload a filled supporting document (LOA / registration form)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-identities/:id/supporting-documents",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-identities",
                    ":id",
                    "supporting-documents"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "5",
                      "description": "Identity id."
                    }
                  ]
                },
                "description": "`multipart/form-data`: `files` plus `template_id` — id of the permanent document template from the requirements\n(`personal.permanent_document` / `business.permanent_document`, the template file is at its `url`). The filled\nand signed form is encrypted, sent to the provider and attached to the identity permanently.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the document to the number provider (DIDWW) and attaches it to the identity."
              },
              "response": [
                {
                  "name": "200 Updated journal of permanent documents.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/supporting-documents",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "supporting-documents"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "`multipart/form-data`: `files` plus `template_id` — id of the permanent document template from the requirements\n(`personal.permanent_document` / `business.permanent_document`, the template file is at its `url`). The filled\nand signed form is encrypted, sent to the provider and attached to the identity permanently.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the document to the number provider (DIDWW) and attaches it to the identity."
                  },
                  "status": "Updated journal of permanent documents.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"permanent_documents\": [\n    {\n      \"didww_document_id\": \"3c2b1a09-0000-4000-8000-000000000006\",\n      \"template_id\": \"5e4d3c2b-0000-4000-8000-000000000005\",\n      \"files\": [\n        {\n          \"name\": \"loa-signed.pdf\"\n        }\n      ],\n      \"created_at\": \"2026-01-15T10:20:00.000Z\"\n    }\n  ]\n}"
                },
                {
                  "name": "400 Validation error: `template_id is required`, `No files provided`, file type/size errors.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/supporting-documents",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "supporting-documents"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "`multipart/form-data`: `files` plus `template_id` — id of the permanent document template from the requirements\n(`personal.permanent_document` / `business.permanent_document`, the template file is at its `url`). The filled\nand signed form is encrypted, sent to the provider and attached to the identity permanently.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the document to the number provider (DIDWW) and attaches it to the identity."
                  },
                  "status": "Validation error: `template_id is required`, `No files provided`, file type/size errors.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"template_id is required\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/supporting-documents",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "supporting-documents"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "`multipart/form-data`: `files` plus `template_id` — id of the permanent document template from the requirements\n(`personal.permanent_document` / `business.permanent_document`, the template file is at its `url`). The filled\nand signed form is encrypted, sent to the provider and attached to the identity permanently.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the document to the number provider (DIDWW) and attaches it to the identity."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/supporting-documents",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "supporting-documents"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "`multipart/form-data`: `files` plus `template_id` — id of the permanent document template from the requirements\n(`personal.permanent_document` / `business.permanent_document`, the template file is at its `url`). The filled\nand signed form is encrypted, sent to the provider and attached to the identity permanently.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the document to the number provider (DIDWW) and attaches it to the identity."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Identity not found in your company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/supporting-documents",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "supporting-documents"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "`multipart/form-data`: `files` plus `template_id` — id of the permanent document template from the requirements\n(`personal.permanent_document` / `business.permanent_document`, the template file is at its `url`). The filled\nand signed form is encrypted, sent to the provider and attached to the identity permanently.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the document to the number provider (DIDWW) and attaches it to the identity."
                  },
                  "status": "Identity not found in your company.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Identity not found\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-identities/:id/supporting-documents",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-identities",
                        ":id",
                        "supporting-documents"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Identity id."
                        }
                      ]
                    },
                    "description": "`multipart/form-data`: `files` plus `template_id` — id of the permanent document template from the requirements\n(`personal.permanent_document` / `business.permanent_document`, the template file is at its `url`). The filled\nand signed form is encrypted, sent to the provider and attached to the identity permanently.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Uploads the document to the number provider (DIDWW) and attaches it to the identity."
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Verification requirements for a prefix or a number",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-verifications/requirements",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-verifications",
                    "requirements"
                  ],
                  "query": [
                    {
                      "key": "prefix_id",
                      "value": "9",
                      "description": "Prefix id (`GET /phone-prefixes`).",
                      "disabled": true
                    },
                    {
                      "key": "phone_id",
                      "value": "35",
                      "description": "Id of a number of your company.",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Tells whether owner verification is required and which identity fields and documents the regulator demands.\nPass `prefix_id` (a `phone-prefix` id — before buying) or `phone_id` (a number of your company — after buying;\ntakes precedence). `required: false` means the number can be used without documents. When `required: true`,\n`requirement` describes, separately for `personal` and `business` identities: mandatory identity fields,\nhow many proofs are needed (`proof_qty`), accepted proof types (use their `id` as `proof_type_id` when uploading),\nthe permanent document template (`template_id`), the one-time document for the request itself, and the address\nproof rules. `identity_type` limits which identity kind is accepted (`personal`, `business` or `any`).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None (reads the requirement from the number provider)."
              },
              "response": [
                {
                  "name": "200 Requirement.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications/requirements",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications",
                        "requirements"
                      ],
                      "query": [
                        {
                          "key": "prefix_id",
                          "value": "9",
                          "description": "Prefix id (`GET /phone-prefixes`).",
                          "disabled": true
                        },
                        {
                          "key": "phone_id",
                          "value": "35",
                          "description": "Id of a number of your company.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Tells whether owner verification is required and which identity fields and documents the regulator demands.\nPass `prefix_id` (a `phone-prefix` id — before buying) or `phone_id` (a number of your company — after buying;\ntakes precedence). `required: false` means the number can be used without documents. When `required: true`,\n`requirement` describes, separately for `personal` and `business` identities: mandatory identity fields,\nhow many proofs are needed (`proof_qty`), accepted proof types (use their `id` as `proof_type_id` when uploading),\nthe permanent document template (`template_id`), the one-time document for the request itself, and the address\nproof rules. `identity_type` limits which identity kind is accepted (`personal`, `business` or `any`).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None (reads the requirement from the number provider)."
                  },
                  "status": "Requirement.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"required\": true,\n  \"requirement\": {\n    \"id\": \"a1b2c3d4-0000-4000-8000-000000000007\",\n    \"identity_type\": \"any\",\n    \"service_description_required\": false,\n    \"restriction_message\": null,\n    \"personal\": {\n      \"area_level\": \"country\",\n      \"proof_qty\": 1,\n      \"mandatory_fields\": [\n        \"first_name\",\n        \"last_name\",\n        \"birth_date\",\n        \"id_number\"\n      ],\n      \"proof_types\": [\n        {\n          \"id\": \"7f0e1d2c-0000-4000-8000-000000000002\",\n          \"name\": \"Passport\"\n        }\n      ],\n      \"permanent_document\": null,\n      \"onetime_document\": null\n    },\n    \"business\": {\n      \"area_level\": \"country\",\n      \"proof_qty\": 1,\n      \"mandatory_fields\": [\n        \"company_name\",\n        \"company_reg_number\"\n      ],\n      \"proof_types\": [\n        {\n          \"id\": \"7f0e1d2c-0000-4000-8000-000000000008\",\n          \"name\": \"Company registration certificate\"\n        }\n      ],\n      \"permanent_document\": {\n        \"id\": \"5e4d3c2b-0000-4000-8000-000000000005\",\n        \"name\": \"Letter of authorization\",\n        \"url\": \"https://example.com/templates/loa.pdf\"\n      },\n      \"onetime_document\": null\n    },\n    \"address\": {\n      \"area_level\": \"country\",\n      \"proof_qty\": 1,\n      \"proof_types\": [\n        {\n          \"id\": \"7f0e1d2c-0000-4000-8000-000000000003\",\n          \"name\": \"Utility bill\"\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "400 `prefix_id or phone_id is required`, `Phone prefix not found`, `User has no company`, or a provider error (e.g. `DIDWW: cannot resolve verification requirements for 380441234567`).",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications/requirements",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications",
                        "requirements"
                      ],
                      "query": [
                        {
                          "key": "prefix_id",
                          "value": "9",
                          "description": "Prefix id (`GET /phone-prefixes`).",
                          "disabled": true
                        },
                        {
                          "key": "phone_id",
                          "value": "35",
                          "description": "Id of a number of your company.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Tells whether owner verification is required and which identity fields and documents the regulator demands.\nPass `prefix_id` (a `phone-prefix` id — before buying) or `phone_id` (a number of your company — after buying;\ntakes precedence). `required: false` means the number can be used without documents. When `required: true`,\n`requirement` describes, separately for `personal` and `business` identities: mandatory identity fields,\nhow many proofs are needed (`proof_qty`), accepted proof types (use their `id` as `proof_type_id` when uploading),\nthe permanent document template (`template_id`), the one-time document for the request itself, and the address\nproof rules. `identity_type` limits which identity kind is accepted (`personal`, `business` or `any`).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None (reads the requirement from the number provider)."
                  },
                  "status": "`prefix_id or phone_id is required`, `Phone prefix not found`, `User has no company`, or a provider error (e.g. `DIDWW: cannot resolve verification requirements for 380441234567`).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"prefix_id or phone_id is required\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications/requirements",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications",
                        "requirements"
                      ],
                      "query": [
                        {
                          "key": "prefix_id",
                          "value": "9",
                          "description": "Prefix id (`GET /phone-prefixes`).",
                          "disabled": true
                        },
                        {
                          "key": "phone_id",
                          "value": "35",
                          "description": "Id of a number of your company.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Tells whether owner verification is required and which identity fields and documents the regulator demands.\nPass `prefix_id` (a `phone-prefix` id — before buying) or `phone_id` (a number of your company — after buying;\ntakes precedence). `required: false` means the number can be used without documents. When `required: true`,\n`requirement` describes, separately for `personal` and `business` identities: mandatory identity fields,\nhow many proofs are needed (`proof_qty`), accepted proof types (use their `id` as `proof_type_id` when uploading),\nthe permanent document template (`template_id`), the one-time document for the request itself, and the address\nproof rules. `identity_type` limits which identity kind is accepted (`personal`, `business` or `any`).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None (reads the requirement from the number provider)."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications/requirements",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications",
                        "requirements"
                      ],
                      "query": [
                        {
                          "key": "prefix_id",
                          "value": "9",
                          "description": "Prefix id (`GET /phone-prefixes`).",
                          "disabled": true
                        },
                        {
                          "key": "phone_id",
                          "value": "35",
                          "description": "Id of a number of your company.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Tells whether owner verification is required and which identity fields and documents the regulator demands.\nPass `prefix_id` (a `phone-prefix` id — before buying) or `phone_id` (a number of your company — after buying;\ntakes precedence). `required: false` means the number can be used without documents. When `required: true`,\n`requirement` describes, separately for `personal` and `business` identities: mandatory identity fields,\nhow many proofs are needed (`proof_qty`), accepted proof types (use their `id` as `proof_type_id` when uploading),\nthe permanent document template (`template_id`), the one-time document for the request itself, and the address\nproof rules. `identity_type` limits which identity kind is accepted (`personal`, `business` or `any`).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None (reads the requirement from the number provider)."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 `Phone not found` — the number is not in your company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications/requirements",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications",
                        "requirements"
                      ],
                      "query": [
                        {
                          "key": "prefix_id",
                          "value": "9",
                          "description": "Prefix id (`GET /phone-prefixes`).",
                          "disabled": true
                        },
                        {
                          "key": "phone_id",
                          "value": "35",
                          "description": "Id of a number of your company.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Tells whether owner verification is required and which identity fields and documents the regulator demands.\nPass `prefix_id` (a `phone-prefix` id — before buying) or `phone_id` (a number of your company — after buying;\ntakes precedence). `required: false` means the number can be used without documents. When `required: true`,\n`requirement` describes, separately for `personal` and `business` identities: mandatory identity fields,\nhow many proofs are needed (`proof_qty`), accepted proof types (use their `id` as `proof_type_id` when uploading),\nthe permanent document template (`template_id`), the one-time document for the request itself, and the address\nproof rules. `identity_type` limits which identity kind is accepted (`personal`, `business` or `any`).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None (reads the requirement from the number provider)."
                  },
                  "status": "`Phone not found` — the number is not in your company.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Phone not found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Numbers awaiting verification",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-verifications/pending-phones",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-verifications",
                    "pending-phones"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Numbers of your company with `verificationRequired: true` and no `verifiedAt` yet, together with the status\nof the latest verification request for each (`none` — no request yet, `pending`, `rejected` with reasons).\nSuch numbers are bought but not yet active for calls.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Numbers awaiting verification (plain array).",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications/pending-phones",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications",
                        "pending-phones"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Numbers of your company with `verificationRequired: true` and no `verifiedAt` yet, together with the status\nof the latest verification request for each (`none` — no request yet, `pending`, `rejected` with reasons).\nSuch numbers are bought but not yet active for calls.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Numbers awaiting verification (plain array).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "[\n  {\n    \"phone_id\": 41,\n    \"fullnumber\": \"15551234567\",\n    \"verification_status\": \"rejected\",\n    \"verification_id\": 3,\n    \"reject_reasons\": [\n      \"Document is not readable\"\n    ],\n    \"reject_comment\": \"Please upload a colour scan\"\n  },\n  {\n    \"phone_id\": 42,\n    \"fullnumber\": \"15551234568\",\n    \"verification_status\": \"none\",\n    \"verification_id\": null,\n    \"reject_reasons\": null,\n    \"reject_comment\": null\n  }\n]"
                },
                {
                  "name": "400 The user has no company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications/pending-phones",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications",
                        "pending-phones"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Numbers of your company with `verificationRequired: true` and no `verifiedAt` yet, together with the status\nof the latest verification request for each (`none` — no request yet, `pending`, `rejected` with reasons).\nSuch numbers are bought but not yet active for calls.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The user has no company.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"User has no company\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications/pending-phones",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications",
                        "pending-phones"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Numbers of your company with `verificationRequired: true` and no `verifiedAt` yet, together with the status\nof the latest verification request for each (`none` — no request yet, `pending`, `rejected` with reasons).\nSuch numbers are bought but not yet active for calls.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications/pending-phones",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications",
                        "pending-phones"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Numbers of your company with `verificationRequired: true` and no `verifiedAt` yet, together with the status\nof the latest verification request for each (`none` — no request yet, `pending`, `rejected` with reasons).\nSuch numbers are bought but not yet active for calls.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "List verification requests",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-verifications",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-verifications"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "pending",
                      "description": "Filter by status.",
                      "disabled": true
                    },
                    {
                      "key": "phone_id",
                      "value": "41",
                      "description": "Only requests that include this number.",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Verification requests of your company, newest first, with numbers, identity and address (plain array). Optional filters `status` and `phone_id`.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Requests.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications"
                      ],
                      "query": [
                        {
                          "key": "status",
                          "value": "pending",
                          "description": "Filter by status.",
                          "disabled": true
                        },
                        {
                          "key": "phone_id",
                          "value": "41",
                          "description": "Only requests that include this number.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Verification requests of your company, newest first, with numbers, identity and address (plain array). Optional filters `status` and `phone_id`.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Requests.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "[\n  {\n    \"id\": 3,\n    \"status\": \"pending\",\n    \"reference\": \"AV-000123\",\n    \"service_description\": \"Customer support line\",\n    \"reject_reasons\": null,\n    \"reject_comment\": null,\n    \"createdAt\": \"2026-01-16T09:00:00.000Z\",\n    \"phones\": [\n      {\n        \"id\": 41,\n        \"fullnumber\": \"15551234567\"\n      }\n    ],\n    \"identity\": {\n      \"id\": 5,\n      \"identity_type\": \"business\",\n      \"first_name\": \"John\",\n      \"last_name\": \"Doe\",\n      \"company_name\": \"Example LLC\"\n    },\n    \"address\": {\n      \"id\": 8,\n      \"country_iso\": \"US\",\n      \"city_name\": \"New York\",\n      \"address\": \"1 Example St\"\n    }\n  }\n]"
                },
                {
                  "name": "400 The user has no company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications"
                      ],
                      "query": [
                        {
                          "key": "status",
                          "value": "pending",
                          "description": "Filter by status.",
                          "disabled": true
                        },
                        {
                          "key": "phone_id",
                          "value": "41",
                          "description": "Only requests that include this number.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Verification requests of your company, newest first, with numbers, identity and address (plain array). Optional filters `status` and `phone_id`.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The user has no company.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"User has no company\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications"
                      ],
                      "query": [
                        {
                          "key": "status",
                          "value": "pending",
                          "description": "Filter by status.",
                          "disabled": true
                        },
                        {
                          "key": "phone_id",
                          "value": "41",
                          "description": "Only requests that include this number.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Verification requests of your company, newest first, with numbers, identity and address (plain array). Optional filters `status` and `phone_id`.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications"
                      ],
                      "query": [
                        {
                          "key": "status",
                          "value": "pending",
                          "description": "Filter by status.",
                          "disabled": true
                        },
                        {
                          "key": "phone_id",
                          "value": "41",
                          "description": "Only requests that include this number.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Verification requests of your company, newest first, with numbers, identity and address (plain array). Optional filters `status` and `phone_id`.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Submit a verification request",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-verifications",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-verifications"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Submits bought numbers that require verification (`verificationRequired: true`, `verifiedAt: null`) to the\nprovider's compliance team together with an identity and one of its addresses. Accepts JSON\n`{ \"data\": { ... } }` or `multipart/form-data` with the same JSON as a string in the `data` field plus optional\none-time documents in `files` (when the requirement lists `onetime_document`). All numbers must belong to your\ncompany; a number may have only one `pending` request at a time. The result arrives asynchronously: the status\nbecomes `approved` (numbers get `verifiedAt` and are activated) or `rejected` (`reject_reasons`,\n`reject_comment`; submit a new request). Poll `GET /didww-verifications/{id}` or `pending-phones`; the company\nalso gets an in-app notification. Limit: 120 modifying requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates an address verification request at the number provider (DIDWW) and uploads the one-time documents. No charge. On approval the numbers are activated and a notification is sent.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"phone_ids\": [\n      41\n    ],\n    \"identity_id\": 5,\n    \"address_id\": 8,\n    \"service_description\": \"Customer support line\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created request (plain object).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Submits bought numbers that require verification (`verificationRequired: true`, `verifiedAt: null`) to the\nprovider's compliance team together with an identity and one of its addresses. Accepts JSON\n`{ \"data\": { ... } }` or `multipart/form-data` with the same JSON as a string in the `data` field plus optional\none-time documents in `files` (when the requirement lists `onetime_document`). All numbers must belong to your\ncompany; a number may have only one `pending` request at a time. The result arrives asynchronously: the status\nbecomes `approved` (numbers get `verifiedAt` and are activated) or `rejected` (`reject_reasons`,\n`reject_comment`; submit a new request). Poll `GET /didww-verifications/{id}` or `pending-phones`; the company\nalso gets an in-app notification. Limit: 120 modifying requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates an address verification request at the number provider (DIDWW) and uploads the one-time documents. No charge. On approval the numbers are activated and a notification is sent.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phone_ids\": [\n      41\n    ],\n    \"identity_id\": 5,\n    \"address_id\": 8,\n    \"service_description\": \"Customer support line\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created request (plain object).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 3,\n  \"status\": \"pending\",\n  \"reference\": \"AV-000123\",\n  \"service_description\": \"Customer support line\",\n  \"reject_reasons\": null,\n  \"reject_comment\": null,\n  \"createdAt\": \"2026-01-16T09:00:00.000Z\"\n}"
                },
                {
                  "name": "400 Validation error: `phone_ids is required`, `identity_id and address_id are required`, `Address does not belong to the selected identity`, `Phones do not need verification: 380441234567`, `Some of these phones already have a pending verification`, `Invalid JSON in data field`, `No files provided`, file type/size errors, `DIDWW DID not found for number ...`, or a provider error.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Submits bought numbers that require verification (`verificationRequired: true`, `verifiedAt: null`) to the\nprovider's compliance team together with an identity and one of its addresses. Accepts JSON\n`{ \"data\": { ... } }` or `multipart/form-data` with the same JSON as a string in the `data` field plus optional\none-time documents in `files` (when the requirement lists `onetime_document`). All numbers must belong to your\ncompany; a number may have only one `pending` request at a time. The result arrives asynchronously: the status\nbecomes `approved` (numbers get `verifiedAt` and are activated) or `rejected` (`reject_reasons`,\n`reject_comment`; submit a new request). Poll `GET /didww-verifications/{id}` or `pending-phones`; the company\nalso gets an in-app notification. Limit: 120 modifying requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates an address verification request at the number provider (DIDWW) and uploads the one-time documents. No charge. On approval the numbers are activated and a notification is sent.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phone_ids\": [\n      41\n    ],\n    \"identity_id\": 5,\n    \"address_id\": 8,\n    \"service_description\": \"Customer support line\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error: `phone_ids is required`, `identity_id and address_id are required`, `Address does not belong to the selected identity`, `Phones do not need verification: 380441234567`, `Some of these phones already have a pending verification`, `Invalid JSON in data field`, `No files provided`, file type/size errors, `DIDWW DID not found for number ...`, or a provider error.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Some of these phones already have a pending verification\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Submits bought numbers that require verification (`verificationRequired: true`, `verifiedAt: null`) to the\nprovider's compliance team together with an identity and one of its addresses. Accepts JSON\n`{ \"data\": { ... } }` or `multipart/form-data` with the same JSON as a string in the `data` field plus optional\none-time documents in `files` (when the requirement lists `onetime_document`). All numbers must belong to your\ncompany; a number may have only one `pending` request at a time. The result arrives asynchronously: the status\nbecomes `approved` (numbers get `verifiedAt` and are activated) or `rejected` (`reject_reasons`,\n`reject_comment`; submit a new request). Poll `GET /didww-verifications/{id}` or `pending-phones`; the company\nalso gets an in-app notification. Limit: 120 modifying requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates an address verification request at the number provider (DIDWW) and uploads the one-time documents. No charge. On approval the numbers are activated and a notification is sent.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phone_ids\": [\n      41\n    ],\n    \"identity_id\": 5,\n    \"address_id\": 8,\n    \"service_description\": \"Customer support line\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 No permission, or the company is disabled (`Company disabled`).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Submits bought numbers that require verification (`verificationRequired: true`, `verifiedAt: null`) to the\nprovider's compliance team together with an identity and one of its addresses. Accepts JSON\n`{ \"data\": { ... } }` or `multipart/form-data` with the same JSON as a string in the `data` field plus optional\none-time documents in `files` (when the requirement lists `onetime_document`). All numbers must belong to your\ncompany; a number may have only one `pending` request at a time. The result arrives asynchronously: the status\nbecomes `approved` (numbers get `verifiedAt` and are activated) or `rejected` (`reject_reasons`,\n`reject_comment`; submit a new request). Poll `GET /didww-verifications/{id}` or `pending-phones`; the company\nalso gets an in-app notification. Limit: 120 modifying requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates an address verification request at the number provider (DIDWW) and uploads the one-time documents. No charge. On approval the numbers are activated and a notification is sent.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phone_ids\": [\n      41\n    ],\n    \"identity_id\": 5,\n    \"address_id\": 8,\n    \"service_description\": \"Customer support line\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "No permission, or the company is disabled (`Company disabled`).",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Company disabled\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 `Identity not found`, `Address not found`, `Some phones not found in your company`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Submits bought numbers that require verification (`verificationRequired: true`, `verifiedAt: null`) to the\nprovider's compliance team together with an identity and one of its addresses. Accepts JSON\n`{ \"data\": { ... } }` or `multipart/form-data` with the same JSON as a string in the `data` field plus optional\none-time documents in `files` (when the requirement lists `onetime_document`). All numbers must belong to your\ncompany; a number may have only one `pending` request at a time. The result arrives asynchronously: the status\nbecomes `approved` (numbers get `verifiedAt` and are activated) or `rejected` (`reject_reasons`,\n`reject_comment`; submit a new request). Poll `GET /didww-verifications/{id}` or `pending-phones`; the company\nalso gets an in-app notification. Limit: 120 modifying requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates an address verification request at the number provider (DIDWW) and uploads the one-time documents. No charge. On approval the numbers are activated and a notification is sent.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phone_ids\": [\n      41\n    ],\n    \"identity_id\": 5,\n    \"address_id\": 8,\n    \"service_description\": \"Customer support line\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`Identity not found`, `Address not found`, `Some phones not found in your company`.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Some phones not found in your company\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Submits bought numbers that require verification (`verificationRequired: true`, `verifiedAt: null`) to the\nprovider's compliance team together with an identity and one of its addresses. Accepts JSON\n`{ \"data\": { ... } }` or `multipart/form-data` with the same JSON as a string in the `data` field plus optional\none-time documents in `files` (when the requirement lists `onetime_document`). All numbers must belong to your\ncompany; a number may have only one `pending` request at a time. The result arrives asynchronously: the status\nbecomes `approved` (numbers get `verifiedAt` and are activated) or `rejected` (`reject_reasons`,\n`reject_comment`; submit a new request). Poll `GET /didww-verifications/{id}` or `pending-phones`; the company\nalso gets an in-app notification. Limit: 120 modifying requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates an address verification request at the number provider (DIDWW) and uploads the one-time documents. No charge. On approval the numbers are activated and a notification is sent.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phone_ids\": [\n      41\n    ],\n    \"identity_id\": 5,\n    \"address_id\": 8,\n    \"service_description\": \"Customer support line\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get a verification request",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/didww-verifications/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "didww-verifications",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "3",
                      "description": "Request id."
                    }
                  ]
                },
                "description": "One verification request of your company with numbers, identity and address.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 The request.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "Request id."
                        }
                      ]
                    },
                    "description": "One verification request of your company with numbers, identity and address.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The request.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 3,\n  \"status\": \"rejected\",\n  \"reference\": \"AV-000123\",\n  \"service_description\": \"Customer support line\",\n  \"reject_reasons\": [\n    \"Document is not readable\"\n  ],\n  \"reject_comment\": \"Please upload a colour scan\",\n  \"createdAt\": \"2026-01-16T09:00:00.000Z\",\n  \"phones\": [\n    {\n      \"id\": 41,\n      \"fullnumber\": \"15551234567\"\n    }\n  ],\n  \"identity\": {\n    \"id\": 5,\n    \"identity_type\": \"business\",\n    \"first_name\": \"John\",\n    \"last_name\": \"Doe\",\n    \"company_name\": \"Example LLC\"\n  },\n  \"address\": {\n    \"id\": 8,\n    \"country_iso\": \"US\",\n    \"city_name\": \"New York\",\n    \"address\": \"1 Example St\"\n  }\n}"
                },
                {
                  "name": "400 The user has no company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "Request id."
                        }
                      ]
                    },
                    "description": "One verification request of your company with numbers, identity and address.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The user has no company.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"User has no company\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "Request id."
                        }
                      ]
                    },
                    "description": "One verification request of your company with numbers, identity and address.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "Request id."
                        }
                      ]
                    },
                    "description": "One verification request of your company with numbers, identity and address.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 `Verification not found`.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/didww-verifications/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "didww-verifications",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "Request id."
                        }
                      ]
                    },
                    "description": "One verification request of your company with numbers, identity and address.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "`Verification not found`.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Verification not found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Add an external (own) number via SIP trunk",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sip-trunks/add-external-number",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sip-trunks",
                    "add-external-number"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "An external number (BYON) is a number you already own at another operator and connect to the platform through a\nSIP trunk (`sip_trunk` — id of your trunk, see the SIP group). This call only registers the number in a\n\"pending verification\" state (`verifiedAt: null`, `reserved: true`, class `exclusive`, 100 channels). Nothing is\ncharged yet. Next steps: `POST /sip-trunks/external-numbers/{phone_id}/request-verification` (SMS with a code\nto the number) and `.../confirm-verification` (activates the number and starts the monthly subscription).\n\n`phone` accepts any formatting (`+38 (044) 123-45-67`); it is normalised to E.164 digits without plus and\nstored in `fullnumber`. The number must be a valid phone number and must not exist on the platform yet.\nBody is a flat object (no `data` envelope).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates the number record in your company (not active). If the trunk uses login/password credentials, a registration for the number is created in the telephony core.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"+380441234567\",\n  \"sip_trunk\": 3\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created external number.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/add-external-number",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "add-external-number"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "An external number (BYON) is a number you already own at another operator and connect to the platform through a\nSIP trunk (`sip_trunk` — id of your trunk, see the SIP group). This call only registers the number in a\n\"pending verification\" state (`verifiedAt: null`, `reserved: true`, class `exclusive`, 100 channels). Nothing is\ncharged yet. Next steps: `POST /sip-trunks/external-numbers/{phone_id}/request-verification` (SMS with a code\nto the number) and `.../confirm-verification` (activates the number and starts the monthly subscription).\n\n`phone` accepts any formatting (`+38 (044) 123-45-67`); it is normalised to E.164 digits without plus and\nstored in `fullnumber`. The number must be a valid phone number and must not exist on the platform yet.\nBody is a flat object (no `data` envelope).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates the number record in your company (not active). If the trunk uses login/password credentials, a registration for the number is created in the telephony core.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": \"+380441234567\",\n  \"sip_trunk\": 3\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created external number.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 77,\n    \"attributes\": {\n      \"fullnumber\": \"380441234567\",\n      \"verifiedAt\": null\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error: `phone and sip_trunk are required fields`, `phone is required`, `Invalid phone number: <input>`, `Phone already exist`, `Active company is required`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/add-external-number",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "add-external-number"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "An external number (BYON) is a number you already own at another operator and connect to the platform through a\nSIP trunk (`sip_trunk` — id of your trunk, see the SIP group). This call only registers the number in a\n\"pending verification\" state (`verifiedAt: null`, `reserved: true`, class `exclusive`, 100 channels). Nothing is\ncharged yet. Next steps: `POST /sip-trunks/external-numbers/{phone_id}/request-verification` (SMS with a code\nto the number) and `.../confirm-verification` (activates the number and starts the monthly subscription).\n\n`phone` accepts any formatting (`+38 (044) 123-45-67`); it is normalised to E.164 digits without plus and\nstored in `fullnumber`. The number must be a valid phone number and must not exist on the platform yet.\nBody is a flat object (no `data` envelope).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates the number record in your company (not active). If the trunk uses login/password credentials, a registration for the number is created in the telephony core.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": \"+380441234567\",\n  \"sip_trunk\": 3\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error: `phone and sip_trunk are required fields`, `phone is required`, `Invalid phone number: <input>`, `Phone already exist`, `Active company is required`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Phone already exist\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/add-external-number",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "add-external-number"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "An external number (BYON) is a number you already own at another operator and connect to the platform through a\nSIP trunk (`sip_trunk` — id of your trunk, see the SIP group). This call only registers the number in a\n\"pending verification\" state (`verifiedAt: null`, `reserved: true`, class `exclusive`, 100 channels). Nothing is\ncharged yet. Next steps: `POST /sip-trunks/external-numbers/{phone_id}/request-verification` (SMS with a code\nto the number) and `.../confirm-verification` (activates the number and starts the monthly subscription).\n\n`phone` accepts any formatting (`+38 (044) 123-45-67`); it is normalised to E.164 digits without plus and\nstored in `fullnumber`. The number must be a valid phone number and must not exist on the platform yet.\nBody is a flat object (no `data` envelope).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates the number record in your company (not active). If the trunk uses login/password credentials, a registration for the number is created in the telephony core.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": \"+380441234567\",\n  \"sip_trunk\": 3\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 No permission, or the company is disabled (`Company disabled`).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/add-external-number",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "add-external-number"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "An external number (BYON) is a number you already own at another operator and connect to the platform through a\nSIP trunk (`sip_trunk` — id of your trunk, see the SIP group). This call only registers the number in a\n\"pending verification\" state (`verifiedAt: null`, `reserved: true`, class `exclusive`, 100 channels). Nothing is\ncharged yet. Next steps: `POST /sip-trunks/external-numbers/{phone_id}/request-verification` (SMS with a code\nto the number) and `.../confirm-verification` (activates the number and starts the monthly subscription).\n\n`phone` accepts any formatting (`+38 (044) 123-45-67`); it is normalised to E.164 digits without plus and\nstored in `fullnumber`. The number must be a valid phone number and must not exist on the platform yet.\nBody is a flat object (no `data` envelope).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates the number record in your company (not active). If the trunk uses login/password credentials, a registration for the number is created in the telephony core.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": \"+380441234567\",\n  \"sip_trunk\": 3\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "No permission, or the company is disabled (`Company disabled`).",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Company disabled\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 `SIP trunk not found` — the trunk is not in your company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/add-external-number",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "add-external-number"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "An external number (BYON) is a number you already own at another operator and connect to the platform through a\nSIP trunk (`sip_trunk` — id of your trunk, see the SIP group). This call only registers the number in a\n\"pending verification\" state (`verifiedAt: null`, `reserved: true`, class `exclusive`, 100 channels). Nothing is\ncharged yet. Next steps: `POST /sip-trunks/external-numbers/{phone_id}/request-verification` (SMS with a code\nto the number) and `.../confirm-verification` (activates the number and starts the monthly subscription).\n\n`phone` accepts any formatting (`+38 (044) 123-45-67`); it is normalised to E.164 digits without plus and\nstored in `fullnumber`. The number must be a valid phone number and must not exist on the platform yet.\nBody is a flat object (no `data` envelope).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates the number record in your company (not active). If the trunk uses login/password credentials, a registration for the number is created in the telephony core.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": \"+380441234567\",\n  \"sip_trunk\": 3\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`SIP trunk not found` — the trunk is not in your company.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"SIP trunk not found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Change an external number",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sip-trunks/update-external-number/:id/:phone_id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sip-trunks",
                    "update-external-number",
                    ":id",
                    ":phone_id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "3",
                      "description": "SIP trunk id."
                    },
                    {
                      "key": "phone_id",
                      "value": "77",
                      "description": "External number id."
                    }
                  ]
                },
                "description": "Changes the digits and/or the channel limit of an external number attached to trunk `id`. `phone` is required\n(send the current value if only `channels` changes); `channels` defaults to 100 when omitted. Changing the digits\ndoes not reset verification. Body is a flat object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions routing and trunk registration for the number in the telephony core.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"+380441234567\",\n  \"channels\": 10\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated number.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/update-external-number/:id/:phone_id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "update-external-number",
                        ":id",
                        ":phone_id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "SIP trunk id."
                        },
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Changes the digits and/or the channel limit of an external number attached to trunk `id`. `phone` is required\n(send the current value if only `channels` changes); `channels` defaults to 100 when omitted. Changing the digits\ndoes not reset verification. Body is a flat object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions routing and trunk registration for the number in the telephony core.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": \"+380441234567\",\n  \"channels\": 10\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated number.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 77,\n    \"attributes\": {\n      \"fullnumber\": \"380441234567\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 `phone are required fields`, `Invalid phone number: <input>`, `Phone already exist`, `Active company is required`.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/update-external-number/:id/:phone_id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "update-external-number",
                        ":id",
                        ":phone_id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "SIP trunk id."
                        },
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Changes the digits and/or the channel limit of an external number attached to trunk `id`. `phone` is required\n(send the current value if only `channels` changes); `channels` defaults to 100 when omitted. Changing the digits\ndoes not reset verification. Body is a flat object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions routing and trunk registration for the number in the telephony core.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": \"+380441234567\",\n  \"channels\": 10\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`phone are required fields`, `Invalid phone number: <input>`, `Phone already exist`, `Active company is required`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"phone are required fields\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/update-external-number/:id/:phone_id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "update-external-number",
                        ":id",
                        ":phone_id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "SIP trunk id."
                        },
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Changes the digits and/or the channel limit of an external number attached to trunk `id`. `phone` is required\n(send the current value if only `channels` changes); `channels` defaults to 100 when omitted. Changing the digits\ndoes not reset verification. Body is a flat object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions routing and trunk registration for the number in the telephony core.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": \"+380441234567\",\n  \"channels\": 10\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 No permission, or the company is disabled (`Company disabled`).",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/update-external-number/:id/:phone_id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "update-external-number",
                        ":id",
                        ":phone_id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "SIP trunk id."
                        },
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Changes the digits and/or the channel limit of an external number attached to trunk `id`. `phone` is required\n(send the current value if only `channels` changes); `channels` defaults to 100 when omitted. Changing the digits\ndoes not reset verification. Body is a flat object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions routing and trunk registration for the number in the telephony core.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": \"+380441234567\",\n  \"channels\": 10\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "No permission, or the company is disabled (`Company disabled`).",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Company disabled\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 `SIP trunk not found` or `External number not found` (number is not on this trunk).",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/update-external-number/:id/:phone_id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "update-external-number",
                        ":id",
                        ":phone_id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "SIP trunk id."
                        },
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Changes the digits and/or the channel limit of an external number attached to trunk `id`. `phone` is required\n(send the current value if only `channels` changes); `channels` defaults to 100 when omitted. Changing the digits\ndoes not reset verification. Body is a flat object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions routing and trunk registration for the number in the telephony core.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"phone\": \"+380441234567\",\n  \"channels\": 10\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`SIP trunk not found` or `External number not found` (number is not on this trunk).",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"External number not found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete an external number",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sip-trunks/delete-external-number/:id/:phone_id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sip-trunks",
                    "delete-external-number",
                    ":id",
                    ":phone_id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "3",
                      "description": "SIP trunk id."
                    },
                    {
                      "key": "phone_id",
                      "value": "77",
                      "description": "External number id."
                    }
                  ]
                },
                "description": "Removes the external number from trunk `id`: cancels (deletes) its monthly subscription and deletes the number\nrecord. No refund for the current period. If the number is not found on the trunk the response is `data: null`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the number record and its subscription; unregisters the number in the telephony core."
              },
              "response": [
                {
                  "name": "200 Deleted number (or `data: null` if not found).",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/delete-external-number/:id/:phone_id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "delete-external-number",
                        ":id",
                        ":phone_id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "SIP trunk id."
                        },
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Removes the external number from trunk `id`: cancels (deletes) its monthly subscription and deletes the number\nrecord. No refund for the current period. If the number is not found on the trunk the response is `data: null`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the number record and its subscription; unregisters the number in the telephony core."
                  },
                  "status": "Deleted number (or `data: null` if not found).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 77,\n    \"attributes\": {\n      \"fullnumber\": \"380441234567\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 `Active company is required`.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/delete-external-number/:id/:phone_id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "delete-external-number",
                        ":id",
                        ":phone_id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "SIP trunk id."
                        },
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Removes the external number from trunk `id`: cancels (deletes) its monthly subscription and deletes the number\nrecord. No refund for the current period. If the number is not found on the trunk the response is `data: null`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the number record and its subscription; unregisters the number in the telephony core."
                  },
                  "status": "`Active company is required`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Active company is required\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/delete-external-number/:id/:phone_id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "delete-external-number",
                        ":id",
                        ":phone_id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "SIP trunk id."
                        },
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Removes the external number from trunk `id`: cancels (deletes) its monthly subscription and deletes the number\nrecord. No refund for the current period. If the number is not found on the trunk the response is `data: null`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the number record and its subscription; unregisters the number in the telephony core."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 No permission, or the company is disabled (`Company disabled`).",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/delete-external-number/:id/:phone_id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "delete-external-number",
                        ":id",
                        ":phone_id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "SIP trunk id."
                        },
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Removes the external number from trunk `id`: cancels (deletes) its monthly subscription and deletes the number\nrecord. No refund for the current period. If the number is not found on the trunk the response is `data: null`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the number record and its subscription; unregisters the number in the telephony core."
                  },
                  "status": "No permission, or the company is disabled (`Company disabled`).",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Company disabled\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 `SIP trunk not found`.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/delete-external-number/:id/:phone_id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "delete-external-number",
                        ":id",
                        ":phone_id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "SIP trunk id."
                        },
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Removes the external number from trunk `id`: cancels (deletes) its monthly subscription and deletes the number\nrecord. No refund for the current period. If the number is not found on the trunk the response is `data: null`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the number record and its subscription; unregisters the number in the telephony core."
                  },
                  "status": "`SIP trunk not found`.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"SIP trunk not found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Send a verification code to an external number",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/request-verification",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sip-trunks",
                    "external-numbers",
                    ":phone_id",
                    "request-verification"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "phone_id",
                      "value": "77",
                      "description": "External number id."
                    }
                  ]
                },
                "description": "Proves that you own the external number: generates a 4-digit code and sends it by SMS to the number\n(sender `OnePhone`; text `OnePhone verification code: 1234. Expires in 5 min.`). The code is valid for\n5 minutes (`expiresIn`), can be re-requested after 30 seconds (`resendIn`), at most 3 SMS per hour per number,\nand allows 3 wrong attempts (`attemptsAllowed`). Each SMS costs 0.20 (in the company's balance currency) and is\ncharged from the balance; the balance must cover it. Only for not-yet-verified numbers of your company.\nNo request body.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Sends an SMS with a one-time code to the number and charges 0.20 (company currency) from the balance (a payment record is created); the SMS is stored in the company's SMS history."
              },
              "response": [
                {
                  "name": "200 Code sent.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/request-verification",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "external-numbers",
                        ":phone_id",
                        "request-verification"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Proves that you own the external number: generates a 4-digit code and sends it by SMS to the number\n(sender `OnePhone`; text `OnePhone verification code: 1234. Expires in 5 min.`). The code is valid for\n5 minutes (`expiresIn`), can be re-requested after 30 seconds (`resendIn`), at most 3 SMS per hour per number,\nand allows 3 wrong attempts (`attemptsAllowed`). Each SMS costs 0.20 (in the company's balance currency) and is\ncharged from the balance; the balance must cover it. Only for not-yet-verified numbers of your company.\nNo request body.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Sends an SMS with a one-time code to the number and charges 0.20 (company currency) from the balance (a payment record is created); the SMS is stored in the company's SMS history."
                  },
                  "status": "Code sent.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"attributes\": {\n      \"expiresIn\": 300,\n      \"resendIn\": 30,\n      \"attemptsAllowed\": 3\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 `Phone already verified`, `Active company is required`, `Not enough money on balance`, `Wait 25s before resending`, `Too many SMS sent. Try again in 42 min`, `Verification request failed`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/request-verification",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "external-numbers",
                        ":phone_id",
                        "request-verification"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Proves that you own the external number: generates a 4-digit code and sends it by SMS to the number\n(sender `OnePhone`; text `OnePhone verification code: 1234. Expires in 5 min.`). The code is valid for\n5 minutes (`expiresIn`), can be re-requested after 30 seconds (`resendIn`), at most 3 SMS per hour per number,\nand allows 3 wrong attempts (`attemptsAllowed`). Each SMS costs 0.20 (in the company's balance currency) and is\ncharged from the balance; the balance must cover it. Only for not-yet-verified numbers of your company.\nNo request body.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Sends an SMS with a one-time code to the number and charges 0.20 (company currency) from the balance (a payment record is created); the SMS is stored in the company's SMS history."
                  },
                  "status": "`Phone already verified`, `Active company is required`, `Not enough money on balance`, `Wait 25s before resending`, `Too many SMS sent. Try again in 42 min`, `Verification request failed`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"Not enough money on balance\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/request-verification",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "external-numbers",
                        ":phone_id",
                        "request-verification"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Proves that you own the external number: generates a 4-digit code and sends it by SMS to the number\n(sender `OnePhone`; text `OnePhone verification code: 1234. Expires in 5 min.`). The code is valid for\n5 minutes (`expiresIn`), can be re-requested after 30 seconds (`resendIn`), at most 3 SMS per hour per number,\nand allows 3 wrong attempts (`attemptsAllowed`). Each SMS costs 0.20 (in the company's balance currency) and is\ncharged from the balance; the balance must cover it. Only for not-yet-verified numbers of your company.\nNo request body.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Sends an SMS with a one-time code to the number and charges 0.20 (company currency) from the balance (a payment record is created); the SMS is stored in the company's SMS history."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 No permission, or the company is disabled (`Company disabled`).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/request-verification",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "external-numbers",
                        ":phone_id",
                        "request-verification"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Proves that you own the external number: generates a 4-digit code and sends it by SMS to the number\n(sender `OnePhone`; text `OnePhone verification code: 1234. Expires in 5 min.`). The code is valid for\n5 minutes (`expiresIn`), can be re-requested after 30 seconds (`resendIn`), at most 3 SMS per hour per number,\nand allows 3 wrong attempts (`attemptsAllowed`). Each SMS costs 0.20 (in the company's balance currency) and is\ncharged from the balance; the balance must cover it. Only for not-yet-verified numbers of your company.\nNo request body.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Sends an SMS with a one-time code to the number and charges 0.20 (company currency) from the balance (a payment record is created); the SMS is stored in the company's SMS history."
                  },
                  "status": "No permission, or the company is disabled (`Company disabled`).",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Company disabled\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 `External number not found` — not an external number of your company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/request-verification",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "external-numbers",
                        ":phone_id",
                        "request-verification"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Proves that you own the external number: generates a 4-digit code and sends it by SMS to the number\n(sender `OnePhone`; text `OnePhone verification code: 1234. Expires in 5 min.`). The code is valid for\n5 minutes (`expiresIn`), can be re-requested after 30 seconds (`resendIn`), at most 3 SMS per hour per number,\nand allows 3 wrong attempts (`attemptsAllowed`). Each SMS costs 0.20 (in the company's balance currency) and is\ncharged from the balance; the balance must cover it. Only for not-yet-verified numbers of your company.\nNo request body.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Sends an SMS with a one-time code to the number and charges 0.20 (company currency) from the balance (a payment record is created); the SMS is stored in the company's SMS history."
                  },
                  "status": "`External number not found` — not an external number of your company.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"External number not found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Confirm the code and activate an external number",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/confirm-verification",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sip-trunks",
                    "external-numbers",
                    ":phone_id",
                    "confirm-verification"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "phone_id",
                      "value": "77",
                      "description": "External number id."
                    }
                  ]
                },
                "description": "Checks the SMS code. On success the number is activated: the balance is checked for the monthly fee of 8\n(company's balance currency), a monthly subscription for the external number is created (`active` =\n`auto_renewal`, default `true`), the first month is charged immediately, and the number gets `verifiedAt` and\n`reserved: false`. Wrong code decrements the attempts; after 3 wrong attempts the code is dropped and a new one\nmust be requested. Body may be flat or wrapped in `data`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Charges 8 (company balance currency) from the balance for the first month, creates a monthly subscription (auto-renew on unless `auto_renewal: false`), activates the number.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"code\": \"0427\",\n  \"auto_renewal\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Number activated.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/confirm-verification",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "external-numbers",
                        ":phone_id",
                        "confirm-verification"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Checks the SMS code. On success the number is activated: the balance is checked for the monthly fee of 8\n(company's balance currency), a monthly subscription for the external number is created (`active` =\n`auto_renewal`, default `true`), the first month is charged immediately, and the number gets `verifiedAt` and\n`reserved: false`. Wrong code decrements the attempts; after 3 wrong attempts the code is dropped and a new one\nmust be requested. Body may be flat or wrapped in `data`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Charges 8 (company balance currency) from the balance for the first month, creates a monthly subscription (auto-renew on unless `auto_renewal: false`), activates the number.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"code\": \"0427\",\n  \"auto_renewal\": true\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Number activated.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 77,\n    \"attributes\": {\n      \"fullnumber\": \"380441234567\",\n      \"verifiedAt\": \"2026-01-15T10:30:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 `code is required`, `Phone already verified`, `Active company is required`, `No active verification code. Request a new one.`, `Wrong code. 2 attempts left.`, `Too many wrong attempts. Request a new code.`, `Not enough money on balance`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/confirm-verification",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "external-numbers",
                        ":phone_id",
                        "confirm-verification"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Checks the SMS code. On success the number is activated: the balance is checked for the monthly fee of 8\n(company's balance currency), a monthly subscription for the external number is created (`active` =\n`auto_renewal`, default `true`), the first month is charged immediately, and the number gets `verifiedAt` and\n`reserved: false`. Wrong code decrements the attempts; after 3 wrong attempts the code is dropped and a new one\nmust be requested. Body may be flat or wrapped in `data`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Charges 8 (company balance currency) from the balance for the first month, creates a monthly subscription (auto-renew on unless `auto_renewal: false`), activates the number.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"code\": \"0427\",\n  \"auto_renewal\": true\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`code is required`, `Phone already verified`, `Active company is required`, `No active verification code. Request a new one.`, `Wrong code. 2 attempts left.`, `Too many wrong attempts. Request a new code.`, `Not enough money on balance`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Wrong code. 2 attempts left.\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/confirm-verification",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "external-numbers",
                        ":phone_id",
                        "confirm-verification"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Checks the SMS code. On success the number is activated: the balance is checked for the monthly fee of 8\n(company's balance currency), a monthly subscription for the external number is created (`active` =\n`auto_renewal`, default `true`), the first month is charged immediately, and the number gets `verifiedAt` and\n`reserved: false`. Wrong code decrements the attempts; after 3 wrong attempts the code is dropped and a new one\nmust be requested. Body may be flat or wrapped in `data`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Charges 8 (company balance currency) from the balance for the first month, creates a monthly subscription (auto-renew on unless `auto_renewal: false`), activates the number.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"code\": \"0427\",\n  \"auto_renewal\": true\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 No permission, or the company is disabled (`Company disabled`).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/confirm-verification",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "external-numbers",
                        ":phone_id",
                        "confirm-verification"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Checks the SMS code. On success the number is activated: the balance is checked for the monthly fee of 8\n(company's balance currency), a monthly subscription for the external number is created (`active` =\n`auto_renewal`, default `true`), the first month is charged immediately, and the number gets `verifiedAt` and\n`reserved: false`. Wrong code decrements the attempts; after 3 wrong attempts the code is dropped and a new one\nmust be requested. Body may be flat or wrapped in `data`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Charges 8 (company balance currency) from the balance for the first month, creates a monthly subscription (auto-renew on unless `auto_renewal: false`), activates the number.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"code\": \"0427\",\n  \"auto_renewal\": true\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "No permission, or the company is disabled (`Company disabled`).",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Company disabled\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 `External number not found`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/confirm-verification",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "external-numbers",
                        ":phone_id",
                        "confirm-verification"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Checks the SMS code. On success the number is activated: the balance is checked for the monthly fee of 8\n(company's balance currency), a monthly subscription for the external number is created (`active` =\n`auto_renewal`, default `true`), the first month is charged immediately, and the number gets `verifiedAt` and\n`reserved: false`. Wrong code decrements the attempts; after 3 wrong attempts the code is dropped and a new one\nmust be requested. Body may be flat or wrapped in `data`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Charges 8 (company balance currency) from the balance for the first month, creates a monthly subscription (auto-renew on unless `auto_renewal: false`), activates the number.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"code\": \"0427\",\n  \"auto_renewal\": true\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`External number not found`.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"External number not found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Toggle auto-renewal of an external number",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/auto-renewal",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sip-trunks",
                    "external-numbers",
                    ":phone_id",
                    "auto-renewal"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "phone_id",
                      "value": "77",
                      "description": "External number id."
                    }
                  ]
                },
                "description": "Enables or disables monthly auto-renewal of the external number's subscription (`active`). With auto-renewal\noff the number stops working when the paid period ends. Returns the subscription id and the new state.\nBody may be flat or wrapped in `data`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Changes the subscription's `active` flag and sends an `autorenew_enabled` / `autorenew_cancelled` notification to the owner (Telegram and webhook).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"active\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 New state.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/auto-renewal",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "external-numbers",
                        ":phone_id",
                        "auto-renewal"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Enables or disables monthly auto-renewal of the external number's subscription (`active`). With auto-renewal\noff the number stops working when the paid period ends. Returns the subscription id and the new state.\nBody may be flat or wrapped in `data`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Changes the subscription's `active` flag and sends an `autorenew_enabled` / `autorenew_cancelled` notification to the owner (Telegram and webhook).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"active\": false\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "New state.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 910,\n    \"attributes\": {\n      \"active\": false\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 `active (boolean) is required`, `Active company is required`.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/auto-renewal",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "external-numbers",
                        ":phone_id",
                        "auto-renewal"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Enables or disables monthly auto-renewal of the external number's subscription (`active`). With auto-renewal\noff the number stops working when the paid period ends. Returns the subscription id and the new state.\nBody may be flat or wrapped in `data`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Changes the subscription's `active` flag and sends an `autorenew_enabled` / `autorenew_cancelled` notification to the owner (Telegram and webhook).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"active\": false\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`active (boolean) is required`, `Active company is required`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"active (boolean) is required\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/auto-renewal",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "external-numbers",
                        ":phone_id",
                        "auto-renewal"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Enables or disables monthly auto-renewal of the external number's subscription (`active`). With auto-renewal\noff the number stops working when the paid period ends. Returns the subscription id and the new state.\nBody may be flat or wrapped in `data`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Changes the subscription's `active` flag and sends an `autorenew_enabled` / `autorenew_cancelled` notification to the owner (Telegram and webhook).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"active\": false\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 No permission, or the company is disabled (`Company disabled`).",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/auto-renewal",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "external-numbers",
                        ":phone_id",
                        "auto-renewal"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Enables or disables monthly auto-renewal of the external number's subscription (`active`). With auto-renewal\noff the number stops working when the paid period ends. Returns the subscription id and the new state.\nBody may be flat or wrapped in `data`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Changes the subscription's `active` flag and sends an `autorenew_enabled` / `autorenew_cancelled` notification to the owner (Telegram and webhook).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"active\": false\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "No permission, or the company is disabled (`Company disabled`).",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Company disabled\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 `External number not found` or `Subscription for this number not found` (number not yet activated).",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/external-numbers/:phone_id/auto-renewal",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "external-numbers",
                        ":phone_id",
                        "auto-renewal"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "phone_id",
                          "value": "77",
                          "description": "External number id."
                        }
                      ]
                    },
                    "description": "Enables or disables monthly auto-renewal of the external number's subscription (`active`). With auto-renewal\noff the number stops working when the paid period ends. Returns the subscription id and the new state.\nBody may be flat or wrapped in `data`.\n\n\n**Required role:** Company owner (approved), Company owner (registered, not yet approved)\n\n**Side effects:** Changes the subscription's `active` flag and sends an `autorenew_enabled` / `autorenew_cancelled` notification to the owner (Telegram and webhook).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"active\": false\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`External number not found` or `Subscription for this number not found` (number not yet activated).",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Subscription for this number not found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            }
          ]
        },
        {
          "name": "SIP",
          "description": "SIP lines of employees, SIP trunks and SIP domains.",
          "item": [
            {
              "name": "My SIP line",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sip/my",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sip",
                    "my"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the SIP line (internal extension) of the authenticated employee together with the numbers that ring on it\n(`inPhones`), the outgoing line (`outPhone`), the SIP domain and the call groups the employee belongs to.\n\nUse it to configure a softphone or IP phone:\n- **Username / Auth user:** `<number>@<domain.name>.sip.onevoiplanet.com` (e.g. `001@example.sip.onevoiplanet.com`)\n- **Password:** the `password` field (returned by this method only, treat it as a secret)\n- **SIP server / registrar / realm:** `<domain.name>.sip.onevoiplanet.com`, port 5060 UDP\n- **WebRTC (browser):** `wss://<domain.name>.sip.onevoiplanet.com:443`\n\nThe response is a flat object (no Strapi `data/attributes` envelope). Returns an empty body if the employee has no SIP line.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 SIP line of the current user.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip/my",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip",
                        "my"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the SIP line (internal extension) of the authenticated employee together with the numbers that ring on it\n(`inPhones`), the outgoing line (`outPhone`), the SIP domain and the call groups the employee belongs to.\n\nUse it to configure a softphone or IP phone:\n- **Username / Auth user:** `<number>@<domain.name>.sip.onevoiplanet.com` (e.g. `001@example.sip.onevoiplanet.com`)\n- **Password:** the `password` field (returned by this method only, treat it as a secret)\n- **SIP server / registrar / realm:** `<domain.name>.sip.onevoiplanet.com`, port 5060 UDP\n- **WebRTC (browser):** `wss://<domain.name>.sip.onevoiplanet.com:443`\n\nThe response is a flat object (no Strapi `data/attributes` envelope). Returns an empty body if the employee has no SIP line.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "SIP line of the current user.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 12,\n  \"number\": \"001\",\n  \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n  \"updatedAt\": \"2026-02-01T09:30:00.000Z\",\n  \"password\": \"********\",\n  \"record_call\": true,\n  \"call_forwarding\": \"off\",\n  \"redirectActivity\": false,\n  \"redirectTo\": null,\n  \"user\": {\n    \"id\": 7,\n    \"group_employee\": {\n      \"id\": 3,\n      \"group\": {\n        \"id\": 2,\n        \"name\": \"Sales\",\n        \"in_phones\": [],\n        \"out_phone\": null\n      }\n    }\n  },\n  \"inPhones\": [\n    {\n      \"id\": 25,\n      \"number\": \"1234567\",\n      \"fullnumber\": \"380441234567\",\n      \"channels\": 4,\n      \"type\": \"simple\",\n      \"reserved\": false,\n      \"priority\": 0,\n      \"phone_prefix\": {\n        \"id\": 9,\n        \"prefix\": \"44\"\n      },\n      \"country_prefix\": {\n        \"id\": 1,\n        \"country\": \"UA\",\n        \"prefix\": \"380\",\n        \"iso\": \"UA\"\n      }\n    }\n  ],\n  \"outPhone\": null,\n  \"domain\": {\n    \"id\": 5,\n    \"name\": \"example\",\n    \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n    \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip/my",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip",
                        "my"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the SIP line (internal extension) of the authenticated employee together with the numbers that ring on it\n(`inPhones`), the outgoing line (`outPhone`), the SIP domain and the call groups the employee belongs to.\n\nUse it to configure a softphone or IP phone:\n- **Username / Auth user:** `<number>@<domain.name>.sip.onevoiplanet.com` (e.g. `001@example.sip.onevoiplanet.com`)\n- **Password:** the `password` field (returned by this method only, treat it as a secret)\n- **SIP server / registrar / realm:** `<domain.name>.sip.onevoiplanet.com`, port 5060 UDP\n- **WebRTC (browser):** `wss://<domain.name>.sip.onevoiplanet.com:443`\n\nThe response is a flat object (no Strapi `data/attributes` envelope). Returns an empty body if the employee has no SIP line.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip/my",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip",
                        "my"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the SIP line (internal extension) of the authenticated employee together with the numbers that ring on it\n(`inPhones`), the outgoing line (`outPhone`), the SIP domain and the call groups the employee belongs to.\n\nUse it to configure a softphone or IP phone:\n- **Username / Auth user:** `<number>@<domain.name>.sip.onevoiplanet.com` (e.g. `001@example.sip.onevoiplanet.com`)\n- **Password:** the `password` field (returned by this method only, treat it as a secret)\n- **SIP server / registrar / realm:** `<domain.name>.sip.onevoiplanet.com`, port 5060 UDP\n- **WebRTC (browser):** `wss://<domain.name>.sip.onevoiplanet.com:443`\n\nThe response is a flat object (no Strapi `data/attributes` envelope). Returns an empty body if the employee has no SIP line.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "My outgoing lines",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sip/my/out-lines",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sip",
                    "my",
                    "out-lines"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the company numbers the current employee may use as caller ID for outgoing calls: numbers attached to his SIP line\nas outgoing lines plus the outgoing lines of his call groups. Only numbers with an active (paid) subscription are returned.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 List of outgoing numbers.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip/my/out-lines",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip",
                        "my",
                        "out-lines"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the company numbers the current employee may use as caller ID for outgoing calls: numbers attached to his SIP line\nas outgoing lines plus the outgoing lines of his call groups. Only numbers with an active (paid) subscription are returned.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "List of outgoing numbers.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 25,\n      \"attributes\": {\n        \"number\": \"1234567\",\n        \"fullnumber\": \"380441234567\",\n        \"channels\": 4,\n        \"type\": \"simple\",\n        \"reserved\": false,\n        \"priority\": 0,\n        \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n        \"updatedAt\": \"2026-02-01T09:30:00.000Z\",\n        \"country_prefix\": {\n          \"id\": 1,\n          \"country\": \"UA\",\n          \"prefix\": \"380\",\n          \"iso\": \"UA\"\n        },\n        \"phone_prefix\": {\n          \"id\": 9,\n          \"prefix\": \"44\"\n        }\n      }\n    }\n  ],\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip/my/out-lines",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip",
                        "my",
                        "out-lines"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the company numbers the current employee may use as caller ID for outgoing calls: numbers attached to his SIP line\nas outgoing lines plus the outgoing lines of his call groups. Only numbers with an active (paid) subscription are returned.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip/my/out-lines",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip",
                        "my",
                        "out-lines"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the company numbers the current employee may use as caller ID for outgoing calls: numbers attached to his SIP line\nas outgoing lines plus the outgoing lines of his call groups. Only numbers with an active (paid) subscription are returned.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get SIP line",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sips/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sips",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "12",
                      "description": "SIP line id."
                    }
                  ]
                },
                "description": "Returns one SIP line of the company by id. Only lines whose owner belongs to your company are visible\n(`data: null` otherwise). Useful `populate`: `domain`, `user`, `inPhones`, `outPhone`, `out_phone_lines`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 SIP line.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sips/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sips",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "SIP line id."
                        }
                      ]
                    },
                    "description": "Returns one SIP line of the company by id. Only lines whose owner belongs to your company are visible\n(`data: null` otherwise). Useful `populate`: `domain`, `user`, `inPhones`, `outPhone`, `out_phone_lines`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "SIP line.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 12,\n    \"attributes\": {\n      \"number\": \"001\",\n      \"password\": \"********\",\n      \"record_call\": true,\n      \"call_forwarding\": \"off\",\n      \"redirectActivity\": false,\n      \"redirectTo\": null,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T09:30:00.000Z\",\n      \"domain\": {\n        \"data\": {\n          \"id\": 5,\n          \"attributes\": {\n            \"name\": \"example\"\n          }\n        }\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sips/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sips",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "SIP line id."
                        }
                      ]
                    },
                    "description": "Returns one SIP line of the company by id. Only lines whose owner belongs to your company are visible\n(`data: null` otherwise). Useful `populate`: `domain`, `user`, `inPhones`, `outPhone`, `out_phone_lines`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sips/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sips",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "SIP line id."
                        }
                      ]
                    },
                    "description": "Returns one SIP line of the company by id. Only lines whose owner belongs to your company are visible\n(`data: null` otherwise). Useful `populate`: `domain`, `user`, `inPhones`, `outPhone`, `out_phone_lines`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update SIP line",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sips/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sips",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "12",
                      "description": "SIP line id."
                    }
                  ]
                },
                "description": "Updates the settings of an employee's SIP line. Only these fields are accepted (others are silently ignored):\n`domain`, `record_call`, `call_forwarding`, `redirectActivity`, `redirectTo`.\nStrapi envelope `{ \"data\": {...} }` is required.\n\n`redirectActivity: true` together with `redirectTo` forwards every call to this extension to an external number.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions the SIP account on the registrar (background job); changing the domain changes the SIP login. Creates/removes the call-redirect rule on the PBX when redirectActivity/redirectTo change.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"record_call\": true,\n    \"call_forwarding\": \"no_answer\",\n    \"redirectActivity\": true,\n    \"redirectTo\": \"380441234567\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated SIP line.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sips/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sips",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "SIP line id."
                        }
                      ]
                    },
                    "description": "Updates the settings of an employee's SIP line. Only these fields are accepted (others are silently ignored):\n`domain`, `record_call`, `call_forwarding`, `redirectActivity`, `redirectTo`.\nStrapi envelope `{ \"data\": {...} }` is required.\n\n`redirectActivity: true` together with `redirectTo` forwards every call to this extension to an external number.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions the SIP account on the registrar (background job); changing the domain changes the SIP login. Creates/removes the call-redirect rule on the PBX when redirectActivity/redirectTo change.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"record_call\": true,\n    \"call_forwarding\": \"no_answer\",\n    \"redirectActivity\": true,\n    \"redirectTo\": \"380441234567\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated SIP line.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 12,\n    \"attributes\": {\n      \"number\": \"001\",\n      \"password\": \"********\",\n      \"record_call\": true,\n      \"call_forwarding\": \"no_answer\",\n      \"redirectActivity\": true,\n      \"redirectTo\": \"380441234567\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T09:30:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error: `Empty Data` (no `data`), `Invalid call_forwarding`, `Invalid sip` (id not found).",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sips/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sips",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "SIP line id."
                        }
                      ]
                    },
                    "description": "Updates the settings of an employee's SIP line. Only these fields are accepted (others are silently ignored):\n`domain`, `record_call`, `call_forwarding`, `redirectActivity`, `redirectTo`.\nStrapi envelope `{ \"data\": {...} }` is required.\n\n`redirectActivity: true` together with `redirectTo` forwards every call to this extension to an external number.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions the SIP account on the registrar (background job); changing the domain changes the SIP login. Creates/removes the call-redirect rule on the PBX when redirectActivity/redirectTo change.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"record_call\": true,\n    \"call_forwarding\": \"no_answer\",\n    \"redirectActivity\": true,\n    \"redirectTo\": \"380441234567\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error: `Empty Data` (no `data`), `Invalid call_forwarding`, `Invalid sip` (id not found).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Invalid call_forwarding\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sips/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sips",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "SIP line id."
                        }
                      ]
                    },
                    "description": "Updates the settings of an employee's SIP line. Only these fields are accepted (others are silently ignored):\n`domain`, `record_call`, `call_forwarding`, `redirectActivity`, `redirectTo`.\nStrapi envelope `{ \"data\": {...} }` is required.\n\n`redirectActivity: true` together with `redirectTo` forwards every call to this extension to an external number.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions the SIP account on the registrar (background job); changing the domain changes the SIP login. Creates/removes the call-redirect rule on the PBX when redirectActivity/redirectTo change.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"record_call\": true,\n    \"call_forwarding\": \"no_answer\",\n    \"redirectActivity\": true,\n    \"redirectTo\": \"380441234567\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sips/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sips",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "SIP line id."
                        }
                      ]
                    },
                    "description": "Updates the settings of an employee's SIP line. Only these fields are accepted (others are silently ignored):\n`domain`, `record_call`, `call_forwarding`, `redirectActivity`, `redirectTo`.\nStrapi envelope `{ \"data\": {...} }` is required.\n\n`redirectActivity: true` together with `redirectTo` forwards every call to this extension to an external number.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-provisions the SIP account on the registrar (background job); changing the domain changes the SIP login. Creates/removes the call-redirect rule on the PBX when redirectActivity/redirectTo change.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"record_call\": true,\n    \"call_forwarding\": \"no_answer\",\n    \"redirectActivity\": true,\n    \"redirectTo\": \"380441234567\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Change SIP password",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sips/changePassword/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sips",
                    "changePassword",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "12",
                      "description": "SIP line id."
                    }
                  ]
                },
                "description": "Sets a new SIP password for an employee's line. The password is supplied by the caller (it is not generated by the server)\nand must be repeated in `confirmPassword`. After the change every softphone/IP phone using the old password loses registration\nand must be reconfigured. Returns the updated line as a flat object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Pushes the new password to the SIP registrar (background job); existing registrations with the old password stop working.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"password\": \"N3wStr0ngPass\",\n    \"confirmPassword\": \"N3wStr0ngPass\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated SIP line (flat object).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sips/changePassword/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sips",
                        "changePassword",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "SIP line id."
                        }
                      ]
                    },
                    "description": "Sets a new SIP password for an employee's line. The password is supplied by the caller (it is not generated by the server)\nand must be repeated in `confirmPassword`. After the change every softphone/IP phone using the old password loses registration\nand must be reconfigured. Returns the updated line as a flat object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Pushes the new password to the SIP registrar (background job); existing registrations with the old password stop working.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"password\": \"N3wStr0ngPass\",\n    \"confirmPassword\": \"N3wStr0ngPass\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated SIP line (flat object).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 12,\n  \"number\": \"001\",\n  \"password\": \"********\",\n  \"record_call\": true,\n  \"call_forwarding\": \"off\",\n  \"redirectActivity\": false,\n  \"redirectTo\": null,\n  \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n  \"updatedAt\": \"2026-02-01T09:30:00.000Z\"\n}"
                },
                {
                  "name": "400 `Invalid data` (missing password/confirmPassword), `Confirm password doesn`t match with password`, `Invalid sip` (id not found).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sips/changePassword/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sips",
                        "changePassword",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "SIP line id."
                        }
                      ]
                    },
                    "description": "Sets a new SIP password for an employee's line. The password is supplied by the caller (it is not generated by the server)\nand must be repeated in `confirmPassword`. After the change every softphone/IP phone using the old password loses registration\nand must be reconfigured. Returns the updated line as a flat object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Pushes the new password to the SIP registrar (background job); existing registrations with the old password stop working.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"password\": \"N3wStr0ngPass\",\n    \"confirmPassword\": \"N3wStr0ngPass\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`Invalid data` (missing password/confirmPassword), `Confirm password doesn`t match with password`, `Invalid sip` (id not found).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Confirm password doesn`t match with password\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sips/changePassword/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sips",
                        "changePassword",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "SIP line id."
                        }
                      ]
                    },
                    "description": "Sets a new SIP password for an employee's line. The password is supplied by the caller (it is not generated by the server)\nand must be repeated in `confirmPassword`. After the change every softphone/IP phone using the old password loses registration\nand must be reconfigured. Returns the updated line as a flat object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Pushes the new password to the SIP registrar (background job); existing registrations with the old password stop working.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"password\": \"N3wStr0ngPass\",\n    \"confirmPassword\": \"N3wStr0ngPass\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sips/changePassword/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sips",
                        "changePassword",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "SIP line id."
                        }
                      ]
                    },
                    "description": "Sets a new SIP password for an employee's line. The password is supplied by the caller (it is not generated by the server)\nand must be repeated in `confirmPassword`. After the change every softphone/IP phone using the old password loses registration\nand must be reconfigured. Returns the updated line as a flat object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Pushes the new password to the SIP registrar (background job); existing registrations with the old password stop working.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"password\": \"N3wStr0ngPass\",\n    \"confirmPassword\": \"N3wStr0ngPass\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "List SIP trunks",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sip-trunks",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sip-trunks"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the SIP trunks (connections to external carriers / your own PBX) of the company with their external numbers.\n`registration` is computed live from the SIP proxy: `true` when at least one number of the trunk is currently registered at the carrier.\nStandard Strapi filters, sorting and pagination apply; the result is always limited to your company.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 List of trunks.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the SIP trunks (connections to external carriers / your own PBX) of the company with their external numbers.\n`registration` is computed live from the SIP proxy: `true` when at least one number of the trunk is currently registered at the carrier.\nStandard Strapi filters, sorting and pagination apply; the result is always limited to your company.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "List of trunks.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 3,\n      \"attributes\": {\n        \"name\": \"Carrier trunk\",\n        \"registration\": true,\n        \"connection_credentials\": [\n          {\n            \"id\": 1,\n            \"__component\": \"trunk-connection-type.by-credentials\",\n            \"login\": \"user123\",\n            \"host\": \"sip.carrier.example\",\n            \"port\": \"5060\"\n          }\n        ],\n        \"phones\": [\n          {\n            \"id\": 44,\n            \"fullnumber\": \"380441234567\"\n          }\n        ],\n        \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n        \"updatedAt\": \"2026-02-01T09:30:00.000Z\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the SIP trunks (connections to external carriers / your own PBX) of the company with their external numbers.\n`registration` is computed live from the SIP proxy: `true` when at least one number of the trunk is currently registered at the carrier.\nStandard Strapi filters, sorting and pagination apply; the result is always limited to your company.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the SIP trunks (connections to external carriers / your own PBX) of the company with their external numbers.\n`registration` is computed live from the SIP proxy: `true` when at least one number of the trunk is currently registered at the carrier.\nStandard Strapi filters, sorting and pagination apply; the result is always limited to your company.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Create SIP trunk (paid)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sip-trunks",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sip-trunks"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Orders a new SIP trunk. A trunk is a paid service: the method does **not** create the trunk directly — it creates an order\nfor the tariff price `per_trunk_price` and answers **402 Payment Required** with the order in `error.details`.\nThe amount is charged from the company balance immediately; once the order is approved the trunk is created and a monthly\nsubscription for it is started. If the balance is insufficient the order is declined and no trunk is created.\nPoll `GET /sip-trunks` or the order to see the result.\n\nConnection types (dynamic zone `connection_credentials`):\n- `trunk-connection-type.by-credentials` — registration at the carrier with `login`/`password`/`host`/`port`;\n- `trunk-connection-type.by-ip` — IP authentication, `ip` of your PBX.\n\nRequires an active tariff that allows external trunks (`maxAllowedExternalTrunks`), an active company and a login without Cyrillic letters.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates an order and charges `per_trunk_price` from the company balance; creates the trunk and a monthly subscription after the order is approved.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"name\": \"Carrier trunk\",\n    \"registration\": true,\n    \"connection_credentials\": [\n      {\n        \"__component\": \"trunk-connection-type.by-credentials\",\n        \"login\": \"user123\",\n        \"password\": \"s3cret\",\n        \"host\": \"sip.carrier.example\",\n        \"port\": \"5060\"\n      }\n    ]\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Trunk created directly (only when the tariff has no trunk price; in practice the method answers 402).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Orders a new SIP trunk. A trunk is a paid service: the method does **not** create the trunk directly — it creates an order\nfor the tariff price `per_trunk_price` and answers **402 Payment Required** with the order in `error.details`.\nThe amount is charged from the company balance immediately; once the order is approved the trunk is created and a monthly\nsubscription for it is started. If the balance is insufficient the order is declined and no trunk is created.\nPoll `GET /sip-trunks` or the order to see the result.\n\nConnection types (dynamic zone `connection_credentials`):\n- `trunk-connection-type.by-credentials` — registration at the carrier with `login`/`password`/`host`/`port`;\n- `trunk-connection-type.by-ip` — IP authentication, `ip` of your PBX.\n\nRequires an active tariff that allows external trunks (`maxAllowedExternalTrunks`), an active company and a login without Cyrillic letters.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates an order and charges `per_trunk_price` from the company balance; creates the trunk and a monthly subscription after the order is approved.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Carrier trunk\",\n    \"registration\": true,\n    \"connection_credentials\": [\n      {\n        \"__component\": \"trunk-connection-type.by-credentials\",\n        \"login\": \"user123\",\n        \"password\": \"s3cret\",\n        \"host\": \"sip.carrier.example\",\n        \"port\": \"5060\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Trunk created directly (only when the tariff has no trunk price; in practice the method answers 402).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 3,\n    \"attributes\": {\n      \"name\": \"Carrier trunk\",\n      \"registration\": true,\n      \"connection_credentials\": [\n        {\n          \"id\": 1,\n          \"__component\": \"trunk-connection-type.by-credentials\",\n          \"login\": \"user123\",\n          \"host\": \"sip.carrier.example\",\n          \"port\": \"5060\"\n        }\n      ],\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Orders a new SIP trunk. A trunk is a paid service: the method does **not** create the trunk directly — it creates an order\nfor the tariff price `per_trunk_price` and answers **402 Payment Required** with the order in `error.details`.\nThe amount is charged from the company balance immediately; once the order is approved the trunk is created and a monthly\nsubscription for it is started. If the balance is insufficient the order is declined and no trunk is created.\nPoll `GET /sip-trunks` or the order to see the result.\n\nConnection types (dynamic zone `connection_credentials`):\n- `trunk-connection-type.by-credentials` — registration at the carrier with `login`/`password`/`host`/`port`;\n- `trunk-connection-type.by-ip` — IP authentication, `ip` of your PBX.\n\nRequires an active tariff that allows external trunks (`maxAllowedExternalTrunks`), an active company and a login without Cyrillic letters.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates an order and charges `per_trunk_price` from the company balance; creates the trunk and a monthly subscription after the order is approved.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Carrier trunk\",\n    \"registration\": true,\n    \"connection_credentials\": [\n      {\n        \"__component\": \"trunk-connection-type.by-credentials\",\n        \"login\": \"user123\",\n        \"password\": \"s3cret\",\n        \"host\": \"sip.carrier.example\",\n        \"port\": \"5060\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "402 Order created, payment is being processed. `error.details` contains the created order (`orderId`, `orderStatus: new`, `amount`).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Orders a new SIP trunk. A trunk is a paid service: the method does **not** create the trunk directly — it creates an order\nfor the tariff price `per_trunk_price` and answers **402 Payment Required** with the order in `error.details`.\nThe amount is charged from the company balance immediately; once the order is approved the trunk is created and a monthly\nsubscription for it is started. If the balance is insufficient the order is declined and no trunk is created.\nPoll `GET /sip-trunks` or the order to see the result.\n\nConnection types (dynamic zone `connection_credentials`):\n- `trunk-connection-type.by-credentials` — registration at the carrier with `login`/`password`/`host`/`port`;\n- `trunk-connection-type.by-ip` — IP authentication, `ip` of your PBX.\n\nRequires an active tariff that allows external trunks (`maxAllowedExternalTrunks`), an active company and a login without Cyrillic letters.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates an order and charges `per_trunk_price` from the company balance; creates the trunk and a monthly subscription after the order is approved.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Carrier trunk\",\n    \"registration\": true,\n    \"connection_credentials\": [\n      {\n        \"__component\": \"trunk-connection-type.by-credentials\",\n        \"login\": \"user123\",\n        \"password\": \"s3cret\",\n        \"host\": \"sip.carrier.example\",\n        \"port\": \"5060\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Order created, payment is being processed. `error.details` contains the created order (`orderId`, `orderStatus: new`, `amount`).",
                  "code": 402,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 402,\n    \"name\": \"PaymentRequiredError\",\n    \"message\": \"Processing payment\",\n    \"details\": {\n      \"id\": 501,\n      \"orderId\": \"ORD-2026-000501\",\n      \"orderStatus\": \"new\",\n      \"orderType\": \"outgoing\",\n      \"amount\": 5\n    }\n  }\n}"
                },
                {
                  "name": "403 No permission, or policy failed: `To continue buy tariff!` (no tariff), `Policy Failed` (tariff forbids external trunks), `Setup `per_trunk_price` for this tariff, action not allowed!`, `Login can`t contain cyrillic symbols!`, `Company disabled`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Orders a new SIP trunk. A trunk is a paid service: the method does **not** create the trunk directly — it creates an order\nfor the tariff price `per_trunk_price` and answers **402 Payment Required** with the order in `error.details`.\nThe amount is charged from the company balance immediately; once the order is approved the trunk is created and a monthly\nsubscription for it is started. If the balance is insufficient the order is declined and no trunk is created.\nPoll `GET /sip-trunks` or the order to see the result.\n\nConnection types (dynamic zone `connection_credentials`):\n- `trunk-connection-type.by-credentials` — registration at the carrier with `login`/`password`/`host`/`port`;\n- `trunk-connection-type.by-ip` — IP authentication, `ip` of your PBX.\n\nRequires an active tariff that allows external trunks (`maxAllowedExternalTrunks`), an active company and a login without Cyrillic letters.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates an order and charges `per_trunk_price` from the company balance; creates the trunk and a monthly subscription after the order is approved.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Carrier trunk\",\n    \"registration\": true,\n    \"connection_credentials\": [\n      {\n        \"__component\": \"trunk-connection-type.by-credentials\",\n        \"login\": \"user123\",\n        \"password\": \"s3cret\",\n        \"host\": \"sip.carrier.example\",\n        \"port\": \"5060\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "No permission, or policy failed: `To continue buy tariff!` (no tariff), `Policy Failed` (tariff forbids external trunks), `Setup `per_trunk_price` for this tariff, action not allowed!`, `Login can`t contain cyrillic symbols!`, `Company disabled`.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"PolicyError\",\n    \"message\": \"To continue buy tariff!\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get SIP trunk",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sip-trunks/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sip-trunks",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "3",
                      "description": "Trunk id."
                    }
                  ]
                },
                "description": "Returns one trunk of the company by id (`data: null` if it belongs to another company). Use `populate[phones]=true` to get its external numbers.\nNumeric and boolean query values are coerced (`\"true\"` → `true`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Trunk.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "Trunk id."
                        }
                      ]
                    },
                    "description": "Returns one trunk of the company by id (`data: null` if it belongs to another company). Use `populate[phones]=true` to get its external numbers.\nNumeric and boolean query values are coerced (`\"true\"` → `true`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Trunk.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 3,\n    \"attributes\": {\n      \"name\": \"Carrier trunk\",\n      \"registration\": true,\n      \"connection_credentials\": [\n        {\n          \"id\": 1,\n          \"__component\": \"trunk-connection-type.by-credentials\",\n          \"login\": \"user123\",\n          \"host\": \"sip.carrier.example\",\n          \"port\": \"5060\"\n        }\n      ],\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T09:30:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "Trunk id."
                        }
                      ]
                    },
                    "description": "Returns one trunk of the company by id (`data: null` if it belongs to another company). Use `populate[phones]=true` to get its external numbers.\nNumeric and boolean query values are coerced (`\"true\"` → `true`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "Trunk id."
                        }
                      ]
                    },
                    "description": "Returns one trunk of the company by id (`data: null` if it belongs to another company). Use `populate[phones]=true` to get its external numbers.\nNumeric and boolean query values are coerced (`\"true\"` → `true`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update SIP trunk",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sip-trunks/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sip-trunks",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "3",
                      "description": "Trunk id."
                    }
                  ]
                },
                "description": "Updates name, registration flag or connection settings of a trunk. Strapi envelope `{ \"data\": {...} }`.\nToggling `registration` enables/disables outbound registration of all trunk numbers at the carrier.\nReturns `data: null` if the trunk does not belong to your company.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-applies registration of the trunk numbers on the SIP proxy (register/unregister at the carrier).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"registration\": false\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated trunk.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "Trunk id."
                        }
                      ]
                    },
                    "description": "Updates name, registration flag or connection settings of a trunk. Strapi envelope `{ \"data\": {...} }`.\nToggling `registration` enables/disables outbound registration of all trunk numbers at the carrier.\nReturns `data: null` if the trunk does not belong to your company.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-applies registration of the trunk numbers on the SIP proxy (register/unregister at the carrier).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"registration\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated trunk.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 3,\n    \"attributes\": {\n      \"name\": \"Carrier trunk\",\n      \"registration\": false,\n      \"connection_credentials\": [\n        {\n          \"id\": 1,\n          \"__component\": \"trunk-connection-type.by-credentials\",\n          \"login\": \"user123\",\n          \"host\": \"sip.carrier.example\",\n          \"port\": \"5060\"\n        }\n      ],\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T09:30:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error or malformed request.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "Trunk id."
                        }
                      ]
                    },
                    "description": "Updates name, registration flag or connection settings of a trunk. Strapi envelope `{ \"data\": {...} }`.\nToggling `registration` enables/disables outbound registration of all trunk numbers at the carrier.\nReturns `data: null` if the trunk does not belong to your company.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-applies registration of the trunk numbers on the SIP proxy (register/unregister at the carrier).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"registration\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error or malformed request.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"email must be a valid email\",\n    \"details\": {\n      \"errors\": [\n        {\n          \"path\": [\n            \"email\"\n          ],\n          \"message\": \"email must be a valid email\",\n          \"name\": \"ValidationError\"\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "Trunk id."
                        }
                      ]
                    },
                    "description": "Updates name, registration flag or connection settings of a trunk. Strapi envelope `{ \"data\": {...} }`.\nToggling `registration` enables/disables outbound registration of all trunk numbers at the carrier.\nReturns `data: null` if the trunk does not belong to your company.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-applies registration of the trunk numbers on the SIP proxy (register/unregister at the carrier).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"registration\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 No permission or `Company disabled`.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "Trunk id."
                        }
                      ]
                    },
                    "description": "Updates name, registration flag or connection settings of a trunk. Strapi envelope `{ \"data\": {...} }`.\nToggling `registration` enables/disables outbound registration of all trunk numbers at the carrier.\nReturns `data: null` if the trunk does not belong to your company.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Re-applies registration of the trunk numbers on the SIP proxy (register/unregister at the carrier).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"registration\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "No permission or `Company disabled`.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Company disabled\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete SIP trunk",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sip-trunks/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sip-trunks",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "3",
                      "description": "Trunk id."
                    }
                  ]
                },
                "description": "Deletes a trunk of the company. All external numbers attached to the trunk are detached from SIP lines, groups and IVRs,\nunregistered at the carrier and **deleted** together with their subscriptions. The trunk subscription is revoked. Irreversible.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Irreversibly deletes the trunk and all its external numbers, revokes their subscriptions, removes registrations on the SIP proxy."
              },
              "response": [
                {
                  "name": "200 Deleted trunk.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "Trunk id."
                        }
                      ]
                    },
                    "description": "Deletes a trunk of the company. All external numbers attached to the trunk are detached from SIP lines, groups and IVRs,\nunregistered at the carrier and **deleted** together with their subscriptions. The trunk subscription is revoked. Irreversible.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Irreversibly deletes the trunk and all its external numbers, revokes their subscriptions, removes registrations on the SIP proxy."
                  },
                  "status": "Deleted trunk.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 3,\n    \"attributes\": {\n      \"name\": \"Carrier trunk\",\n      \"registration\": false,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T09:30:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "Trunk id."
                        }
                      ]
                    },
                    "description": "Deletes a trunk of the company. All external numbers attached to the trunk are detached from SIP lines, groups and IVRs,\nunregistered at the carrier and **deleted** together with their subscriptions. The trunk subscription is revoked. Irreversible.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Irreversibly deletes the trunk and all its external numbers, revokes their subscriptions, removes registrations on the SIP proxy."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "Trunk id."
                        }
                      ]
                    },
                    "description": "Deletes a trunk of the company. All external numbers attached to the trunk are detached from SIP lines, groups and IVRs,\nunregistered at the carrier and **deleted** together with their subscriptions. The trunk subscription is revoked. Irreversible.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Irreversibly deletes the trunk and all its external numbers, revokes their subscriptions, removes registrations on the SIP proxy."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "3",
                          "description": "Trunk id."
                        }
                      ]
                    },
                    "description": "Deletes a trunk of the company. All external numbers attached to the trunk are detached from SIP lines, groups and IVRs,\nunregistered at the carrier and **deleted** together with their subscriptions. The trunk subscription is revoked. Irreversible.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Irreversibly deletes the trunk and all its external numbers, revokes their subscriptions, removes registrations on the SIP proxy."
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Test trunk credentials",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sip-trunks/check-connection",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sip-trunks",
                    "check-connection"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Performs a real SIP REGISTER (with `Expires: 2`) from the OneVOIPlanet servers to the carrier using the supplied credentials\nand waits ~1 second for the answer. Use it before creating a `by-credentials` trunk.\n`connected: true` means the carrier accepted the registration; otherwise `status` holds the SIP response (e.g. 401/403) or nulls on timeout.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Sends a SIP REGISTER request to the external carrier (short-lived registration, expires in 2 seconds).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"login\": \"user123\",\n    \"password\": \"s3cret\",\n    \"host\": \"sip.carrier.example\",\n    \"port\": \"5060\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Registration result.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/check-connection",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "check-connection"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Performs a real SIP REGISTER (with `Expires: 2`) from the OneVOIPlanet servers to the carrier using the supplied credentials\nand waits ~1 second for the answer. Use it before creating a `by-credentials` trunk.\n`connected: true` means the carrier accepted the registration; otherwise `status` holds the SIP response (e.g. 401/403) or nulls on timeout.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Sends a SIP REGISTER request to the external carrier (short-lived registration, expires in 2 seconds).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"login\": \"user123\",\n    \"password\": \"s3cret\",\n    \"host\": \"sip.carrier.example\",\n    \"port\": \"5060\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Registration result.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"attributes\": {\n      \"connected\": true,\n      \"status\": {\n        \"status_code\": 200,\n        \"reason_phrase\": \"OK\"\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 SIP stack failed to start with these parameters (message from the SIP library).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/check-connection",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "check-connection"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Performs a real SIP REGISTER (with `Expires: 2`) from the OneVOIPlanet servers to the carrier using the supplied credentials\nand waits ~1 second for the answer. Use it before creating a `by-credentials` trunk.\n`connected: true` means the carrier accepted the registration; otherwise `status` holds the SIP response (e.g. 401/403) or nulls on timeout.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Sends a SIP REGISTER request to the external carrier (short-lived registration, expires in 2 seconds).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"login\": \"user123\",\n    \"password\": \"s3cret\",\n    \"host\": \"sip.carrier.example\",\n    \"port\": \"5060\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "SIP stack failed to start with these parameters (message from the SIP library).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Invalid parameter: uri\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/check-connection",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "check-connection"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Performs a real SIP REGISTER (with `Expires: 2`) from the OneVOIPlanet servers to the carrier using the supplied credentials\nand waits ~1 second for the answer. Use it before creating a `by-credentials` trunk.\n`connected: true` means the carrier accepted the registration; otherwise `status` holds the SIP response (e.g. 401/403) or nulls on timeout.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Sends a SIP REGISTER request to the external carrier (short-lived registration, expires in 2 seconds).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"login\": \"user123\",\n    \"password\": \"s3cret\",\n    \"host\": \"sip.carrier.example\",\n    \"port\": \"5060\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 No permission or `Login can`t contain cyrillic symbols!`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sip-trunks/check-connection",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sip-trunks",
                        "check-connection"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Performs a real SIP REGISTER (with `Expires: 2`) from the OneVOIPlanet servers to the carrier using the supplied credentials\nand waits ~1 second for the answer. Use it before creating a `by-credentials` trunk.\n`connected: true` means the carrier accepted the registration; otherwise `status` holds the SIP response (e.g. 401/403) or nulls on timeout.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Sends a SIP REGISTER request to the external carrier (short-lived registration, expires in 2 seconds).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"login\": \"user123\",\n    \"password\": \"s3cret\",\n    \"host\": \"sip.carrier.example\",\n    \"port\": \"5060\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "No permission or `Login can`t contain cyrillic symbols!`.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"PolicyError\",\n    \"message\": \"Login can`t contain cyrillic symbols!\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "List SIP domains",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/domains",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "domains"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the SIP domains of the company. A domain is the realm part of SIP logins: `<number>@<name>.sip.onevoiplanet.com`.\nStandard filters/sort/pagination; always limited to your company. `populate[sips]`, `populate[groups]`, `populate[ivrs]` show what uses the domain.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 List of domains.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the SIP domains of the company. A domain is the realm part of SIP logins: `<number>@<name>.sip.onevoiplanet.com`.\nStandard filters/sort/pagination; always limited to your company. `populate[sips]`, `populate[groups]`, `populate[ivrs]` show what uses the domain.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "List of domains.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 5,\n      \"attributes\": {\n        \"name\": \"example\",\n        \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n        \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the SIP domains of the company. A domain is the realm part of SIP logins: `<number>@<name>.sip.onevoiplanet.com`.\nStandard filters/sort/pagination; always limited to your company. `populate[sips]`, `populate[groups]`, `populate[ivrs]` show what uses the domain.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the SIP domains of the company. A domain is the realm part of SIP logins: `<number>@<name>.sip.onevoiplanet.com`.\nStandard filters/sort/pagination; always limited to your company. `populate[sips]`, `populate[groups]`, `populate[ivrs]` show what uses the domain.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Create SIP domain",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/domains",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "domains"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Creates a SIP domain. `name` is 1–10 Latin letters/digits/underscore, unique across the platform; keep it short — it becomes part of\nevery SIP login (`<number>@<name>.sip.onevoiplanet.com`).\n\nPricing: the tariff includes `maxDomains` free domains. When the company already has that many, the new domain is **paid**:\nthe balance is checked against `domain_cost` (see `GET /domains/cost`); if sufficient, the domain is created, an order is\ncreated and `domain_cost` is charged from the balance immediately, then a monthly subscription for the domain is started.\nIf the balance is insufficient the request fails with 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** When the free domain limit of the tariff is exhausted: creates an order, charges `domain_cost` from the balance and starts a monthly domain subscription. Within the limit: none.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"name\": \"example\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created domain.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a SIP domain. `name` is 1–10 Latin letters/digits/underscore, unique across the platform; keep it short — it becomes part of\nevery SIP login (`<number>@<name>.sip.onevoiplanet.com`).\n\nPricing: the tariff includes `maxDomains` free domains. When the company already has that many, the new domain is **paid**:\nthe balance is checked against `domain_cost` (see `GET /domains/cost`); if sufficient, the domain is created, an order is\ncreated and `domain_cost` is charged from the balance immediately, then a monthly subscription for the domain is started.\nIf the balance is insufficient the request fails with 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** When the free domain limit of the tariff is exhausted: creates an order, charges `domain_cost` from the balance and starts a monthly domain subscription. Within the limit: none.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"example\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created domain.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 6,\n    \"attributes\": {\n      \"name\": \"example\",\n      \"createdAt\": \"2026-02-01T09:30:00.000Z\",\n      \"updatedAt\": \"2026-02-01T09:30:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 `Not enough money on balance` (paid domain, balance too low) or Strapi validation (`This attribute must be unique`, length/regex).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a SIP domain. `name` is 1–10 Latin letters/digits/underscore, unique across the platform; keep it short — it becomes part of\nevery SIP login (`<number>@<name>.sip.onevoiplanet.com`).\n\nPricing: the tariff includes `maxDomains` free domains. When the company already has that many, the new domain is **paid**:\nthe balance is checked against `domain_cost` (see `GET /domains/cost`); if sufficient, the domain is created, an order is\ncreated and `domain_cost` is charged from the balance immediately, then a monthly subscription for the domain is started.\nIf the balance is insufficient the request fails with 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** When the free domain limit of the tariff is exhausted: creates an order, charges `domain_cost` from the balance and starts a monthly domain subscription. Within the limit: none.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"example\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`Not enough money on balance` (paid domain, balance too low) or Strapi validation (`This attribute must be unique`, length/regex).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Not enough money on balance\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a SIP domain. `name` is 1–10 Latin letters/digits/underscore, unique across the platform; keep it short — it becomes part of\nevery SIP login (`<number>@<name>.sip.onevoiplanet.com`).\n\nPricing: the tariff includes `maxDomains` free domains. When the company already has that many, the new domain is **paid**:\nthe balance is checked against `domain_cost` (see `GET /domains/cost`); if sufficient, the domain is created, an order is\ncreated and `domain_cost` is charged from the balance immediately, then a monthly subscription for the domain is started.\nIf the balance is insufficient the request fails with 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** When the free domain limit of the tariff is exhausted: creates an order, charges `domain_cost` from the balance and starts a monthly domain subscription. Within the limit: none.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"example\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a SIP domain. `name` is 1–10 Latin letters/digits/underscore, unique across the platform; keep it short — it becomes part of\nevery SIP login (`<number>@<name>.sip.onevoiplanet.com`).\n\nPricing: the tariff includes `maxDomains` free domains. When the company already has that many, the new domain is **paid**:\nthe balance is checked against `domain_cost` (see `GET /domains/cost`); if sufficient, the domain is created, an order is\ncreated and `domain_cost` is charged from the balance immediately, then a monthly subscription for the domain is started.\nIf the balance is insufficient the request fails with 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** When the free domain limit of the tariff is exhausted: creates an order, charges `domain_cost` from the balance and starts a monthly domain subscription. Within the limit: none.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"example\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Price of an extra domain",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/domains/cost",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "domains",
                    "cost"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the price of one additional SIP domain (`domain_cost` from the company tariff, in the company currency) —\nthe amount charged by `POST /domains` once the free domain limit is used up. `price` may come back empty if the tariff has no domain price.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Domain price.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains/cost",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains",
                        "cost"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the price of one additional SIP domain (`domain_cost` from the company tariff, in the company currency) —\nthe amount charged by `POST /domains` once the free domain limit is used up. `price` may come back empty if the tariff has no domain price.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Domain price.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"attributes\": {\n      \"price\": 2\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains/cost",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains",
                        "cost"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the price of one additional SIP domain (`domain_cost` from the company tariff, in the company currency) —\nthe amount charged by `POST /domains` once the free domain limit is used up. `price` may come back empty if the tariff has no domain price.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains/cost",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains",
                        "cost"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the price of one additional SIP domain (`domain_cost` from the company tariff, in the company currency) —\nthe amount charged by `POST /domains` once the free domain limit is used up. `price` may come back empty if the tariff has no domain price.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get SIP domain",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/domains/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "domains",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "5",
                      "description": "Domain id."
                    }
                  ]
                },
                "description": "Returns one domain of the company by id (`data: null` if it belongs to another company). Supports `populate`.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Domain.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Domain id."
                        }
                      ]
                    },
                    "description": "Returns one domain of the company by id (`data: null` if it belongs to another company). Supports `populate`.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Domain.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 5,\n    \"attributes\": {\n      \"name\": \"example\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Domain id."
                        }
                      ]
                    },
                    "description": "Returns one domain of the company by id (`data: null` if it belongs to another company). Supports `populate`.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Domain id."
                        }
                      ]
                    },
                    "description": "Returns one domain of the company by id (`data: null` if it belongs to another company). Supports `populate`.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete SIP domain",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/domains/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "domains",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "5",
                      "description": "Domain id."
                    }
                  ]
                },
                "description": "Deletes a domain of the company. Refused (400) while any SIP line, call group, IVR or recall widget still uses the domain —\n`error.details` lists them (`userName`, `groupName`, `ivrName`, `recall_widgetName`). On success the domain subscription is revoked.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Irreversibly deletes the domain and revokes its monthly subscription."
              },
              "response": [
                {
                  "name": "200 Deleted domain.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Domain id."
                        }
                      ]
                    },
                    "description": "Deletes a domain of the company. Refused (400) while any SIP line, call group, IVR or recall widget still uses the domain —\n`error.details` lists them (`userName`, `groupName`, `ivrName`, `recall_widgetName`). On success the domain subscription is revoked.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Irreversibly deletes the domain and revokes its monthly subscription."
                  },
                  "status": "Deleted domain.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 5,\n    \"attributes\": {\n      \"name\": \"example\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Domain is in use.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Domain id."
                        }
                      ]
                    },
                    "description": "Deletes a domain of the company. Refused (400) while any SIP line, call group, IVR or recall widget still uses the domain —\n`error.details` lists them (`userName`, `groupName`, `ivrName`, `recall_widgetName`). On success the domain subscription is revoked.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Irreversibly deletes the domain and revokes its monthly subscription."
                  },
                  "status": "Domain is in use.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Domain is attached to user or to group or to recall widget or to IVR!\",\n    \"details\": {\n      \"userName\": [\n        \"John  Doe\"\n      ],\n      \"groupName\": [\n        \"Sales\"\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Domain id."
                        }
                      ]
                    },
                    "description": "Deletes a domain of the company. Refused (400) while any SIP line, call group, IVR or recall widget still uses the domain —\n`error.details` lists them (`userName`, `groupName`, `ivrName`, `recall_widgetName`). On success the domain subscription is revoked.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Irreversibly deletes the domain and revokes its monthly subscription."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Domain id."
                        }
                      ]
                    },
                    "description": "Deletes a domain of the company. Refused (400) while any SIP line, call group, IVR or recall widget still uses the domain —\n`error.details` lists them (`userName`, `groupName`, `ivrName`, `recall_widgetName`). On success the domain subscription is revoked.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Irreversibly deletes the domain and revokes its monthly subscription."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Returned when the domain id does not exist in your company (the server fails before the not-found check).",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/domains/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "domains",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Domain id."
                        }
                      ]
                    },
                    "description": "Deletes a domain of the company. Refused (400) while any SIP line, call group, IVR or recall widget still uses the domain —\n`error.details` lists them (`userName`, `groupName`, `ivrName`, `recall_widgetName`). On success the domain subscription is revoked.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Irreversibly deletes the domain and revokes its monthly subscription."
                  },
                  "status": "Returned when the domain id does not exist in your company (the server fails before the not-found check).",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            }
          ]
        },
        {
          "name": "Calls & Statistics",
          "description": "Call history and statistics, call records, missed calls, live call control.",
          "item": [
            {
              "name": "Call history",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/statistics",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "statistics"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the call history of the company (one record per call; multi-leg calls — group, IVR, transfers — are grouped into one\nrecord with the legs in `callDetailInfo.subbranches`). The result is always limited to your company; **every role sees all company\ncalls here** — use `POST /statistics/myStat` to get the calls of the current employee only.\n\nUseful filters: `filters[callSetupTime][$gte]=<unix seconds>`, `filters[callDuration][$gte]=30`, `filters[code][$eq]=200` (answered),\n`filters[from][$contains]=38044`, `filters[sip][id][$eq]=12` (outgoing by employee), `filters[sipTo][id][$eq]=12` (incoming to employee).\nUseful `populate`: `sip`, `sipTo`, `conversation_sips`, `group`, `ivr`, `callRecord` (recording file), `contacts` (address-book matches by number),\n`recall_widget`, `callback_widget`, `missed_call`.\n\n**Call recordings:** recorded only when the employee's SIP line has `record_call` enabled and the call was answered (`code` 200).\n`callRecordStatus`: `compiling` → `ready` (file attached) or `disabled`. With `populate[callRecord]=true` the record carries `url`\n(relative, e.g. `/uploads/recordings/<file>.wav`); download it from `https://api.onevoiplanet.com<url>`.\nCall records older than 90 days are deleted automatically.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of calls.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the call history of the company (one record per call; multi-leg calls — group, IVR, transfers — are grouped into one\nrecord with the legs in `callDetailInfo.subbranches`). The result is always limited to your company; **every role sees all company\ncalls here** — use `POST /statistics/myStat` to get the calls of the current employee only.\n\nUseful filters: `filters[callSetupTime][$gte]=<unix seconds>`, `filters[callDuration][$gte]=30`, `filters[code][$eq]=200` (answered),\n`filters[from][$contains]=38044`, `filters[sip][id][$eq]=12` (outgoing by employee), `filters[sipTo][id][$eq]=12` (incoming to employee).\nUseful `populate`: `sip`, `sipTo`, `conversation_sips`, `group`, `ivr`, `callRecord` (recording file), `contacts` (address-book matches by number),\n`recall_widget`, `callback_widget`, `missed_call`.\n\n**Call recordings:** recorded only when the employee's SIP line has `record_call` enabled and the call was answered (`code` 200).\n`callRecordStatus`: `compiling` → `ready` (file attached) or `disabled`. With `populate[callRecord]=true` the record carries `url`\n(relative, e.g. `/uploads/recordings/<file>.wav`); download it from `https://api.onevoiplanet.com<url>`.\nCall records older than 90 days are deleted automatically.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Page of calls.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 1001,\n      \"attributes\": {\n        \"from\": \"380661234567\",\n        \"to\": \"380441234567\",\n        \"code\": \"200\",\n        \"reason\": \"Ok\",\n        \"callSide\": \"termination\",\n        \"callSetupTime\": \"1790931273\",\n        \"callStartTime\": \"1790931283\",\n        \"callEndTime\": \"1790931403\",\n        \"callDuration\": 120,\n        \"tarificatedDuration\": 120,\n        \"cost\": 0,\n        \"callCommentary\": null,\n        \"callEnder\": false,\n        \"isSystem\": false,\n        \"isFromGroup\": true,\n        \"isRecall\": null,\n        \"origin_call_id\": null,\n        \"originate_call_direction\": null,\n        \"callRecordStatus\": \"ready\",\n        \"callDetailInfo\": {\n          \"subbranches\": []\n        },\n        \"refered_to\": null,\n        \"redirectedFromSipToOutbound\": false,\n        \"ai_used\": false,\n        \"call_transcribation_data\": null,\n        \"createdAt\": \"2026-02-01T09:30:00.000Z\",\n        \"updatedAt\": \"2026-02-01T09:32:05.000Z\",\n        \"sipTo\": {\n          \"data\": {\n            \"id\": 12,\n            \"attributes\": {\n              \"number\": \"001\"\n            }\n          }\n        },\n        \"callRecord\": {\n          \"data\": {\n            \"id\": 77,\n            \"attributes\": {\n              \"name\": \"call-1001-mix.wav\",\n              \"ext\": \".wav\",\n              \"mime\": \"audio/wave\",\n              \"size\": 0.15,\n              \"url\": \"/uploads/recordings/call-1001-mix.wav\"\n            }\n          }\n        }\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 4,\n      \"total\": 87\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the call history of the company (one record per call; multi-leg calls — group, IVR, transfers — are grouped into one\nrecord with the legs in `callDetailInfo.subbranches`). The result is always limited to your company; **every role sees all company\ncalls here** — use `POST /statistics/myStat` to get the calls of the current employee only.\n\nUseful filters: `filters[callSetupTime][$gte]=<unix seconds>`, `filters[callDuration][$gte]=30`, `filters[code][$eq]=200` (answered),\n`filters[from][$contains]=38044`, `filters[sip][id][$eq]=12` (outgoing by employee), `filters[sipTo][id][$eq]=12` (incoming to employee).\nUseful `populate`: `sip`, `sipTo`, `conversation_sips`, `group`, `ivr`, `callRecord` (recording file), `contacts` (address-book matches by number),\n`recall_widget`, `callback_widget`, `missed_call`.\n\n**Call recordings:** recorded only when the employee's SIP line has `record_call` enabled and the call was answered (`code` 200).\n`callRecordStatus`: `compiling` → `ready` (file attached) or `disabled`. With `populate[callRecord]=true` the record carries `url`\n(relative, e.g. `/uploads/recordings/<file>.wav`); download it from `https://api.onevoiplanet.com<url>`.\nCall records older than 90 days are deleted automatically.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the call history of the company (one record per call; multi-leg calls — group, IVR, transfers — are grouped into one\nrecord with the legs in `callDetailInfo.subbranches`). The result is always limited to your company; **every role sees all company\ncalls here** — use `POST /statistics/myStat` to get the calls of the current employee only.\n\nUseful filters: `filters[callSetupTime][$gte]=<unix seconds>`, `filters[callDuration][$gte]=30`, `filters[code][$eq]=200` (answered),\n`filters[from][$contains]=38044`, `filters[sip][id][$eq]=12` (outgoing by employee), `filters[sipTo][id][$eq]=12` (incoming to employee).\nUseful `populate`: `sip`, `sipTo`, `conversation_sips`, `group`, `ivr`, `callRecord` (recording file), `contacts` (address-book matches by number),\n`recall_widget`, `callback_widget`, `missed_call`.\n\n**Call recordings:** recorded only when the employee's SIP line has `record_call` enabled and the call was answered (`code` 200).\n`callRecordStatus`: `compiling` → `ready` (file attached) or `disabled`. With `populate[callRecord]=true` the record carries `url`\n(relative, e.g. `/uploads/recordings/<file>.wav`); download it from `https://api.onevoiplanet.com<url>`.\nCall records older than 90 days are deleted automatically.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "My calls (role-aware)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/statistics/myStat",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "statistics",
                    "myStat"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Same data as `GET /statistics`, but the query (filters, sort, pagination, populate) is sent in the JSON body under `params`\nand the visibility depends on the role: company owner and supervisor get all company calls; other roles (employee, finance)\nget only calls where their own SIP line took part (`sip`, `sipTo` or `conversation_sips`).\nUse it for a personal call journal. Returns an empty body if the user has no SIP line.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"params\": {\n    \"filters\": {\n      \"callSetupTime\": {\n        \"$gte\": 1790899200,\n        \"$lte\": 1790985599\n      }\n    },\n    \"sort\": [\n      \"id:desc\"\n    ],\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25\n    },\n    \"populate\": {\n      \"sip\": {\n        \"fields\": [\n          \"number\"\n        ]\n      },\n      \"sipTo\": {\n        \"fields\": [\n          \"number\"\n        ]\n      },\n      \"callRecord\": true,\n      \"contacts\": true\n    }\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Page of calls.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/myStat",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "myStat"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Same data as `GET /statistics`, but the query (filters, sort, pagination, populate) is sent in the JSON body under `params`\nand the visibility depends on the role: company owner and supervisor get all company calls; other roles (employee, finance)\nget only calls where their own SIP line took part (`sip`, `sipTo` or `conversation_sips`).\nUse it for a personal call journal. Returns an empty body if the user has no SIP line.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"params\": {\n    \"filters\": {\n      \"callSetupTime\": {\n        \"$gte\": 1790899200,\n        \"$lte\": 1790985599\n      }\n    },\n    \"sort\": [\n      \"id:desc\"\n    ],\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25\n    },\n    \"populate\": {\n      \"sip\": {\n        \"fields\": [\n          \"number\"\n        ]\n      },\n      \"sipTo\": {\n        \"fields\": [\n          \"number\"\n        ]\n      },\n      \"callRecord\": true,\n      \"contacts\": true\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Page of calls.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 1001,\n      \"attributes\": {\n        \"from\": \"380661234567\",\n        \"to\": \"380441234567\",\n        \"code\": \"200\",\n        \"reason\": \"Ok\",\n        \"callSide\": \"termination\",\n        \"callSetupTime\": \"1790931273\",\n        \"callStartTime\": \"1790931283\",\n        \"callEndTime\": \"1790931403\",\n        \"callDuration\": 120,\n        \"cost\": 0,\n        \"callRecordStatus\": \"ready\",\n        \"createdAt\": \"2026-02-01T09:30:00.000Z\",\n        \"updatedAt\": \"2026-02-01T09:32:05.000Z\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/myStat",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "myStat"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Same data as `GET /statistics`, but the query (filters, sort, pagination, populate) is sent in the JSON body under `params`\nand the visibility depends on the role: company owner and supervisor get all company calls; other roles (employee, finance)\nget only calls where their own SIP line took part (`sip`, `sipTo` or `conversation_sips`).\nUse it for a personal call journal. Returns an empty body if the user has no SIP line.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"params\": {\n    \"filters\": {\n      \"callSetupTime\": {\n        \"$gte\": 1790899200,\n        \"$lte\": 1790985599\n      }\n    },\n    \"sort\": [\n      \"id:desc\"\n    ],\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25\n    },\n    \"populate\": {\n      \"sip\": {\n        \"fields\": [\n          \"number\"\n        ]\n      },\n      \"sipTo\": {\n        \"fields\": [\n          \"number\"\n        ]\n      },\n      \"callRecord\": true,\n      \"contacts\": true\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/myStat",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "myStat"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Same data as `GET /statistics`, but the query (filters, sort, pagination, populate) is sent in the JSON body under `params`\nand the visibility depends on the role: company owner and supervisor get all company calls; other roles (employee, finance)\nget only calls where their own SIP line took part (`sip`, `sipTo` or `conversation_sips`).\nUse it for a personal call journal. Returns an empty body if the user has no SIP line.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"params\": {\n    \"filters\": {\n      \"callSetupTime\": {\n        \"$gte\": 1790899200,\n        \"$lte\": 1790985599\n      }\n    },\n    \"sort\": [\n      \"id:desc\"\n    ],\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25\n    },\n    \"populate\": {\n      \"sip\": {\n        \"fields\": [\n          \"number\"\n        ]\n      },\n      \"sipTo\": {\n        \"fields\": [\n          \"number\"\n        ]\n      },\n      \"callRecord\": true,\n      \"contacts\": true\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "My calls for today",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/statistics/myStatToday",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "statistics",
                    "myStatToday"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Same as `POST /statistics/myStat` with an extra condition `createdAt >= start of the current day` (server time, UTC).\nAny filters passed in `params.filters` are combined with it.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"params\": {\n    \"sort\": [\n      \"id:desc\"\n    ],\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25\n    },\n    \"populate\": {\n      \"sip\": {\n        \"fields\": [\n          \"number\"\n        ]\n      },\n      \"sipTo\": {\n        \"fields\": [\n          \"number\"\n        ]\n      }\n    }\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Page of today's calls.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/myStatToday",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "myStatToday"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Same as `POST /statistics/myStat` with an extra condition `createdAt >= start of the current day` (server time, UTC).\nAny filters passed in `params.filters` are combined with it.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"params\": {\n    \"sort\": [\n      \"id:desc\"\n    ],\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25\n    },\n    \"populate\": {\n      \"sip\": {\n        \"fields\": [\n          \"number\"\n        ]\n      },\n      \"sipTo\": {\n        \"fields\": [\n          \"number\"\n        ]\n      }\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Page of today's calls.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 1002,\n      \"attributes\": {\n        \"from\": \"001domainexample\",\n        \"to\": \"380661234567\",\n        \"code\": \"487\",\n        \"reason\": \"Request Terminated\",\n        \"callSide\": \"origination\",\n        \"callSetupTime\": \"1790931273\",\n        \"callStartTime\": \"0\",\n        \"callEndTime\": \"1790931283\",\n        \"callDuration\": 0,\n        \"cost\": 0,\n        \"callRecordStatus\": \"disabled\",\n        \"createdAt\": \"2026-02-01T09:30:00.000Z\",\n        \"updatedAt\": \"2026-02-01T09:30:10.000Z\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/myStatToday",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "myStatToday"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Same as `POST /statistics/myStat` with an extra condition `createdAt >= start of the current day` (server time, UTC).\nAny filters passed in `params.filters` are combined with it.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"params\": {\n    \"sort\": [\n      \"id:desc\"\n    ],\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25\n    },\n    \"populate\": {\n      \"sip\": {\n        \"fields\": [\n          \"number\"\n        ]\n      },\n      \"sipTo\": {\n        \"fields\": [\n          \"number\"\n        ]\n      }\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/myStatToday",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "myStatToday"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Same as `POST /statistics/myStat` with an extra condition `createdAt >= start of the current day` (server time, UTC).\nAny filters passed in `params.filters` are combined with it.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"params\": {\n    \"sort\": [\n      \"id:desc\"\n    ],\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25\n    },\n    \"populate\": {\n      \"sip\": {\n        \"fields\": [\n          \"number\"\n        ]\n      },\n      \"sipTo\": {\n        \"fields\": [\n          \"number\"\n        ]\n      }\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "My last call",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/statistics/get-my-last-call",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "statistics",
                    "get-my-last-call"
                  ],
                  "query": [
                    {
                      "key": "fields",
                      "value": "from,to,code",
                      "description": "Fields to return, e.g. `fields[0]=from&fields[1]=to`.",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Returns the most recent call in which the current user's SIP line was the caller or the callee, as a flat object\n(no `data/attributes` envelope). `fields[]` and `populate` query parameters limit/extend the returned fields,\ne.g. `fields[0]=from&fields[1]=to&populate[callRecord]=true`. Empty body when there are no calls.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Last call (flat object).",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/get-my-last-call",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "get-my-last-call"
                      ],
                      "query": [
                        {
                          "key": "fields",
                          "value": "from,to,code",
                          "description": "Fields to return, e.g. `fields[0]=from&fields[1]=to`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the most recent call in which the current user's SIP line was the caller or the callee, as a flat object\n(no `data/attributes` envelope). `fields[]` and `populate` query parameters limit/extend the returned fields,\ne.g. `fields[0]=from&fields[1]=to&populate[callRecord]=true`. Empty body when there are no calls.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Last call (flat object).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 1001,\n  \"from\": \"380661234567\",\n  \"to\": \"380441234567\",\n  \"code\": \"200\",\n  \"callRecord\": {\n    \"id\": 77,\n    \"name\": \"call-1001-mix.wav\",\n    \"ext\": \".wav\",\n    \"mime\": \"audio/wave\",\n    \"size\": 0.15,\n    \"url\": \"/uploads/recordings/call-1001-mix.wav\"\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/get-my-last-call",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "get-my-last-call"
                      ],
                      "query": [
                        {
                          "key": "fields",
                          "value": "from,to,code",
                          "description": "Fields to return, e.g. `fields[0]=from&fields[1]=to`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the most recent call in which the current user's SIP line was the caller or the callee, as a flat object\n(no `data/attributes` envelope). `fields[]` and `populate` query parameters limit/extend the returned fields,\ne.g. `fields[0]=from&fields[1]=to&populate[callRecord]=true`. Empty body when there are no calls.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/get-my-last-call",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "get-my-last-call"
                      ],
                      "query": [
                        {
                          "key": "fields",
                          "value": "from,to,code",
                          "description": "Fields to return, e.g. `fields[0]=from&fields[1]=to`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the most recent call in which the current user's SIP line was the caller or the callee, as a flat object\n(no `data/attributes` envelope). `fields[]` and `populate` query parameters limit/extend the returned fields,\ne.g. `fields[0]=from&fields[1]=to&populate[callRecord]=true`. Empty body when there are no calls.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Calls of a recall widget",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/statistics/recallWidgetStat/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "statistics",
                    "recallWidgetStat",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "4",
                      "description": "Recall widget id."
                    }
                  ]
                },
                "description": "Call history filtered by the recall widget `id` (calls initiated through that website widget). Same query parameters and response as `GET /statistics`.\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of calls.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/recallWidgetStat/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "recallWidgetStat",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "4",
                          "description": "Recall widget id."
                        }
                      ]
                    },
                    "description": "Call history filtered by the recall widget `id` (calls initiated through that website widget). Same query parameters and response as `GET /statistics`.\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Page of calls.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 0,\n      \"total\": 0\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/recallWidgetStat/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "recallWidgetStat",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "4",
                          "description": "Recall widget id."
                        }
                      ]
                    },
                    "description": "Call history filtered by the recall widget `id` (calls initiated through that website widget). Same query parameters and response as `GET /statistics`.\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/recallWidgetStat/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "recallWidgetStat",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "4",
                          "description": "Recall widget id."
                        }
                      ]
                    },
                    "description": "Call history filtered by the recall widget `id` (calls initiated through that website widget). Same query parameters and response as `GET /statistics`.\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Add a comment to a call",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/statistics/assignCommentary",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "statistics",
                    "assignCommentary"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Sets the free-text `callCommentary` of a call of your company. Returns the updated call, or `data: null` if the call belongs to another company.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"id\": 1001,\n    \"callCommentary\": \"Customer asked to call back tomorrow\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated call.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/assignCommentary",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "assignCommentary"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Sets the free-text `callCommentary` of a call of your company. Returns the updated call, or `data: null` if the call belongs to another company.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"id\": 1001,\n    \"callCommentary\": \"Customer asked to call back tomorrow\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated call.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 1001,\n    \"attributes\": {\n      \"from\": \"380661234567\",\n      \"to\": \"380441234567\",\n      \"code\": \"200\",\n      \"callCommentary\": \"Customer asked to call back tomorrow\",\n      \"createdAt\": \"2026-02-01T09:30:00.000Z\",\n      \"updatedAt\": \"2026-02-01T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error or malformed request.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/assignCommentary",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "assignCommentary"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Sets the free-text `callCommentary` of a call of your company. Returns the updated call, or `data: null` if the call belongs to another company.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"id\": 1001,\n    \"callCommentary\": \"Customer asked to call back tomorrow\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error or malformed request.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"email must be a valid email\",\n    \"details\": {\n      \"errors\": [\n        {\n          \"path\": [\n            \"email\"\n          ],\n          \"message\": \"email must be a valid email\",\n          \"name\": \"ValidationError\"\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/assignCommentary",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "assignCommentary"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Sets the free-text `callCommentary` of a call of your company. Returns the updated call, or `data: null` if the call belongs to another company.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"id\": 1001,\n    \"callCommentary\": \"Customer asked to call back tomorrow\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/assignCommentary",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "assignCommentary"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Sets the free-text `callCommentary` of a call of your company. Returns the updated call, or `data: null` if the call belongs to another company.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"id\": 1001,\n    \"callCommentary\": \"Customer asked to call back tomorrow\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Remove a call comment",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/statistics/deleteCommentary?id=1001",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "statistics",
                    "deleteCommentary"
                  ],
                  "query": [
                    {
                      "key": "id",
                      "value": "1001",
                      "description": "Call (statistic) id.",
                      "disabled": false
                    }
                  ],
                  "variable": []
                },
                "description": "Clears `callCommentary` (sets it to an empty string) of a call of your company. The call itself is kept.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None (only the comment text is cleared)."
              },
              "response": [
                {
                  "name": "200 Updated call (`data: null` if not found in your company).",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/deleteCommentary?id=1001",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "deleteCommentary"
                      ],
                      "query": [
                        {
                          "key": "id",
                          "value": "1001",
                          "description": "Call (statistic) id.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Clears `callCommentary` (sets it to an empty string) of a call of your company. The call itself is kept.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None (only the comment text is cleared)."
                  },
                  "status": "Updated call (`data: null` if not found in your company).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 1001,\n    \"attributes\": {\n      \"from\": \"380661234567\",\n      \"to\": \"380441234567\",\n      \"code\": \"200\",\n      \"callCommentary\": \"\",\n      \"createdAt\": \"2026-02-01T09:30:00.000Z\",\n      \"updatedAt\": \"2026-02-01T10:05:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/deleteCommentary?id=1001",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "deleteCommentary"
                      ],
                      "query": [
                        {
                          "key": "id",
                          "value": "1001",
                          "description": "Call (statistic) id.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Clears `callCommentary` (sets it to an empty string) of a call of your company. The call itself is kept.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None (only the comment text is cleared)."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/deleteCommentary?id=1001",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "deleteCommentary"
                      ],
                      "query": [
                        {
                          "key": "id",
                          "value": "1001",
                          "description": "Call (statistic) id.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Clears `callCommentary` (sets it to an empty string) of a call of your company. The call itself is kept.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None (only the comment text is cleared)."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete several calls",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/statistics/deleteManyRecords?ids=1001,1002",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "statistics",
                    "deleteManyRecords"
                  ],
                  "query": [
                    {
                      "key": "ids",
                      "value": "1001,1002",
                      "description": "Array of call ids: `ids[0]=1001&ids[1]=1002`. A single scalar `ids=1001` is not accepted.",
                      "disabled": false
                    }
                  ],
                  "variable": []
                },
                "description": "Permanently deletes call-history records of your company by ids. Ids must be passed as an array:\n`?ids[0]=1001&ids[1]=1002`. Ids of other companies are ignored; if nothing matches — 400 `Nothing to delete!`.\nThe recording file (`callRecord`) is **not** removed from storage by this call, only the history record is deleted.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Irreversibly deletes the selected call-history records."
              },
              "response": [
                {
                  "name": "200 Number of deleted records.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/deleteManyRecords?ids=1001,1002",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "deleteManyRecords"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "1001,1002",
                          "description": "Array of call ids: `ids[0]=1001&ids[1]=1002`. A single scalar `ids=1001` is not accepted.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Permanently deletes call-history records of your company by ids. Ids must be passed as an array:\n`?ids[0]=1001&ids[1]=1002`. Ids of other companies are ignored; if nothing matches — 400 `Nothing to delete!`.\nThe recording file (`callRecord`) is **not** removed from storage by this call, only the history record is deleted.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Irreversibly deletes the selected call-history records."
                  },
                  "status": "Number of deleted records.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"count\": 2\n}"
                },
                {
                  "name": "400 `Invalid params` (no `ids`) or `Nothing to delete!` (no matching calls in your company).",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/deleteManyRecords?ids=1001,1002",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "deleteManyRecords"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "1001,1002",
                          "description": "Array of call ids: `ids[0]=1001&ids[1]=1002`. A single scalar `ids=1001` is not accepted.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Permanently deletes call-history records of your company by ids. Ids must be passed as an array:\n`?ids[0]=1001&ids[1]=1002`. Ids of other companies are ignored; if nothing matches — 400 `Nothing to delete!`.\nThe recording file (`callRecord`) is **not** removed from storage by this call, only the history record is deleted.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Irreversibly deletes the selected call-history records."
                  },
                  "status": "`Invalid params` (no `ids`) or `Nothing to delete!` (no matching calls in your company).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Nothing to delete!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/deleteManyRecords?ids=1001,1002",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "deleteManyRecords"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "1001,1002",
                          "description": "Array of call ids: `ids[0]=1001&ids[1]=1002`. A single scalar `ids=1001` is not accepted.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Permanently deletes call-history records of your company by ids. Ids must be passed as an array:\n`?ids[0]=1001&ids[1]=1002`. Ids of other companies are ignored; if nothing matches — 400 `Nothing to delete!`.\nThe recording file (`callRecord`) is **not** removed from storage by this call, only the history record is deleted.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Irreversibly deletes the selected call-history records."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/deleteManyRecords?ids=1001,1002",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        "deleteManyRecords"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "1001,1002",
                          "description": "Array of call ids: `ids[0]=1001&ids[1]=1002`. A single scalar `ids=1001` is not accepted.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Permanently deletes call-history records of your company by ids. Ids must be passed as an array:\n`?ids[0]=1001&ids[1]=1002`. Ids of other companies are ignored; if nothing matches — 400 `Nothing to delete!`.\nThe recording file (`callRecord`) is **not** removed from storage by this call, only the history record is deleted.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Irreversibly deletes the selected call-history records."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete a call",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/statistics/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "statistics",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "1001",
                      "description": "Call (statistic) id."
                    }
                  ]
                },
                "description": "Permanently deletes one call-history record of your company. Returns `{ \"id\": … }` of the deleted record, or `null` if not found in your company. The recording file is not removed from storage.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Irreversibly deletes the call-history record."
              },
              "response": [
                {
                  "name": "200 Deleted record id.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1001",
                          "description": "Call (statistic) id."
                        }
                      ]
                    },
                    "description": "Permanently deletes one call-history record of your company. Returns `{ \"id\": … }` of the deleted record, or `null` if not found in your company. The recording file is not removed from storage.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Irreversibly deletes the call-history record."
                  },
                  "status": "Deleted record id.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 1001\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1001",
                          "description": "Call (statistic) id."
                        }
                      ]
                    },
                    "description": "Permanently deletes one call-history record of your company. Returns `{ \"id\": … }` of the deleted record, or `null` if not found in your company. The recording file is not removed from storage.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Irreversibly deletes the call-history record."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/statistics/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "statistics",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "1001",
                          "description": "Call (statistic) id."
                        }
                      ]
                    },
                    "description": "Permanently deletes one call-history record of your company. Returns `{ \"id\": … }` of the deleted record, or `null` if not found in your company. The recording file is not removed from storage.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Irreversibly deletes the call-history record."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Missed calls",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/missed-calls",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "missed-calls"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns missed-call entries of the company. Each entry links the employee (`user`) who missed the call and the call record (`statistic`).\nCompany owner and supervisor see all missed calls of the company; other roles see only their own.\nUse `populate[statistic]=true&populate[user][fields][0]=firstName` to get details; `populate[statistic][populate][contacts]=true`\nadditionally attaches matching address-book contacts. Filters apply to the missed-call entry, e.g.\n`filters[statistic][callSetupTime][$gte]=<unix seconds>`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of missed calls.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/missed-calls",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "missed-calls"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns missed-call entries of the company. Each entry links the employee (`user`) who missed the call and the call record (`statistic`).\nCompany owner and supervisor see all missed calls of the company; other roles see only their own.\nUse `populate[statistic]=true&populate[user][fields][0]=firstName` to get details; `populate[statistic][populate][contacts]=true`\nadditionally attaches matching address-book contacts. Filters apply to the missed-call entry, e.g.\n`filters[statistic][callSetupTime][$gte]=<unix seconds>`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Page of missed calls.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 501,\n      \"attributes\": {\n        \"createdAt\": \"2026-02-01T09:30:10.000Z\",\n        \"updatedAt\": \"2026-02-01T09:30:10.000Z\",\n        \"statistic\": {\n          \"data\": {\n            \"id\": 1002,\n            \"attributes\": {\n              \"from\": \"380661234567\",\n              \"to\": \"380441234567\",\n              \"code\": \"487\",\n              \"reason\": \"Request Terminated\",\n              \"callSetupTime\": \"1790931273\"\n            }\n          }\n        },\n        \"user\": {\n          \"data\": {\n            \"id\": 7,\n            \"attributes\": {\n              \"firstName\": \"John\",\n              \"lastName\": \"Doe\"\n            }\n          }\n        }\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/missed-calls",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "missed-calls"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns missed-call entries of the company. Each entry links the employee (`user`) who missed the call and the call record (`statistic`).\nCompany owner and supervisor see all missed calls of the company; other roles see only their own.\nUse `populate[statistic]=true&populate[user][fields][0]=firstName` to get details; `populate[statistic][populate][contacts]=true`\nadditionally attaches matching address-book contacts. Filters apply to the missed-call entry, e.g.\n`filters[statistic][callSetupTime][$gte]=<unix seconds>`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/missed-calls",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "missed-calls"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns missed-call entries of the company. Each entry links the employee (`user`) who missed the call and the call record (`statistic`).\nCompany owner and supervisor see all missed calls of the company; other roles see only their own.\nUse `populate[statistic]=true&populate[user][fields][0]=firstName` to get details; `populate[statistic][populate][contacts]=true`\nadditionally attaches matching address-book contacts. Filters apply to the missed-call entry, e.g.\n`filters[statistic][callSetupTime][$gte]=<unix seconds>`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get missed call",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/missed-calls/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "missed-calls",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "501",
                      "description": "Missed-call entry id."
                    }
                  ]
                },
                "description": "Returns one missed-call entry by id (standard Strapi `findOne`, supports `populate`).\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Missed call.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/missed-calls/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "missed-calls",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "501",
                          "description": "Missed-call entry id."
                        }
                      ]
                    },
                    "description": "Returns one missed-call entry by id (standard Strapi `findOne`, supports `populate`).\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missed call.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 501,\n    \"attributes\": {\n      \"createdAt\": \"2026-02-01T09:30:10.000Z\",\n      \"updatedAt\": \"2026-02-01T09:30:10.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/missed-calls/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "missed-calls",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "501",
                          "description": "Missed-call entry id."
                        }
                      ]
                    },
                    "description": "Returns one missed-call entry by id (standard Strapi `findOne`, supports `populate`).\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/missed-calls/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "missed-calls",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "501",
                          "description": "Missed-call entry id."
                        }
                      ]
                    },
                    "description": "Returns one missed-call entry by id (standard Strapi `findOne`, supports `populate`).\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/missed-calls/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "missed-calls",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "501",
                          "description": "Missed-call entry id."
                        }
                      ]
                    },
                    "description": "Returns one missed-call entry by id (standard Strapi `findOne`, supports `populate`).\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Incoming calls from billing",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/companies/inCalls?start_date=2026-02-01 00:00:00&end_date=2026-02-07 23:59:59",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "companies",
                    "inCalls"
                  ],
                  "query": [
                    {
                      "key": "start_date",
                      "value": "2026-02-01 00:00:00",
                      "description": "Period start, `YYYY-MM-DD HH:mm:ss` (UTC).",
                      "disabled": false
                    },
                    {
                      "key": "end_date",
                      "value": "2026-02-07 23:59:59",
                      "description": "Period end, `YYYY-MM-DD HH:mm:ss` (UTC). At most 7 days after `start_date`.",
                      "disabled": false
                    },
                    {
                      "key": "limit",
                      "value": "100",
                      "description": "Max rows (default 100).",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Returns the detailed list of **incoming** calls of the company for a period straight from the carrier billing (MediaCore),\nwith the billed cost per call. Dates are `YYYY-MM-DD HH:mm:ss` in UTC. The response is a table: `fields` are the column\nnames and each item of `data` is a row (array of values in the same order).\nColumns: `op_destination`, `tp_destination`, `op_caller_number`, `op_client_name`, `op_cost`, `tp_cost`, `duration`.\n**The period must not exceed 7 days** — otherwise 406 `Not acceptable: Time period is bigger than 7 days`.\nRequires the company to be linked to the billing; otherwise or when billing is unavailable the method answers 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Billing rows.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/inCalls?start_date=2026-02-01 00:00:00&end_date=2026-02-07 23:59:59",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "inCalls"
                      ],
                      "query": [
                        {
                          "key": "start_date",
                          "value": "2026-02-01 00:00:00",
                          "description": "Period start, `YYYY-MM-DD HH:mm:ss` (UTC).",
                          "disabled": false
                        },
                        {
                          "key": "end_date",
                          "value": "2026-02-07 23:59:59",
                          "description": "Period end, `YYYY-MM-DD HH:mm:ss` (UTC). At most 7 days after `start_date`.",
                          "disabled": false
                        },
                        {
                          "key": "limit",
                          "value": "100",
                          "description": "Max rows (default 100).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the detailed list of **incoming** calls of the company for a period straight from the carrier billing (MediaCore),\nwith the billed cost per call. Dates are `YYYY-MM-DD HH:mm:ss` in UTC. The response is a table: `fields` are the column\nnames and each item of `data` is a row (array of values in the same order).\nColumns: `op_destination`, `tp_destination`, `op_caller_number`, `op_client_name`, `op_cost`, `tp_cost`, `duration`.\n**The period must not exceed 7 days** — otherwise 406 `Not acceptable: Time period is bigger than 7 days`.\nRequires the company to be linked to the billing; otherwise or when billing is unavailable the method answers 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Billing rows.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"attributes\": {\n      \"fields\": [\n        \"op_destination\",\n        \"tp_destination\",\n        \"op_caller_number\",\n        \"op_client_name\",\n        \"op_cost\",\n        \"tp_cost\",\n        \"duration\"\n      ],\n      \"data\": [\n        [\n          \"380441234567\",\n          \"380441234567\",\n          \"380661234567\",\n          \"Example LLC\",\n          0,\n          0.02,\n          120\n        ]\n      ]\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 `start_date` or `end_date` must be defined!` / `start_date` and `end_date` must have next template `1990-01-01 00:00:00``.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/inCalls?start_date=2026-02-01 00:00:00&end_date=2026-02-07 23:59:59",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "inCalls"
                      ],
                      "query": [
                        {
                          "key": "start_date",
                          "value": "2026-02-01 00:00:00",
                          "description": "Period start, `YYYY-MM-DD HH:mm:ss` (UTC).",
                          "disabled": false
                        },
                        {
                          "key": "end_date",
                          "value": "2026-02-07 23:59:59",
                          "description": "Period end, `YYYY-MM-DD HH:mm:ss` (UTC). At most 7 days after `start_date`.",
                          "disabled": false
                        },
                        {
                          "key": "limit",
                          "value": "100",
                          "description": "Max rows (default 100).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the detailed list of **incoming** calls of the company for a period straight from the carrier billing (MediaCore),\nwith the billed cost per call. Dates are `YYYY-MM-DD HH:mm:ss` in UTC. The response is a table: `fields` are the column\nnames and each item of `data` is a row (array of values in the same order).\nColumns: `op_destination`, `tp_destination`, `op_caller_number`, `op_client_name`, `op_cost`, `tp_cost`, `duration`.\n**The period must not exceed 7 days** — otherwise 406 `Not acceptable: Time period is bigger than 7 days`.\nRequires the company to be linked to the billing; otherwise or when billing is unavailable the method answers 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "`start_date` or `end_date` must be defined!` / `start_date` and `end_date` must have next template `1990-01-01 00:00:00``.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"`start_date` and `end_date` must have next template `1990-01-01 00:00:00`\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/inCalls?start_date=2026-02-01 00:00:00&end_date=2026-02-07 23:59:59",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "inCalls"
                      ],
                      "query": [
                        {
                          "key": "start_date",
                          "value": "2026-02-01 00:00:00",
                          "description": "Period start, `YYYY-MM-DD HH:mm:ss` (UTC).",
                          "disabled": false
                        },
                        {
                          "key": "end_date",
                          "value": "2026-02-07 23:59:59",
                          "description": "Period end, `YYYY-MM-DD HH:mm:ss` (UTC). At most 7 days after `start_date`.",
                          "disabled": false
                        },
                        {
                          "key": "limit",
                          "value": "100",
                          "description": "Max rows (default 100).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the detailed list of **incoming** calls of the company for a period straight from the carrier billing (MediaCore),\nwith the billed cost per call. Dates are `YYYY-MM-DD HH:mm:ss` in UTC. The response is a table: `fields` are the column\nnames and each item of `data` is a row (array of values in the same order).\nColumns: `op_destination`, `tp_destination`, `op_caller_number`, `op_client_name`, `op_cost`, `tp_cost`, `duration`.\n**The period must not exceed 7 days** — otherwise 406 `Not acceptable: Time period is bigger than 7 days`.\nRequires the company to be linked to the billing; otherwise or when billing is unavailable the method answers 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/inCalls?start_date=2026-02-01 00:00:00&end_date=2026-02-07 23:59:59",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "inCalls"
                      ],
                      "query": [
                        {
                          "key": "start_date",
                          "value": "2026-02-01 00:00:00",
                          "description": "Period start, `YYYY-MM-DD HH:mm:ss` (UTC).",
                          "disabled": false
                        },
                        {
                          "key": "end_date",
                          "value": "2026-02-07 23:59:59",
                          "description": "Period end, `YYYY-MM-DD HH:mm:ss` (UTC). At most 7 days after `start_date`.",
                          "disabled": false
                        },
                        {
                          "key": "limit",
                          "value": "100",
                          "description": "Max rows (default 100).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the detailed list of **incoming** calls of the company for a period straight from the carrier billing (MediaCore),\nwith the billed cost per call. Dates are `YYYY-MM-DD HH:mm:ss` in UTC. The response is a table: `fields` are the column\nnames and each item of `data` is a row (array of values in the same order).\nColumns: `op_destination`, `tp_destination`, `op_caller_number`, `op_client_name`, `op_cost`, `tp_cost`, `duration`.\n**The period must not exceed 7 days** — otherwise 406 `Not acceptable: Time period is bigger than 7 days`.\nRequires the company to be linked to the billing; otherwise or when billing is unavailable the method answers 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "406 Requested period is longer than 7 days.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/inCalls?start_date=2026-02-01 00:00:00&end_date=2026-02-07 23:59:59",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "inCalls"
                      ],
                      "query": [
                        {
                          "key": "start_date",
                          "value": "2026-02-01 00:00:00",
                          "description": "Period start, `YYYY-MM-DD HH:mm:ss` (UTC).",
                          "disabled": false
                        },
                        {
                          "key": "end_date",
                          "value": "2026-02-07 23:59:59",
                          "description": "Period end, `YYYY-MM-DD HH:mm:ss` (UTC). At most 7 days after `start_date`.",
                          "disabled": false
                        },
                        {
                          "key": "limit",
                          "value": "100",
                          "description": "Max rows (default 100).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the detailed list of **incoming** calls of the company for a period straight from the carrier billing (MediaCore),\nwith the billed cost per call. Dates are `YYYY-MM-DD HH:mm:ss` in UTC. The response is a table: `fields` are the column\nnames and each item of `data` is a row (array of values in the same order).\nColumns: `op_destination`, `tp_destination`, `op_caller_number`, `op_client_name`, `op_cost`, `tp_cost`, `duration`.\n**The period must not exceed 7 days** — otherwise 406 `Not acceptable: Time period is bigger than 7 days`.\nRequires the company to be linked to the billing; otherwise or when billing is unavailable the method answers 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Requested period is longer than 7 days.",
                  "code": 406,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 406,\n    \"name\": \"ApplicationError\",\n    \"message\": \"Not acceptable: Time period is bigger than 7 days\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/inCalls?start_date=2026-02-01 00:00:00&end_date=2026-02-07 23:59:59",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "inCalls"
                      ],
                      "query": [
                        {
                          "key": "start_date",
                          "value": "2026-02-01 00:00:00",
                          "description": "Period start, `YYYY-MM-DD HH:mm:ss` (UTC).",
                          "disabled": false
                        },
                        {
                          "key": "end_date",
                          "value": "2026-02-07 23:59:59",
                          "description": "Period end, `YYYY-MM-DD HH:mm:ss` (UTC). At most 7 days after `start_date`.",
                          "disabled": false
                        },
                        {
                          "key": "limit",
                          "value": "100",
                          "description": "Max rows (default 100).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the detailed list of **incoming** calls of the company for a period straight from the carrier billing (MediaCore),\nwith the billed cost per call. Dates are `YYYY-MM-DD HH:mm:ss` in UTC. The response is a table: `fields` are the column\nnames and each item of `data` is a row (array of values in the same order).\nColumns: `op_destination`, `tp_destination`, `op_caller_number`, `op_client_name`, `op_cost`, `tp_cost`, `duration`.\n**The period must not exceed 7 days** — otherwise 406 `Not acceptable: Time period is bigger than 7 days`.\nRequires the company to be linked to the billing; otherwise or when billing is unavailable the method answers 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Outgoing calls from billing",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/companies/outCalls?start_date=2026-02-01 00:00:00&end_date=2026-02-07 23:59:59",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "companies",
                    "outCalls"
                  ],
                  "query": [
                    {
                      "key": "start_date",
                      "value": "2026-02-01 00:00:00",
                      "description": "Period start, `YYYY-MM-DD HH:mm:ss` (UTC).",
                      "disabled": false
                    },
                    {
                      "key": "end_date",
                      "value": "2026-02-07 23:59:59",
                      "description": "Period end, `YYYY-MM-DD HH:mm:ss` (UTC). At most 7 days after `start_date`.",
                      "disabled": false
                    },
                    {
                      "key": "limit",
                      "value": "100",
                      "description": "Max rows (default 100).",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Returns the detailed list of **outgoing** calls of the company for a period from the carrier billing (MediaCore) with the billed\ncost per call. Same format and rules as `GET /companies/inCalls`, including the **7-day maximum period** (406 otherwise).\nColumns: `op_caller_number`, `called_number_out`, `duration`, `op_cost`, `connect_time`, `disconnect_time`, `disconnect_cause`, `disconnect_cause_name`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Billing rows.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/outCalls?start_date=2026-02-01 00:00:00&end_date=2026-02-07 23:59:59",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "outCalls"
                      ],
                      "query": [
                        {
                          "key": "start_date",
                          "value": "2026-02-01 00:00:00",
                          "description": "Period start, `YYYY-MM-DD HH:mm:ss` (UTC).",
                          "disabled": false
                        },
                        {
                          "key": "end_date",
                          "value": "2026-02-07 23:59:59",
                          "description": "Period end, `YYYY-MM-DD HH:mm:ss` (UTC). At most 7 days after `start_date`.",
                          "disabled": false
                        },
                        {
                          "key": "limit",
                          "value": "100",
                          "description": "Max rows (default 100).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the detailed list of **outgoing** calls of the company for a period from the carrier billing (MediaCore) with the billed\ncost per call. Same format and rules as `GET /companies/inCalls`, including the **7-day maximum period** (406 otherwise).\nColumns: `op_caller_number`, `called_number_out`, `duration`, `op_cost`, `connect_time`, `disconnect_time`, `disconnect_cause`, `disconnect_cause_name`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Billing rows.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"attributes\": {\n      \"fields\": [\n        \"op_caller_number\",\n        \"called_number_out\",\n        \"duration\",\n        \"op_cost\",\n        \"connect_time\",\n        \"disconnect_time\",\n        \"disconnect_cause\",\n        \"disconnect_cause_name\"\n      ],\n      \"data\": [\n        [\n          \"380441234567\",\n          \"380661234567\",\n          65,\n          0.05,\n          \"2026-02-01 09:30:05\",\n          \"2026-02-01 09:31:10\",\n          16,\n          \"Normal call clearing\"\n        ]\n      ]\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 `start_date`/`end_date` missing or not in `YYYY-MM-DD HH:mm:ss` format.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/outCalls?start_date=2026-02-01 00:00:00&end_date=2026-02-07 23:59:59",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "outCalls"
                      ],
                      "query": [
                        {
                          "key": "start_date",
                          "value": "2026-02-01 00:00:00",
                          "description": "Period start, `YYYY-MM-DD HH:mm:ss` (UTC).",
                          "disabled": false
                        },
                        {
                          "key": "end_date",
                          "value": "2026-02-07 23:59:59",
                          "description": "Period end, `YYYY-MM-DD HH:mm:ss` (UTC). At most 7 days after `start_date`.",
                          "disabled": false
                        },
                        {
                          "key": "limit",
                          "value": "100",
                          "description": "Max rows (default 100).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the detailed list of **outgoing** calls of the company for a period from the carrier billing (MediaCore) with the billed\ncost per call. Same format and rules as `GET /companies/inCalls`, including the **7-day maximum period** (406 otherwise).\nColumns: `op_caller_number`, `called_number_out`, `duration`, `op_cost`, `connect_time`, `disconnect_time`, `disconnect_cause`, `disconnect_cause_name`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "`start_date`/`end_date` missing or not in `YYYY-MM-DD HH:mm:ss` format.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"`start_date` or `end_date` must be defined!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/outCalls?start_date=2026-02-01 00:00:00&end_date=2026-02-07 23:59:59",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "outCalls"
                      ],
                      "query": [
                        {
                          "key": "start_date",
                          "value": "2026-02-01 00:00:00",
                          "description": "Period start, `YYYY-MM-DD HH:mm:ss` (UTC).",
                          "disabled": false
                        },
                        {
                          "key": "end_date",
                          "value": "2026-02-07 23:59:59",
                          "description": "Period end, `YYYY-MM-DD HH:mm:ss` (UTC). At most 7 days after `start_date`.",
                          "disabled": false
                        },
                        {
                          "key": "limit",
                          "value": "100",
                          "description": "Max rows (default 100).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the detailed list of **outgoing** calls of the company for a period from the carrier billing (MediaCore) with the billed\ncost per call. Same format and rules as `GET /companies/inCalls`, including the **7-day maximum period** (406 otherwise).\nColumns: `op_caller_number`, `called_number_out`, `duration`, `op_cost`, `connect_time`, `disconnect_time`, `disconnect_cause`, `disconnect_cause_name`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/outCalls?start_date=2026-02-01 00:00:00&end_date=2026-02-07 23:59:59",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "outCalls"
                      ],
                      "query": [
                        {
                          "key": "start_date",
                          "value": "2026-02-01 00:00:00",
                          "description": "Period start, `YYYY-MM-DD HH:mm:ss` (UTC).",
                          "disabled": false
                        },
                        {
                          "key": "end_date",
                          "value": "2026-02-07 23:59:59",
                          "description": "Period end, `YYYY-MM-DD HH:mm:ss` (UTC). At most 7 days after `start_date`.",
                          "disabled": false
                        },
                        {
                          "key": "limit",
                          "value": "100",
                          "description": "Max rows (default 100).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the detailed list of **outgoing** calls of the company for a period from the carrier billing (MediaCore) with the billed\ncost per call. Same format and rules as `GET /companies/inCalls`, including the **7-day maximum period** (406 otherwise).\nColumns: `op_caller_number`, `called_number_out`, `duration`, `op_cost`, `connect_time`, `disconnect_time`, `disconnect_cause`, `disconnect_cause_name`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "406 Requested period is longer than 7 days.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/outCalls?start_date=2026-02-01 00:00:00&end_date=2026-02-07 23:59:59",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "outCalls"
                      ],
                      "query": [
                        {
                          "key": "start_date",
                          "value": "2026-02-01 00:00:00",
                          "description": "Period start, `YYYY-MM-DD HH:mm:ss` (UTC).",
                          "disabled": false
                        },
                        {
                          "key": "end_date",
                          "value": "2026-02-07 23:59:59",
                          "description": "Period end, `YYYY-MM-DD HH:mm:ss` (UTC). At most 7 days after `start_date`.",
                          "disabled": false
                        },
                        {
                          "key": "limit",
                          "value": "100",
                          "description": "Max rows (default 100).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the detailed list of **outgoing** calls of the company for a period from the carrier billing (MediaCore) with the billed\ncost per call. Same format and rules as `GET /companies/inCalls`, including the **7-day maximum period** (406 otherwise).\nColumns: `op_caller_number`, `called_number_out`, `duration`, `op_cost`, `connect_time`, `disconnect_time`, `disconnect_cause`, `disconnect_cause_name`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Requested period is longer than 7 days.",
                  "code": 406,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 406,\n    \"name\": \"ApplicationError\",\n    \"message\": \"Not acceptable: Time period is bigger than 7 days\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/outCalls?start_date=2026-02-01 00:00:00&end_date=2026-02-07 23:59:59",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "outCalls"
                      ],
                      "query": [
                        {
                          "key": "start_date",
                          "value": "2026-02-01 00:00:00",
                          "description": "Period start, `YYYY-MM-DD HH:mm:ss` (UTC).",
                          "disabled": false
                        },
                        {
                          "key": "end_date",
                          "value": "2026-02-07 23:59:59",
                          "description": "Period end, `YYYY-MM-DD HH:mm:ss` (UTC). At most 7 days after `start_date`.",
                          "disabled": false
                        },
                        {
                          "key": "limit",
                          "value": "100",
                          "description": "Max rows (default 100).",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the detailed list of **outgoing** calls of the company for a period from the carrier billing (MediaCore) with the billed\ncost per call. Same format and rules as `GET /companies/inCalls`, including the **7-day maximum period** (406 otherwise).\nColumns: `op_caller_number`, `called_number_out`, `duration`, `op_cost`, `connect_time`, `disconnect_time`, `disconnect_cause`, `disconnect_cause_name`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Join a live call (whisper)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/voip/whisper-into-call",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "voip",
                    "whisper-into-call"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Step 1 of supervisor whispering: asks the media server to attach a WebRTC listening/whisper leg to a call that is in progress.\nThe response is an SDP **offer** plus the `to-tag` of the created dialog. The client must create a WebRTC answer and send it\nwith `POST /voip/answer-to-whispering`.\n\n`callId` is the id of the active call from the live calls feed (Socket.IO stream, key `active-calls:<callId>`), URL-encoded.\nThe body is forwarded to the media server as is; errors of the media server (unknown call, call already ended) surface as 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Attaches an additional media leg to a live call on the media server (the supervisor hears the call and can talk to the employee).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"callId\": \"1790931270-876649432%40203.0.113.10\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 SDP offer of the whisper leg.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/voip/whisper-into-call",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "voip",
                        "whisper-into-call"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Step 1 of supervisor whispering: asks the media server to attach a WebRTC listening/whisper leg to a call that is in progress.\nThe response is an SDP **offer** plus the `to-tag` of the created dialog. The client must create a WebRTC answer and send it\nwith `POST /voip/answer-to-whispering`.\n\n`callId` is the id of the active call from the live calls feed (Socket.IO stream, key `active-calls:<callId>`), URL-encoded.\nThe body is forwarded to the media server as is; errors of the media server (unknown call, call already ended) surface as 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Attaches an additional media leg to a live call on the media server (the supervisor hears the call and can talk to the employee).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"callId\": \"1790931270-876649432%40203.0.113.10\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "SDP offer of the whisper leg.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"sdp\": \"v=0\\r\\no=- 123 1 IN IP4 203.0.113.20\\r\\ns=-\\r\\nt=0 0\\r\\nm=audio 10000 UDP/TLS/RTP/SAVPF 111\\r\\n...\",\n  \"to-tag\": \"a1b2c3d4\"\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/voip/whisper-into-call",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "voip",
                        "whisper-into-call"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Step 1 of supervisor whispering: asks the media server to attach a WebRTC listening/whisper leg to a call that is in progress.\nThe response is an SDP **offer** plus the `to-tag` of the created dialog. The client must create a WebRTC answer and send it\nwith `POST /voip/answer-to-whispering`.\n\n`callId` is the id of the active call from the live calls feed (Socket.IO stream, key `active-calls:<callId>`), URL-encoded.\nThe body is forwarded to the media server as is; errors of the media server (unknown call, call already ended) surface as 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Attaches an additional media leg to a live call on the media server (the supervisor hears the call and can talk to the employee).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"callId\": \"1790931270-876649432%40203.0.113.10\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/voip/whisper-into-call",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "voip",
                        "whisper-into-call"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Step 1 of supervisor whispering: asks the media server to attach a WebRTC listening/whisper leg to a call that is in progress.\nThe response is an SDP **offer** plus the `to-tag` of the created dialog. The client must create a WebRTC answer and send it\nwith `POST /voip/answer-to-whispering`.\n\n`callId` is the id of the active call from the live calls feed (Socket.IO stream, key `active-calls:<callId>`), URL-encoded.\nThe body is forwarded to the media server as is; errors of the media server (unknown call, call already ended) surface as 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Attaches an additional media leg to a live call on the media server (the supervisor hears the call and can talk to the employee).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"callId\": \"1790931270-876649432%40203.0.113.10\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/voip/whisper-into-call",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "voip",
                        "whisper-into-call"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Step 1 of supervisor whispering: asks the media server to attach a WebRTC listening/whisper leg to a call that is in progress.\nThe response is an SDP **offer** plus the `to-tag` of the created dialog. The client must create a WebRTC answer and send it\nwith `POST /voip/answer-to-whispering`.\n\n`callId` is the id of the active call from the live calls feed (Socket.IO stream, key `active-calls:<callId>`), URL-encoded.\nThe body is forwarded to the media server as is; errors of the media server (unknown call, call already ended) surface as 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Attaches an additional media leg to a live call on the media server (the supervisor hears the call and can talk to the employee).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"callId\": \"1790931270-876649432%40203.0.113.10\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Complete joining a live call",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/voip/answer-to-whispering",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "voip",
                    "answer-to-whispering"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Step 2 of supervisor whispering: sends the WebRTC SDP **answer** for the offer received from `POST /voip/whisper-into-call`.\nAfter this the media starts flowing to the supervisor's browser. Body is forwarded to the media server as is.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Starts the media stream of the whisper leg on the media server.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"sdp\": \"v=0\\r\\no=- 456 1 IN IP4 0.0.0.0\\r\\ns=-\\r\\nt=0 0\\r\\nm=audio 9 UDP/TLS/RTP/SAVPF 111\\r\\n...\",\n  \"toTag\": \"a1b2c3d4\",\n  \"callId\": \"1790931270-876649432%40203.0.113.10\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Media server acknowledgement (JSON-RPC result, shape defined by the media server).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/voip/answer-to-whispering",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "voip",
                        "answer-to-whispering"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Step 2 of supervisor whispering: sends the WebRTC SDP **answer** for the offer received from `POST /voip/whisper-into-call`.\nAfter this the media starts flowing to the supervisor's browser. Body is forwarded to the media server as is.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Starts the media stream of the whisper leg on the media server.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"sdp\": \"v=0\\r\\no=- 456 1 IN IP4 0.0.0.0\\r\\ns=-\\r\\nt=0 0\\r\\nm=audio 9 UDP/TLS/RTP/SAVPF 111\\r\\n...\",\n  \"toTag\": \"a1b2c3d4\",\n  \"callId\": \"1790931270-876649432%40203.0.113.10\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Media server acknowledgement (JSON-RPC result, shape defined by the media server).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"result\": \"ok\"\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/voip/answer-to-whispering",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "voip",
                        "answer-to-whispering"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Step 2 of supervisor whispering: sends the WebRTC SDP **answer** for the offer received from `POST /voip/whisper-into-call`.\nAfter this the media starts flowing to the supervisor's browser. Body is forwarded to the media server as is.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Starts the media stream of the whisper leg on the media server.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"sdp\": \"v=0\\r\\no=- 456 1 IN IP4 0.0.0.0\\r\\ns=-\\r\\nt=0 0\\r\\nm=audio 9 UDP/TLS/RTP/SAVPF 111\\r\\n...\",\n  \"toTag\": \"a1b2c3d4\",\n  \"callId\": \"1790931270-876649432%40203.0.113.10\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/voip/answer-to-whispering",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "voip",
                        "answer-to-whispering"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Step 2 of supervisor whispering: sends the WebRTC SDP **answer** for the offer received from `POST /voip/whisper-into-call`.\nAfter this the media starts flowing to the supervisor's browser. Body is forwarded to the media server as is.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Starts the media stream of the whisper leg on the media server.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"sdp\": \"v=0\\r\\no=- 456 1 IN IP4 0.0.0.0\\r\\ns=-\\r\\nt=0 0\\r\\nm=audio 9 UDP/TLS/RTP/SAVPF 111\\r\\n...\",\n  \"toTag\": \"a1b2c3d4\",\n  \"callId\": \"1790931270-876649432%40203.0.113.10\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/voip/answer-to-whispering",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "voip",
                        "answer-to-whispering"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Step 2 of supervisor whispering: sends the WebRTC SDP **answer** for the offer received from `POST /voip/whisper-into-call`.\nAfter this the media starts flowing to the supervisor's browser. Body is forwarded to the media server as is.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Starts the media stream of the whisper leg on the media server.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"sdp\": \"v=0\\r\\no=- 456 1 IN IP4 0.0.0.0\\r\\ns=-\\r\\nt=0 0\\r\\nm=audio 9 UDP/TLS/RTP/SAVPF 111\\r\\n...\",\n  \"toTag\": \"a1b2c3d4\",\n  \"callId\": \"1790931270-876649432%40203.0.113.10\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            }
          ]
        },
        {
          "name": "IVR & Groups",
          "description": "IVR menus, working hours and call groups (queues) of employees.",
          "item": [
            {
              "name": "List IVR menus",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/ivrs",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "ivrs"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the IVR menus of the authenticated user's company (the company filter is added server-side, you cannot see other companies' IVRs).\nStandard Strapi query parameters are supported. Useful `populate` values: `domain`, `ivr_work_times`, `redirection_data`, `in_phone_lines`, `hold_time_expired_audio`, `max_input_exided_audio`, `wrong_input_audio`.\nUseful filters: `filters[domain][id][$eq]=12`, `filters[name][$contains]=Sales`.\nTo build the full menu tree, request `/ivr-work-times?filters[work_time][id][$eq]=<ivrId>&populate=*` and `/ivr-menu-items?filters[ivr_work_time][id][$eq]=<workTimeId>&populate=*`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of IVR menus.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the IVR menus of the authenticated user's company (the company filter is added server-side, you cannot see other companies' IVRs).\nStandard Strapi query parameters are supported. Useful `populate` values: `domain`, `ivr_work_times`, `redirection_data`, `in_phone_lines`, `hold_time_expired_audio`, `max_input_exided_audio`, `wrong_input_audio`.\nUseful filters: `filters[domain][id][$eq]=12`, `filters[name][$contains]=Sales`.\nTo build the full menu tree, request `/ivr-work-times?filters[work_time][id][$eq]=<ivrId>&populate=*` and `/ivr-menu-items?filters[ivr_work_time][id][$eq]=<workTimeId>&populate=*`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Page of IVR menus.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 7,\n      \"attributes\": {\n        \"name\": \"Main menu\",\n        \"description\": \"Greeting and department selection\",\n        \"number\": \"000\",\n        \"hold_time\": 5,\n        \"max_input\": 3,\n        \"redirection\": \"group\",\n        \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n        \"updatedAt\": \"2026-01-16T09:30:00.000Z\",\n        \"domain\": {\n          \"data\": {\n            \"id\": 12,\n            \"attributes\": {\n              \"name\": \"examplellc\"\n            }\n          }\n        },\n        \"ivr_work_times\": {\n          \"data\": [\n            {\n              \"id\": 21,\n              \"attributes\": {\n                \"type\": \"byDates\",\n                \"date\": {\n                  \"mon\": \"09:00-18:00\",\n                  \"tue\": \"09:00-18:00\",\n                  \"wed\": \"09:00-18:00\",\n                  \"thu\": \"09:00-18:00\",\n                  \"fri\": \"09:00-18:00\"\n                },\n                \"use_global_redirect\": true\n              }\n            },\n            {\n              \"id\": 22,\n              \"attributes\": {\n                \"type\": \"any\",\n                \"date\": null,\n                \"use_global_redirect\": true\n              }\n            }\n          ]\n        },\n        \"redirection_data\": {\n          \"id\": 31,\n          \"call_end\": false,\n          \"extension\": null\n        }\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the IVR menus of the authenticated user's company (the company filter is added server-side, you cannot see other companies' IVRs).\nStandard Strapi query parameters are supported. Useful `populate` values: `domain`, `ivr_work_times`, `redirection_data`, `in_phone_lines`, `hold_time_expired_audio`, `max_input_exided_audio`, `wrong_input_audio`.\nUseful filters: `filters[domain][id][$eq]=12`, `filters[name][$contains]=Sales`.\nTo build the full menu tree, request `/ivr-work-times?filters[work_time][id][$eq]=<ivrId>&populate=*` and `/ivr-menu-items?filters[ivr_work_time][id][$eq]=<workTimeId>&populate=*`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the IVR menus of the authenticated user's company (the company filter is added server-side, you cannot see other companies' IVRs).\nStandard Strapi query parameters are supported. Useful `populate` values: `domain`, `ivr_work_times`, `redirection_data`, `in_phone_lines`, `hold_time_expired_audio`, `max_input_exided_audio`, `wrong_input_audio`.\nUseful filters: `filters[domain][id][$eq]=12`, `filters[name][$contains]=Sales`.\nTo build the full menu tree, request `/ivr-work-times?filters[work_time][id][$eq]=<ivrId>&populate=*` and `/ivr-menu-items?filters[ivr_work_time][id][$eq]=<workTimeId>&populate=*`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Create an IVR menu",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/ivrs",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "ivrs"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Creates an IVR menu in one of the company's SIP domains. The body is the Strapi envelope `{ \"data\": {...} }`.\nThe internal 3-digit IVR number (`number`) is generated automatically (first free `000`–`999` in the domain); a `number` sent in the body is ignored. `company` is set from the token.\nAudio fields reference the company's audio files (`/company-audios`, type `sound`).\nCreating the IVR alone does not change call routing yet: add working-time blocks (`POST /ivr-work-times`) and menu items (`POST /ivr-menu-items`), then attach a phone number to the IVR through the Numbers API (`addInPhone`). The Asterisk dialplan of the IVR is (re)generated on every `PUT /ivrs/{id}`, `PUT /ivr-work-times/{id}` and `POST /ivr-menu-items`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates a record only; the telephony dialplan is not touched until the IVR is updated or its menu items are saved.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"name\": \"Main menu\",\n    \"description\": \"Greeting and department selection\",\n    \"domain\": 12,\n    \"hold_time\": 5,\n    \"max_input\": 3,\n    \"redirection\": \"group\",\n    \"redirection_data\": {\n      \"group\": 5,\n      \"call_end\": false\n    },\n    \"hold_time_expired_audio\": 101,\n    \"wrong_input_audio\": 102,\n    \"max_input_exided_audio\": 102\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created IVR.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates an IVR menu in one of the company's SIP domains. The body is the Strapi envelope `{ \"data\": {...} }`.\nThe internal 3-digit IVR number (`number`) is generated automatically (first free `000`–`999` in the domain); a `number` sent in the body is ignored. `company` is set from the token.\nAudio fields reference the company's audio files (`/company-audios`, type `sound`).\nCreating the IVR alone does not change call routing yet: add working-time blocks (`POST /ivr-work-times`) and menu items (`POST /ivr-menu-items`), then attach a phone number to the IVR through the Numbers API (`addInPhone`). The Asterisk dialplan of the IVR is (re)generated on every `PUT /ivrs/{id}`, `PUT /ivr-work-times/{id}` and `POST /ivr-menu-items`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates a record only; the telephony dialplan is not touched until the IVR is updated or its menu items are saved.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Main menu\",\n    \"description\": \"Greeting and department selection\",\n    \"domain\": 12,\n    \"hold_time\": 5,\n    \"max_input\": 3,\n    \"redirection\": \"group\",\n    \"redirection_data\": {\n      \"group\": 5,\n      \"call_end\": false\n    },\n    \"hold_time_expired_audio\": 101,\n    \"wrong_input_audio\": 102,\n    \"max_input_exided_audio\": 102\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created IVR.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 7,\n    \"attributes\": {\n      \"name\": \"Main menu\",\n      \"description\": \"Greeting and department selection\",\n      \"number\": \"001\",\n      \"hold_time\": 5,\n      \"max_input\": 3,\n      \"redirection\": \"group\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error. Messages: `Domain required!`, `Domain not found` (domain does not belong to the company), `name must be at least 3 characters`, `Всю номери зайняті в даному пространстві!` (all 1000 IVR numbers in the domain are taken).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates an IVR menu in one of the company's SIP domains. The body is the Strapi envelope `{ \"data\": {...} }`.\nThe internal 3-digit IVR number (`number`) is generated automatically (first free `000`–`999` in the domain); a `number` sent in the body is ignored. `company` is set from the token.\nAudio fields reference the company's audio files (`/company-audios`, type `sound`).\nCreating the IVR alone does not change call routing yet: add working-time blocks (`POST /ivr-work-times`) and menu items (`POST /ivr-menu-items`), then attach a phone number to the IVR through the Numbers API (`addInPhone`). The Asterisk dialplan of the IVR is (re)generated on every `PUT /ivrs/{id}`, `PUT /ivr-work-times/{id}` and `POST /ivr-menu-items`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates a record only; the telephony dialplan is not touched until the IVR is updated or its menu items are saved.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Main menu\",\n    \"description\": \"Greeting and department selection\",\n    \"domain\": 12,\n    \"hold_time\": 5,\n    \"max_input\": 3,\n    \"redirection\": \"group\",\n    \"redirection_data\": {\n      \"group\": 5,\n      \"call_end\": false\n    },\n    \"hold_time_expired_audio\": 101,\n    \"wrong_input_audio\": 102,\n    \"max_input_exided_audio\": 102\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error. Messages: `Domain required!`, `Domain not found` (domain does not belong to the company), `name must be at least 3 characters`, `Всю номери зайняті в даному пространстві!` (all 1000 IVR numbers in the domain are taken).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Domain required!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates an IVR menu in one of the company's SIP domains. The body is the Strapi envelope `{ \"data\": {...} }`.\nThe internal 3-digit IVR number (`number`) is generated automatically (first free `000`–`999` in the domain); a `number` sent in the body is ignored. `company` is set from the token.\nAudio fields reference the company's audio files (`/company-audios`, type `sound`).\nCreating the IVR alone does not change call routing yet: add working-time blocks (`POST /ivr-work-times`) and menu items (`POST /ivr-menu-items`), then attach a phone number to the IVR through the Numbers API (`addInPhone`). The Asterisk dialplan of the IVR is (re)generated on every `PUT /ivrs/{id}`, `PUT /ivr-work-times/{id}` and `POST /ivr-menu-items`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates a record only; the telephony dialplan is not touched until the IVR is updated or its menu items are saved.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Main menu\",\n    \"description\": \"Greeting and department selection\",\n    \"domain\": 12,\n    \"hold_time\": 5,\n    \"max_input\": 3,\n    \"redirection\": \"group\",\n    \"redirection_data\": {\n      \"group\": 5,\n      \"call_end\": false\n    },\n    \"hold_time_expired_audio\": 101,\n    \"wrong_input_audio\": 102,\n    \"max_input_exided_audio\": 102\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates an IVR menu in one of the company's SIP domains. The body is the Strapi envelope `{ \"data\": {...} }`.\nThe internal 3-digit IVR number (`number`) is generated automatically (first free `000`–`999` in the domain); a `number` sent in the body is ignored. `company` is set from the token.\nAudio fields reference the company's audio files (`/company-audios`, type `sound`).\nCreating the IVR alone does not change call routing yet: add working-time blocks (`POST /ivr-work-times`) and menu items (`POST /ivr-menu-items`), then attach a phone number to the IVR through the Numbers API (`addInPhone`). The Asterisk dialplan of the IVR is (re)generated on every `PUT /ivrs/{id}`, `PUT /ivr-work-times/{id}` and `POST /ivr-menu-items`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates a record only; the telephony dialplan is not touched until the IVR is updated or its menu items are saved.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Main menu\",\n    \"description\": \"Greeting and department selection\",\n    \"domain\": 12,\n    \"hold_time\": 5,\n    \"max_input\": 3,\n    \"redirection\": \"group\",\n    \"redirection_data\": {\n      \"group\": 5,\n      \"call_end\": false\n    },\n    \"hold_time_expired_audio\": 101,\n    \"wrong_input_audio\": 102,\n    \"max_input_exided_audio\": 102\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get an IVR menu",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/ivrs/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "ivrs",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "7",
                      "description": "IVR id."
                    }
                  ]
                },
                "description": "Returns one IVR of the company. Returns `data: null` if the IVR does not exist or belongs to another company. Use `populate` to include relations (e.g. `populate[0]=ivr_work_times&populate[1]=redirection_data&populate[2]=domain`).\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 IVR, or `data: null` when not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "7",
                          "description": "IVR id."
                        }
                      ]
                    },
                    "description": "Returns one IVR of the company. Returns `data: null` if the IVR does not exist or belongs to another company. Use `populate` to include relations (e.g. `populate[0]=ivr_work_times&populate[1]=redirection_data&populate[2]=domain`).\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "IVR, or `data: null` when not found.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 7,\n    \"attributes\": {\n      \"name\": \"Main menu\",\n      \"description\": \"Greeting and department selection\",\n      \"number\": \"001\",\n      \"hold_time\": 5,\n      \"max_input\": 3,\n      \"redirection\": \"group\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-16T09:30:00.000Z\",\n      \"domain\": {\n        \"data\": {\n          \"id\": 12,\n          \"attributes\": {\n            \"name\": \"examplellc\"\n          }\n        }\n      },\n      \"redirection_data\": {\n        \"id\": 31,\n        \"call_end\": false,\n        \"extension\": null,\n        \"group\": {\n          \"data\": {\n            \"id\": 5,\n            \"attributes\": {\n              \"name\": \"Sales\",\n              \"number\": \"001\"\n            }\n          }\n        }\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "7",
                          "description": "IVR id."
                        }
                      ]
                    },
                    "description": "Returns one IVR of the company. Returns `data: null` if the IVR does not exist or belongs to another company. Use `populate` to include relations (e.g. `populate[0]=ivr_work_times&populate[1]=redirection_data&populate[2]=domain`).\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "7",
                          "description": "IVR id."
                        }
                      ]
                    },
                    "description": "Returns one IVR of the company. Returns `data: null` if the IVR does not exist or belongs to another company. Use `populate` to include relations (e.g. `populate[0]=ivr_work_times&populate[1]=redirection_data&populate[2]=domain`).\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update an IVR menu",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/ivrs/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "ivrs",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "7",
                      "description": "IVR id."
                    }
                  ]
                },
                "description": "Updates IVR settings (name, timeouts, audio, final redirect). Body: `{ \"data\": {...} }`. `domain` and `number` cannot be changed — they are removed from the body.\nAfter the update the Asterisk dialplan of this IVR is regenerated synchronously from the current IVR, its working-time blocks and menu items, so the change applies to incoming calls immediately after the response.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Regenerates the IVR dialplan in Asterisk (incoming call routing changes immediately).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"name\": \"Main menu (updated)\",\n    \"hold_time\": 7,\n    \"redirection\": \"employee\",\n    \"redirection_data\": {\n      \"user\": 44,\n      \"call_end\": false\n    }\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated IVR.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "7",
                          "description": "IVR id."
                        }
                      ]
                    },
                    "description": "Updates IVR settings (name, timeouts, audio, final redirect). Body: `{ \"data\": {...} }`. `domain` and `number` cannot be changed — they are removed from the body.\nAfter the update the Asterisk dialplan of this IVR is regenerated synchronously from the current IVR, its working-time blocks and menu items, so the change applies to incoming calls immediately after the response.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Regenerates the IVR dialplan in Asterisk (incoming call routing changes immediately).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Main menu (updated)\",\n    \"hold_time\": 7,\n    \"redirection\": \"employee\",\n    \"redirection_data\": {\n      \"user\": 44,\n      \"call_end\": false\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated IVR.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 7,\n    \"attributes\": {\n      \"name\": \"Main menu (updated)\",\n      \"description\": \"Greeting and department selection\",\n      \"number\": \"001\",\n      \"hold_time\": 7,\n      \"max_input\": 3,\n      \"redirection\": \"employee\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-17T12:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error or malformed request.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "7",
                          "description": "IVR id."
                        }
                      ]
                    },
                    "description": "Updates IVR settings (name, timeouts, audio, final redirect). Body: `{ \"data\": {...} }`. `domain` and `number` cannot be changed — they are removed from the body.\nAfter the update the Asterisk dialplan of this IVR is regenerated synchronously from the current IVR, its working-time blocks and menu items, so the change applies to incoming calls immediately after the response.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Regenerates the IVR dialplan in Asterisk (incoming call routing changes immediately).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Main menu (updated)\",\n    \"hold_time\": 7,\n    \"redirection\": \"employee\",\n    \"redirection_data\": {\n      \"user\": 44,\n      \"call_end\": false\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error or malformed request.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"email must be a valid email\",\n    \"details\": {\n      \"errors\": [\n        {\n          \"path\": [\n            \"email\"\n          ],\n          \"message\": \"email must be a valid email\",\n          \"name\": \"ValidationError\"\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "7",
                          "description": "IVR id."
                        }
                      ]
                    },
                    "description": "Updates IVR settings (name, timeouts, audio, final redirect). Body: `{ \"data\": {...} }`. `domain` and `number` cannot be changed — they are removed from the body.\nAfter the update the Asterisk dialplan of this IVR is regenerated synchronously from the current IVR, its working-time blocks and menu items, so the change applies to incoming calls immediately after the response.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Regenerates the IVR dialplan in Asterisk (incoming call routing changes immediately).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Main menu (updated)\",\n    \"hold_time\": 7,\n    \"redirection\": \"employee\",\n    \"redirection_data\": {\n      \"user\": 44,\n      \"call_end\": false\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "7",
                          "description": "IVR id."
                        }
                      ]
                    },
                    "description": "Updates IVR settings (name, timeouts, audio, final redirect). Body: `{ \"data\": {...} }`. `domain` and `number` cannot be changed — they are removed from the body.\nAfter the update the Asterisk dialplan of this IVR is regenerated synchronously from the current IVR, its working-time blocks and menu items, so the change applies to incoming calls immediately after the response.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Regenerates the IVR dialplan in Asterisk (incoming call routing changes immediately).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Main menu (updated)\",\n    \"hold_time\": 7,\n    \"redirection\": \"employee\",\n    \"redirection_data\": {\n      \"user\": 44,\n      \"call_end\": false\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "7",
                          "description": "IVR id."
                        }
                      ]
                    },
                    "description": "Updates IVR settings (name, timeouts, audio, final redirect). Body: `{ \"data\": {...} }`. `domain` and `number` cannot be changed — they are removed from the body.\nAfter the update the Asterisk dialplan of this IVR is regenerated synchronously from the current IVR, its working-time blocks and menu items, so the change applies to incoming calls immediately after the response.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Regenerates the IVR dialplan in Asterisk (incoming call routing changes immediately).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Main menu (updated)\",\n    \"hold_time\": 7,\n    \"redirection\": \"employee\",\n    \"redirection_data\": {\n      \"user\": 44,\n      \"call_end\": false\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete an IVR menu",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/ivrs/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "ivrs",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "7",
                      "description": "IVR id."
                    }
                  ]
                },
                "description": "Deletes an IVR. Refused while a phone number is routed to the IVR (detach it first through the Numbers API) or while a recall widget redirects to it.\nWorking-time blocks and menu items that belong to the IVR are not deleted automatically (they remain as orphans).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the IVR record permanently."
              },
              "response": [
                {
                  "name": "200 Deleted IVR (or `data: null` if nothing was deleted).",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "7",
                          "description": "IVR id."
                        }
                      ]
                    },
                    "description": "Deletes an IVR. Refused while a phone number is routed to the IVR (detach it first through the Numbers API) or while a recall widget redirects to it.\nWorking-time blocks and menu items that belong to the IVR are not deleted automatically (they remain as orphans).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the IVR record permanently."
                  },
                  "status": "Deleted IVR (or `data: null` if nothing was deleted).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 7,\n    \"attributes\": {\n      \"name\": \"Main menu\",\n      \"description\": null,\n      \"number\": \"001\",\n      \"hold_time\": 5,\n      \"max_input\": 3,\n      \"redirection\": \"group\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-16T09:30:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 IVR is still in use. `IVR is attached to phone!` — `details.inPhone` lists the attached numbers; `Remove recall_widget before remove group` — `details.recallWidgetName` lists the widgets.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "7",
                          "description": "IVR id."
                        }
                      ]
                    },
                    "description": "Deletes an IVR. Refused while a phone number is routed to the IVR (detach it first through the Numbers API) or while a recall widget redirects to it.\nWorking-time blocks and menu items that belong to the IVR are not deleted automatically (they remain as orphans).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the IVR record permanently."
                  },
                  "status": "IVR is still in use. `IVR is attached to phone!` — `details.inPhone` lists the attached numbers; `Remove recall_widget before remove group` — `details.recallWidgetName` lists the widgets.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"IVR is attached to phone!\",\n    \"details\": {\n      \"inPhone\": [\n        {\n          \"number\": \"+380441234567\",\n          \"phone_prefix\": null,\n          \"country_prefix\": null\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "7",
                          "description": "IVR id."
                        }
                      ]
                    },
                    "description": "Deletes an IVR. Refused while a phone number is routed to the IVR (detach it first through the Numbers API) or while a recall widget redirects to it.\nWorking-time blocks and menu items that belong to the IVR are not deleted automatically (they remain as orphans).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the IVR record permanently."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivrs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivrs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "7",
                          "description": "IVR id."
                        }
                      ]
                    },
                    "description": "Deletes an IVR. Refused while a phone number is routed to the IVR (detach it first through the Numbers API) or while a recall widget redirects to it.\nWorking-time blocks and menu items that belong to the IVR are not deleted automatically (they remain as orphans).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the IVR record permanently."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "List IVR working-time blocks",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/ivr-work-times",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "ivr-work-times"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns working-time blocks of IVR menus. A block of type `byDates` is active in the given weekday/time ranges (Europe/Kyiv time); a block of type `any` is the fallback used outside those ranges (e.g. the \"we are closed\" announcement). Each block has its own greeting audio and menu items.\nAlways filter by your IVR: `filters[work_time][id][$eq]=7`. Useful `populate`: `hello_audios`, `ivr_menu_description`, `background_audio`, `ivr_menu_items`, `work_time`.\nThe `date` object is returned with weekdays ordered mon → sun.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of working-time blocks.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns working-time blocks of IVR menus. A block of type `byDates` is active in the given weekday/time ranges (Europe/Kyiv time); a block of type `any` is the fallback used outside those ranges (e.g. the \"we are closed\" announcement). Each block has its own greeting audio and menu items.\nAlways filter by your IVR: `filters[work_time][id][$eq]=7`. Useful `populate`: `hello_audios`, `ivr_menu_description`, `background_audio`, `ivr_menu_items`, `work_time`.\nThe `date` object is returned with weekdays ordered mon → sun.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Page of working-time blocks.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 21,\n      \"attributes\": {\n        \"type\": \"byDates\",\n        \"date\": {\n          \"mon\": \"09:00-18:00\",\n          \"tue\": \"09:00-18:00\",\n          \"wed\": \"09:00-18:00\",\n          \"thu\": \"09:00-18:00\",\n          \"fri\": \"09:00-18:00\"\n        },\n        \"use_global_redirect\": true,\n        \"createdAt\": \"2026-01-15T10:05:00.000Z\",\n        \"updatedAt\": \"2026-01-15T10:05:00.000Z\",\n        \"hello_audios\": {\n          \"data\": [\n            {\n              \"id\": 101,\n              \"attributes\": {\n                \"name\": \"Greeting\",\n                \"type\": \"sound\",\n                \"category\": \"additional\",\n                \"url\": \"/uploads/sound/company_1/greeting.wav\",\n                \"size\": 120.5\n              }\n            }\n          ]\n        },\n        \"ivr_menu_description\": {\n          \"data\": {\n            \"id\": 103,\n            \"attributes\": {\n              \"name\": \"Menu description\",\n              \"type\": \"sound\",\n              \"category\": \"additional\",\n              \"url\": \"/uploads/sound/company_1/menu.wav\",\n              \"size\": 80.2\n            }\n          }\n        },\n        \"background_audio\": {\n          \"data\": null\n        },\n        \"work_time\": {\n          \"data\": {\n            \"id\": 7,\n            \"attributes\": {\n              \"name\": \"Main menu\",\n              \"number\": \"001\"\n            }\n          }\n        }\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns working-time blocks of IVR menus. A block of type `byDates` is active in the given weekday/time ranges (Europe/Kyiv time); a block of type `any` is the fallback used outside those ranges (e.g. the \"we are closed\" announcement). Each block has its own greeting audio and menu items.\nAlways filter by your IVR: `filters[work_time][id][$eq]=7`. Useful `populate`: `hello_audios`, `ivr_menu_description`, `background_audio`, `ivr_menu_items`, `work_time`.\nThe `date` object is returned with weekdays ordered mon → sun.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns working-time blocks of IVR menus. A block of type `byDates` is active in the given weekday/time ranges (Europe/Kyiv time); a block of type `any` is the fallback used outside those ranges (e.g. the \"we are closed\" announcement). Each block has its own greeting audio and menu items.\nAlways filter by your IVR: `filters[work_time][id][$eq]=7`. Useful `populate`: `hello_audios`, `ivr_menu_description`, `background_audio`, `ivr_menu_items`, `work_time`.\nThe `date` object is returned with weekdays ordered mon → sun.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Create an IVR working-time block",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/ivr-work-times",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "ivr-work-times"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Adds a working-time block to an IVR (`work_time` = IVR id). Body: `{ \"data\": {...} }`.\n`type: byDates` requires `date` — an object with weekday keys `mon`…`sun` and values `HH:MM-HH:MM` (Europe/Kyiv). `type: any` is the fallback block (usually one per IVR, no `date`).\nCreating a block does not regenerate the dialplan by itself; it is picked up on the next `PUT /ivrs/{id}`, `PUT /ivr-work-times/{id}` or `POST /ivr-menu-items`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates a record only.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"type\": \"byDates\",\n    \"date\": {\n      \"mon\": \"09:00-18:00\",\n      \"tue\": \"09:00-18:00\",\n      \"wed\": \"09:00-18:00\",\n      \"thu\": \"09:00-18:00\",\n      \"fri\": \"09:00-18:00\"\n    },\n    \"work_time\": 7,\n    \"hello_audios\": [\n      101\n    ],\n    \"ivr_menu_description\": 103,\n    \"use_global_redirect\": true\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created block.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Adds a working-time block to an IVR (`work_time` = IVR id). Body: `{ \"data\": {...} }`.\n`type: byDates` requires `date` — an object with weekday keys `mon`…`sun` and values `HH:MM-HH:MM` (Europe/Kyiv). `type: any` is the fallback block (usually one per IVR, no `date`).\nCreating a block does not regenerate the dialplan by itself; it is picked up on the next `PUT /ivrs/{id}`, `PUT /ivr-work-times/{id}` or `POST /ivr-menu-items`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates a record only.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"type\": \"byDates\",\n    \"date\": {\n      \"mon\": \"09:00-18:00\",\n      \"tue\": \"09:00-18:00\",\n      \"wed\": \"09:00-18:00\",\n      \"thu\": \"09:00-18:00\",\n      \"fri\": \"09:00-18:00\"\n    },\n    \"work_time\": 7,\n    \"hello_audios\": [\n      101\n    ],\n    \"ivr_menu_description\": 103,\n    \"use_global_redirect\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created block.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 21,\n    \"attributes\": {\n      \"type\": \"byDates\",\n      \"date\": {\n        \"mon\": \"09:00-18:00\",\n        \"tue\": \"09:00-18:00\",\n        \"wed\": \"09:00-18:00\",\n        \"thu\": \"09:00-18:00\",\n        \"fri\": \"09:00-18:00\"\n      },\n      \"use_global_redirect\": true,\n      \"createdAt\": \"2026-01-15T10:05:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:05:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error, e.g. `type must be one of the following values: any, byDates`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Adds a working-time block to an IVR (`work_time` = IVR id). Body: `{ \"data\": {...} }`.\n`type: byDates` requires `date` — an object with weekday keys `mon`…`sun` and values `HH:MM-HH:MM` (Europe/Kyiv). `type: any` is the fallback block (usually one per IVR, no `date`).\nCreating a block does not regenerate the dialplan by itself; it is picked up on the next `PUT /ivrs/{id}`, `PUT /ivr-work-times/{id}` or `POST /ivr-menu-items`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates a record only.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"type\": \"byDates\",\n    \"date\": {\n      \"mon\": \"09:00-18:00\",\n      \"tue\": \"09:00-18:00\",\n      \"wed\": \"09:00-18:00\",\n      \"thu\": \"09:00-18:00\",\n      \"fri\": \"09:00-18:00\"\n    },\n    \"work_time\": 7,\n    \"hello_audios\": [\n      101\n    ],\n    \"ivr_menu_description\": 103,\n    \"use_global_redirect\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error, e.g. `type must be one of the following values: any, byDates`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"type is a required field\",\n    \"details\": {\n      \"errors\": [\n        {\n          \"path\": [\n            \"type\"\n          ],\n          \"message\": \"type is a required field\",\n          \"name\": \"ValidationError\"\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Adds a working-time block to an IVR (`work_time` = IVR id). Body: `{ \"data\": {...} }`.\n`type: byDates` requires `date` — an object with weekday keys `mon`…`sun` and values `HH:MM-HH:MM` (Europe/Kyiv). `type: any` is the fallback block (usually one per IVR, no `date`).\nCreating a block does not regenerate the dialplan by itself; it is picked up on the next `PUT /ivrs/{id}`, `PUT /ivr-work-times/{id}` or `POST /ivr-menu-items`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates a record only.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"type\": \"byDates\",\n    \"date\": {\n      \"mon\": \"09:00-18:00\",\n      \"tue\": \"09:00-18:00\",\n      \"wed\": \"09:00-18:00\",\n      \"thu\": \"09:00-18:00\",\n      \"fri\": \"09:00-18:00\"\n    },\n    \"work_time\": 7,\n    \"hello_audios\": [\n      101\n    ],\n    \"ivr_menu_description\": 103,\n    \"use_global_redirect\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Adds a working-time block to an IVR (`work_time` = IVR id). Body: `{ \"data\": {...} }`.\n`type: byDates` requires `date` — an object with weekday keys `mon`…`sun` and values `HH:MM-HH:MM` (Europe/Kyiv). `type: any` is the fallback block (usually one per IVR, no `date`).\nCreating a block does not regenerate the dialplan by itself; it is picked up on the next `PUT /ivrs/{id}`, `PUT /ivr-work-times/{id}` or `POST /ivr-menu-items`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates a record only.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"type\": \"byDates\",\n    \"date\": {\n      \"mon\": \"09:00-18:00\",\n      \"tue\": \"09:00-18:00\",\n      \"wed\": \"09:00-18:00\",\n      \"thu\": \"09:00-18:00\",\n      \"fri\": \"09:00-18:00\"\n    },\n    \"work_time\": 7,\n    \"hello_audios\": [\n      101\n    ],\n    \"ivr_menu_description\": 103,\n    \"use_global_redirect\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get an IVR working-time block",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/ivr-work-times/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "ivr-work-times",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "21",
                      "description": "Working-time block id."
                    }
                  ]
                },
                "description": "Returns one working-time block by id. Use `populate` to include audio files, menu items and the parent IVR (`work_time`).\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Working-time block.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "21",
                          "description": "Working-time block id."
                        }
                      ]
                    },
                    "description": "Returns one working-time block by id. Use `populate` to include audio files, menu items and the parent IVR (`work_time`).\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Working-time block.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 21,\n    \"attributes\": {\n      \"type\": \"byDates\",\n      \"date\": {\n        \"mon\": \"09:00-18:00\",\n        \"fri\": \"09:00-18:00\"\n      },\n      \"use_global_redirect\": true,\n      \"createdAt\": \"2026-01-15T10:05:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:05:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "21",
                          "description": "Working-time block id."
                        }
                      ]
                    },
                    "description": "Returns one working-time block by id. Use `populate` to include audio files, menu items and the parent IVR (`work_time`).\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "21",
                          "description": "Working-time block id."
                        }
                      ]
                    },
                    "description": "Returns one working-time block by id. Use `populate` to include audio files, menu items and the parent IVR (`work_time`).\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "21",
                          "description": "Working-time block id."
                        }
                      ]
                    },
                    "description": "Returns one working-time block by id. Use `populate` to include audio files, menu items and the parent IVR (`work_time`).\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update an IVR working-time block",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/ivr-work-times/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "ivr-work-times",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "21",
                      "description": "Working-time block id."
                    }
                  ]
                },
                "description": "Updates a working-time block (schedule, greeting audio, fallback flag). Body: `{ \"data\": {...} }`.\nImportant: if after the update the block has no `ivr_menu_description` audio (`null`), ALL menu items of this block are deleted — a block without a menu announcement is treated as \"announcement only, no menu\".\nAfter the update the dialplan of the parent IVR is regenerated synchronously, so incoming calls follow the new schedule immediately. The block must be attached to an IVR (`work_time`), otherwise the request fails with 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Regenerates the IVR dialplan in Asterisk; deletes all menu items of the block if `ivr_menu_description` becomes null.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"date\": {\n      \"mon\": \"08:00-20:00\",\n      \"tue\": \"08:00-20:00\",\n      \"wed\": \"08:00-20:00\",\n      \"thu\": \"08:00-20:00\",\n      \"fri\": \"08:00-20:00\",\n      \"sat\": \"10:00-16:00\"\n    },\n    \"hello_audios\": [\n      101,\n      104\n    ]\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated block. `ivr_menu_items` is always returned as an empty array here; `ivr_menu_description` is populated.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "21",
                          "description": "Working-time block id."
                        }
                      ]
                    },
                    "description": "Updates a working-time block (schedule, greeting audio, fallback flag). Body: `{ \"data\": {...} }`.\nImportant: if after the update the block has no `ivr_menu_description` audio (`null`), ALL menu items of this block are deleted — a block without a menu announcement is treated as \"announcement only, no menu\".\nAfter the update the dialplan of the parent IVR is regenerated synchronously, so incoming calls follow the new schedule immediately. The block must be attached to an IVR (`work_time`), otherwise the request fails with 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Regenerates the IVR dialplan in Asterisk; deletes all menu items of the block if `ivr_menu_description` becomes null.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"date\": {\n      \"mon\": \"08:00-20:00\",\n      \"tue\": \"08:00-20:00\",\n      \"wed\": \"08:00-20:00\",\n      \"thu\": \"08:00-20:00\",\n      \"fri\": \"08:00-20:00\",\n      \"sat\": \"10:00-16:00\"\n    },\n    \"hello_audios\": [\n      101,\n      104\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated block. `ivr_menu_items` is always returned as an empty array here; `ivr_menu_description` is populated.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 21,\n    \"attributes\": {\n      \"type\": \"byDates\",\n      \"date\": {\n        \"mon\": \"08:00-20:00\",\n        \"tue\": \"08:00-20:00\",\n        \"wed\": \"08:00-20:00\",\n        \"thu\": \"08:00-20:00\",\n        \"fri\": \"08:00-20:00\",\n        \"sat\": \"10:00-16:00\"\n      },\n      \"use_global_redirect\": true,\n      \"createdAt\": \"2026-01-15T10:05:00.000Z\",\n      \"updatedAt\": \"2026-01-17T12:00:00.000Z\",\n      \"ivr_menu_description\": {\n        \"data\": {\n          \"id\": 103,\n          \"attributes\": {\n            \"name\": \"Menu description\",\n            \"type\": \"sound\",\n            \"category\": \"additional\",\n            \"url\": \"/uploads/sound/company_1/menu.wav\",\n            \"size\": 80.2\n          }\n        }\n      },\n      \"ivr_menu_items\": {\n        \"data\": []\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error or malformed request.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "21",
                          "description": "Working-time block id."
                        }
                      ]
                    },
                    "description": "Updates a working-time block (schedule, greeting audio, fallback flag). Body: `{ \"data\": {...} }`.\nImportant: if after the update the block has no `ivr_menu_description` audio (`null`), ALL menu items of this block are deleted — a block without a menu announcement is treated as \"announcement only, no menu\".\nAfter the update the dialplan of the parent IVR is regenerated synchronously, so incoming calls follow the new schedule immediately. The block must be attached to an IVR (`work_time`), otherwise the request fails with 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Regenerates the IVR dialplan in Asterisk; deletes all menu items of the block if `ivr_menu_description` becomes null.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"date\": {\n      \"mon\": \"08:00-20:00\",\n      \"tue\": \"08:00-20:00\",\n      \"wed\": \"08:00-20:00\",\n      \"thu\": \"08:00-20:00\",\n      \"fri\": \"08:00-20:00\",\n      \"sat\": \"10:00-16:00\"\n    },\n    \"hello_audios\": [\n      101,\n      104\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error or malformed request.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"email must be a valid email\",\n    \"details\": {\n      \"errors\": [\n        {\n          \"path\": [\n            \"email\"\n          ],\n          \"message\": \"email must be a valid email\",\n          \"name\": \"ValidationError\"\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "21",
                          "description": "Working-time block id."
                        }
                      ]
                    },
                    "description": "Updates a working-time block (schedule, greeting audio, fallback flag). Body: `{ \"data\": {...} }`.\nImportant: if after the update the block has no `ivr_menu_description` audio (`null`), ALL menu items of this block are deleted — a block without a menu announcement is treated as \"announcement only, no menu\".\nAfter the update the dialplan of the parent IVR is regenerated synchronously, so incoming calls follow the new schedule immediately. The block must be attached to an IVR (`work_time`), otherwise the request fails with 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Regenerates the IVR dialplan in Asterisk; deletes all menu items of the block if `ivr_menu_description` becomes null.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"date\": {\n      \"mon\": \"08:00-20:00\",\n      \"tue\": \"08:00-20:00\",\n      \"wed\": \"08:00-20:00\",\n      \"thu\": \"08:00-20:00\",\n      \"fri\": \"08:00-20:00\",\n      \"sat\": \"10:00-16:00\"\n    },\n    \"hello_audios\": [\n      101,\n      104\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "21",
                          "description": "Working-time block id."
                        }
                      ]
                    },
                    "description": "Updates a working-time block (schedule, greeting audio, fallback flag). Body: `{ \"data\": {...} }`.\nImportant: if after the update the block has no `ivr_menu_description` audio (`null`), ALL menu items of this block are deleted — a block without a menu announcement is treated as \"announcement only, no menu\".\nAfter the update the dialplan of the parent IVR is regenerated synchronously, so incoming calls follow the new schedule immediately. The block must be attached to an IVR (`work_time`), otherwise the request fails with 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Regenerates the IVR dialplan in Asterisk; deletes all menu items of the block if `ivr_menu_description` becomes null.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"date\": {\n      \"mon\": \"08:00-20:00\",\n      \"tue\": \"08:00-20:00\",\n      \"wed\": \"08:00-20:00\",\n      \"thu\": \"08:00-20:00\",\n      \"fri\": \"08:00-20:00\",\n      \"sat\": \"10:00-16:00\"\n    },\n    \"hello_audios\": [\n      101,\n      104\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "21",
                          "description": "Working-time block id."
                        }
                      ]
                    },
                    "description": "Updates a working-time block (schedule, greeting audio, fallback flag). Body: `{ \"data\": {...} }`.\nImportant: if after the update the block has no `ivr_menu_description` audio (`null`), ALL menu items of this block are deleted — a block without a menu announcement is treated as \"announcement only, no menu\".\nAfter the update the dialplan of the parent IVR is regenerated synchronously, so incoming calls follow the new schedule immediately. The block must be attached to an IVR (`work_time`), otherwise the request fails with 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Regenerates the IVR dialplan in Asterisk; deletes all menu items of the block if `ivr_menu_description` becomes null.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"date\": {\n      \"mon\": \"08:00-20:00\",\n      \"tue\": \"08:00-20:00\",\n      \"wed\": \"08:00-20:00\",\n      \"thu\": \"08:00-20:00\",\n      \"fri\": \"08:00-20:00\",\n      \"sat\": \"10:00-16:00\"\n    },\n    \"hello_audios\": [\n      101,\n      104\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "21",
                          "description": "Working-time block id."
                        }
                      ]
                    },
                    "description": "Updates a working-time block (schedule, greeting audio, fallback flag). Body: `{ \"data\": {...} }`.\nImportant: if after the update the block has no `ivr_menu_description` audio (`null`), ALL menu items of this block are deleted — a block without a menu announcement is treated as \"announcement only, no menu\".\nAfter the update the dialplan of the parent IVR is regenerated synchronously, so incoming calls follow the new schedule immediately. The block must be attached to an IVR (`work_time`), otherwise the request fails with 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Regenerates the IVR dialplan in Asterisk; deletes all menu items of the block if `ivr_menu_description` becomes null.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"date\": {\n      \"mon\": \"08:00-20:00\",\n      \"tue\": \"08:00-20:00\",\n      \"wed\": \"08:00-20:00\",\n      \"thu\": \"08:00-20:00\",\n      \"fri\": \"08:00-20:00\",\n      \"sat\": \"10:00-16:00\"\n    },\n    \"hello_audios\": [\n      101,\n      104\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete an IVR working-time block",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/ivr-work-times/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "ivr-work-times",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "21",
                      "description": "Working-time block id."
                    }
                  ]
                },
                "description": "Deletes a working-time block. Its menu items are not deleted automatically. The dialplan is not regenerated by this call — update the IVR (`PUT /ivrs/{id}`) afterwards to apply the change to routing.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the record permanently."
              },
              "response": [
                {
                  "name": "200 Deleted block.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "21",
                          "description": "Working-time block id."
                        }
                      ]
                    },
                    "description": "Deletes a working-time block. Its menu items are not deleted automatically. The dialplan is not regenerated by this call — update the IVR (`PUT /ivrs/{id}`) afterwards to apply the change to routing.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the record permanently."
                  },
                  "status": "Deleted block.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 21,\n    \"attributes\": {\n      \"type\": \"any\",\n      \"date\": null,\n      \"use_global_redirect\": true,\n      \"createdAt\": \"2026-01-15T10:05:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:05:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "21",
                          "description": "Working-time block id."
                        }
                      ]
                    },
                    "description": "Deletes a working-time block. Its menu items are not deleted automatically. The dialplan is not regenerated by this call — update the IVR (`PUT /ivrs/{id}`) afterwards to apply the change to routing.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the record permanently."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "21",
                          "description": "Working-time block id."
                        }
                      ]
                    },
                    "description": "Deletes a working-time block. Its menu items are not deleted automatically. The dialplan is not regenerated by this call — update the IVR (`PUT /ivrs/{id}`) afterwards to apply the change to routing.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the record permanently."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-work-times/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-work-times",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "21",
                          "description": "Working-time block id."
                        }
                      ]
                    },
                    "description": "Deletes a working-time block. Its menu items are not deleted automatically. The dialplan is not regenerated by this call — update the IVR (`PUT /ivrs/{id}`) afterwards to apply the change to routing.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the record permanently."
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "List IVR menu items",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/ivr-menu-items",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "ivr-menu-items"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns IVR menu items. Each item is a digit of a menu (`playback.extension` or `redirect.extension` is the digit the caller presses) and does one of two things: `playback` — plays an audio file and opens a sub-menu (`childs`), or `redirect` — sends the call to an employee (`user`), a group (`group`) or hangs up (`call_end`). `parent` / `childs` describe the nesting; `uuid` is the client-side id you sent on creation.\nAlways filter by the working-time block: `filters[ivr_work_time][id][$eq]=21&populate=*` (deep: `populate[redirect][populate]=*&populate[playback][populate]=*&populate[parent]=true&populate[childs]=true`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of menu items.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-menu-items",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-menu-items"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns IVR menu items. Each item is a digit of a menu (`playback.extension` or `redirect.extension` is the digit the caller presses) and does one of two things: `playback` — plays an audio file and opens a sub-menu (`childs`), or `redirect` — sends the call to an employee (`user`), a group (`group`) or hangs up (`call_end`). `parent` / `childs` describe the nesting; `uuid` is the client-side id you sent on creation.\nAlways filter by the working-time block: `filters[ivr_work_time][id][$eq]=21&populate=*` (deep: `populate[redirect][populate]=*&populate[playback][populate]=*&populate[parent]=true&populate[childs]=true`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Page of menu items.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 301,\n      \"attributes\": {\n        \"uuid\": \"a1\",\n        \"createdAt\": \"2026-01-15T10:10:00.000Z\",\n        \"updatedAt\": \"2026-01-15T10:10:00.000Z\",\n        \"playback\": null,\n        \"redirect\": {\n          \"id\": 51,\n          \"call_end\": null,\n          \"extension\": \"1\",\n          \"group\": {\n            \"data\": {\n              \"id\": 5,\n              \"attributes\": {\n                \"name\": \"Sales\",\n                \"number\": \"001\"\n              }\n            }\n          },\n          \"user\": {\n            \"data\": null\n          }\n        },\n        \"parent\": {\n          \"data\": null\n        },\n        \"childs\": {\n          \"data\": []\n        },\n        \"ivr_work_time\": {\n          \"data\": {\n            \"id\": 21,\n            \"attributes\": {\n              \"type\": \"byDates\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"id\": 302,\n      \"attributes\": {\n        \"uuid\": \"a2\",\n        \"createdAt\": \"2026-01-15T10:10:00.000Z\",\n        \"updatedAt\": \"2026-01-15T10:10:00.000Z\",\n        \"playback\": {\n          \"id\": 52,\n          \"extension\": \"2\",\n          \"playback_audio\": {\n            \"data\": {\n              \"id\": 105,\n              \"attributes\": {\n                \"name\": \"Support menu\",\n                \"type\": \"sound\",\n                \"category\": \"additional\",\n                \"url\": \"/uploads/sound/company_1/support.wav\",\n                \"size\": 60.1\n              }\n            }\n          }\n        },\n        \"redirect\": null,\n        \"parent\": {\n          \"data\": null\n        },\n        \"childs\": {\n          \"data\": [\n            {\n              \"id\": 303,\n              \"attributes\": {\n                \"uuid\": \"a2-1\"\n              }\n            }\n          ]\n        },\n        \"ivr_work_time\": {\n          \"data\": {\n            \"id\": 21,\n            \"attributes\": {\n              \"type\": \"byDates\"\n            }\n          }\n        }\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 2\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-menu-items",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-menu-items"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns IVR menu items. Each item is a digit of a menu (`playback.extension` or `redirect.extension` is the digit the caller presses) and does one of two things: `playback` — plays an audio file and opens a sub-menu (`childs`), or `redirect` — sends the call to an employee (`user`), a group (`group`) or hangs up (`call_end`). `parent` / `childs` describe the nesting; `uuid` is the client-side id you sent on creation.\nAlways filter by the working-time block: `filters[ivr_work_time][id][$eq]=21&populate=*` (deep: `populate[redirect][populate]=*&populate[playback][populate]=*&populate[parent]=true&populate[childs]=true`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-menu-items",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-menu-items"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns IVR menu items. Each item is a digit of a menu (`playback.extension` or `redirect.extension` is the digit the caller presses) and does one of two things: `playback` — plays an audio file and opens a sub-menu (`childs`), or `redirect` — sends the call to an employee (`user`), a group (`group`) or hangs up (`call_end`). `parent` / `childs` describe the nesting; `uuid` is the client-side id you sent on creation.\nAlways filter by the working-time block: `filters[ivr_work_time][id][$eq]=21&populate=*` (deep: `populate[redirect][populate]=*&populate[playback][populate]=*&populate[parent]=true&populate[childs]=true`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Save the whole menu of a working-time block",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/ivr-menu-items",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "ivr-menu-items"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Replaces the complete menu tree of one working-time block in a single call. This is NOT a single-item create: the body `data` is an object whose keys are `\"0\"`, `\"1\"`, … (one entry per menu item, flat list, any depth); all items must have the same `ivr_work_time`. All existing items of the block (taken from item `\"0\"`) are deleted first, then the new items are created and the Asterisk dialplan of the parent IVR is regenerated synchronously.\nItem fields: `id` — your own string id (stored as `uuid`); `parent` — `id` of the parent item or `null` for top level; `position` — the digit the caller presses (saved as `extension`); `levels` — array describing the nesting path, its length is the depth and is checked against the tariff limit `maxIVRSubVoutines`; exactly one of `playback` (`{ \"playback_audio\": { \"id\": N } }` — play audio and open sub-menu) or `redirect` (`{ \"user\": {\"id\": N} }` — employee, `{ \"group\": {\"id\": N} }` — group, `{ \"call_end\": true }` — hang up). Send `redirect: {}` together with `playback` if you have no redirect; `redirect` must not be omitted when `playback` is null.\nNote: `redirect.ivr` (jump to another IVR) exists in the data model but is ignored by this endpoint.\nAn empty `data` (`{}`) deletes nothing and returns an empty object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all existing menu items of the working-time block and recreates them; regenerates the IVR dialplan in Asterisk (routing changes immediately).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"0\": {\n      \"id\": \"a1\",\n      \"ivr_work_time\": 21,\n      \"parent\": null,\n      \"position\": 1,\n      \"levels\": [\n        1\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"group\": {\n          \"id\": 5\n        }\n      }\n    },\n    \"1\": {\n      \"id\": \"a2\",\n      \"ivr_work_time\": 21,\n      \"parent\": null,\n      \"position\": 2,\n      \"levels\": [\n        2\n      ],\n      \"playback\": {\n        \"playback_audio\": {\n          \"id\": 105\n        }\n      },\n      \"redirect\": {}\n    },\n    \"2\": {\n      \"id\": \"a2-1\",\n      \"ivr_work_time\": 21,\n      \"parent\": \"a2\",\n      \"position\": 1,\n      \"levels\": [\n        2,\n        1\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"user\": {\n          \"id\": 44\n        }\n      }\n    },\n    \"3\": {\n      \"id\": \"a2-2\",\n      \"ivr_work_time\": 21,\n      \"parent\": \"a2\",\n      \"position\": 0,\n      \"levels\": [\n        2,\n        0\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"call_end\": true\n      }\n    }\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 The parent IVR with its working-time blocks and the saved menu items (nested relations are populated).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-menu-items",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-menu-items"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Replaces the complete menu tree of one working-time block in a single call. This is NOT a single-item create: the body `data` is an object whose keys are `\"0\"`, `\"1\"`, … (one entry per menu item, flat list, any depth); all items must have the same `ivr_work_time`. All existing items of the block (taken from item `\"0\"`) are deleted first, then the new items are created and the Asterisk dialplan of the parent IVR is regenerated synchronously.\nItem fields: `id` — your own string id (stored as `uuid`); `parent` — `id` of the parent item or `null` for top level; `position` — the digit the caller presses (saved as `extension`); `levels` — array describing the nesting path, its length is the depth and is checked against the tariff limit `maxIVRSubVoutines`; exactly one of `playback` (`{ \"playback_audio\": { \"id\": N } }` — play audio and open sub-menu) or `redirect` (`{ \"user\": {\"id\": N} }` — employee, `{ \"group\": {\"id\": N} }` — group, `{ \"call_end\": true }` — hang up). Send `redirect: {}` together with `playback` if you have no redirect; `redirect` must not be omitted when `playback` is null.\nNote: `redirect.ivr` (jump to another IVR) exists in the data model but is ignored by this endpoint.\nAn empty `data` (`{}`) deletes nothing and returns an empty object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all existing menu items of the working-time block and recreates them; regenerates the IVR dialplan in Asterisk (routing changes immediately).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"0\": {\n      \"id\": \"a1\",\n      \"ivr_work_time\": 21,\n      \"parent\": null,\n      \"position\": 1,\n      \"levels\": [\n        1\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"group\": {\n          \"id\": 5\n        }\n      }\n    },\n    \"1\": {\n      \"id\": \"a2\",\n      \"ivr_work_time\": 21,\n      \"parent\": null,\n      \"position\": 2,\n      \"levels\": [\n        2\n      ],\n      \"playback\": {\n        \"playback_audio\": {\n          \"id\": 105\n        }\n      },\n      \"redirect\": {}\n    },\n    \"2\": {\n      \"id\": \"a2-1\",\n      \"ivr_work_time\": 21,\n      \"parent\": \"a2\",\n      \"position\": 1,\n      \"levels\": [\n        2,\n        1\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"user\": {\n          \"id\": 44\n        }\n      }\n    },\n    \"3\": {\n      \"id\": \"a2-2\",\n      \"ivr_work_time\": 21,\n      \"parent\": \"a2\",\n      \"position\": 0,\n      \"levels\": [\n        2,\n        0\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"call_end\": true\n      }\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The parent IVR with its working-time blocks and the saved menu items (nested relations are populated).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 7,\n    \"attributes\": {\n      \"name\": \"Main menu\",\n      \"number\": \"001\",\n      \"hold_time\": 5,\n      \"max_input\": 3,\n      \"redirection\": \"group\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-16T09:30:00.000Z\",\n      \"domain\": {\n        \"data\": {\n          \"id\": 12,\n          \"attributes\": {\n            \"name\": \"examplellc\"\n          }\n        }\n      },\n      \"ivr_work_times\": {\n        \"data\": [\n          {\n            \"id\": 21,\n            \"attributes\": {\n              \"type\": \"byDates\",\n              \"ivr_menu_items\": {\n                \"data\": [\n                  {\n                    \"id\": 310,\n                    \"attributes\": {\n                      \"uuid\": \"a1\",\n                      \"redirect\": {\n                        \"extension\": \"1\",\n                        \"group\": {\n                          \"data\": {\n                            \"id\": 5,\n                            \"attributes\": {\n                              \"name\": \"Sales\",\n                              \"number\": \"001\"\n                            }\n                          }\n                        }\n                      },\n                      \"parent\": {\n                        \"data\": null\n                      },\n                      \"childs\": {\n                        \"data\": []\n                      }\n                    }\n                  },\n                  {\n                    \"id\": 311,\n                    \"attributes\": {\n                      \"uuid\": \"a2\",\n                      \"playback\": {\n                        \"extension\": \"2\",\n                        \"playback_audio\": {\n                          \"data\": {\n                            \"id\": 105,\n                            \"attributes\": {\n                              \"name\": \"Support menu\",\n                              \"url\": \"/uploads/sound/company_1/support.wav\"\n                            }\n                          }\n                        }\n                      },\n                      \"parent\": {\n                        \"data\": null\n                      },\n                      \"childs\": {\n                        \"data\": [\n                          {\n                            \"id\": 312,\n                            \"attributes\": {\n                              \"uuid\": \"a2-1\"\n                            }\n                          },\n                          {\n                            \"id\": 313,\n                            \"attributes\": {\n                              \"uuid\": \"a2-2\"\n                            }\n                          }\n                        ]\n                      }\n                    }\n                  }\n                ]\n              }\n            }\n          }\n        ]\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Tariff limit on menu depth exceeded: `Максимальна кількість вложеностей для вашого тарифу 3` (an item's `levels.length` is greater than the tariff's `maxIVRSubVoutines`).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-menu-items",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-menu-items"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Replaces the complete menu tree of one working-time block in a single call. This is NOT a single-item create: the body `data` is an object whose keys are `\"0\"`, `\"1\"`, … (one entry per menu item, flat list, any depth); all items must have the same `ivr_work_time`. All existing items of the block (taken from item `\"0\"`) are deleted first, then the new items are created and the Asterisk dialplan of the parent IVR is regenerated synchronously.\nItem fields: `id` — your own string id (stored as `uuid`); `parent` — `id` of the parent item or `null` for top level; `position` — the digit the caller presses (saved as `extension`); `levels` — array describing the nesting path, its length is the depth and is checked against the tariff limit `maxIVRSubVoutines`; exactly one of `playback` (`{ \"playback_audio\": { \"id\": N } }` — play audio and open sub-menu) or `redirect` (`{ \"user\": {\"id\": N} }` — employee, `{ \"group\": {\"id\": N} }` — group, `{ \"call_end\": true }` — hang up). Send `redirect: {}` together with `playback` if you have no redirect; `redirect` must not be omitted when `playback` is null.\nNote: `redirect.ivr` (jump to another IVR) exists in the data model but is ignored by this endpoint.\nAn empty `data` (`{}`) deletes nothing and returns an empty object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all existing menu items of the working-time block and recreates them; regenerates the IVR dialplan in Asterisk (routing changes immediately).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"0\": {\n      \"id\": \"a1\",\n      \"ivr_work_time\": 21,\n      \"parent\": null,\n      \"position\": 1,\n      \"levels\": [\n        1\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"group\": {\n          \"id\": 5\n        }\n      }\n    },\n    \"1\": {\n      \"id\": \"a2\",\n      \"ivr_work_time\": 21,\n      \"parent\": null,\n      \"position\": 2,\n      \"levels\": [\n        2\n      ],\n      \"playback\": {\n        \"playback_audio\": {\n          \"id\": 105\n        }\n      },\n      \"redirect\": {}\n    },\n    \"2\": {\n      \"id\": \"a2-1\",\n      \"ivr_work_time\": 21,\n      \"parent\": \"a2\",\n      \"position\": 1,\n      \"levels\": [\n        2,\n        1\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"user\": {\n          \"id\": 44\n        }\n      }\n    },\n    \"3\": {\n      \"id\": \"a2-2\",\n      \"ivr_work_time\": 21,\n      \"parent\": \"a2\",\n      \"position\": 0,\n      \"levels\": [\n        2,\n        0\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"call_end\": true\n      }\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Tariff limit on menu depth exceeded: `Максимальна кількість вложеностей для вашого тарифу 3` (an item's `levels.length` is greater than the tariff's `maxIVRSubVoutines`).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Максимальна кількість вложеностей для вашого тарифу 3\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-menu-items",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-menu-items"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Replaces the complete menu tree of one working-time block in a single call. This is NOT a single-item create: the body `data` is an object whose keys are `\"0\"`, `\"1\"`, … (one entry per menu item, flat list, any depth); all items must have the same `ivr_work_time`. All existing items of the block (taken from item `\"0\"`) are deleted first, then the new items are created and the Asterisk dialplan of the parent IVR is regenerated synchronously.\nItem fields: `id` — your own string id (stored as `uuid`); `parent` — `id` of the parent item or `null` for top level; `position` — the digit the caller presses (saved as `extension`); `levels` — array describing the nesting path, its length is the depth and is checked against the tariff limit `maxIVRSubVoutines`; exactly one of `playback` (`{ \"playback_audio\": { \"id\": N } }` — play audio and open sub-menu) or `redirect` (`{ \"user\": {\"id\": N} }` — employee, `{ \"group\": {\"id\": N} }` — group, `{ \"call_end\": true }` — hang up). Send `redirect: {}` together with `playback` if you have no redirect; `redirect` must not be omitted when `playback` is null.\nNote: `redirect.ivr` (jump to another IVR) exists in the data model but is ignored by this endpoint.\nAn empty `data` (`{}`) deletes nothing and returns an empty object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all existing menu items of the working-time block and recreates them; regenerates the IVR dialplan in Asterisk (routing changes immediately).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"0\": {\n      \"id\": \"a1\",\n      \"ivr_work_time\": 21,\n      \"parent\": null,\n      \"position\": 1,\n      \"levels\": [\n        1\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"group\": {\n          \"id\": 5\n        }\n      }\n    },\n    \"1\": {\n      \"id\": \"a2\",\n      \"ivr_work_time\": 21,\n      \"parent\": null,\n      \"position\": 2,\n      \"levels\": [\n        2\n      ],\n      \"playback\": {\n        \"playback_audio\": {\n          \"id\": 105\n        }\n      },\n      \"redirect\": {}\n    },\n    \"2\": {\n      \"id\": \"a2-1\",\n      \"ivr_work_time\": 21,\n      \"parent\": \"a2\",\n      \"position\": 1,\n      \"levels\": [\n        2,\n        1\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"user\": {\n          \"id\": 44\n        }\n      }\n    },\n    \"3\": {\n      \"id\": \"a2-2\",\n      \"ivr_work_time\": 21,\n      \"parent\": \"a2\",\n      \"position\": 0,\n      \"levels\": [\n        2,\n        0\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"call_end\": true\n      }\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-menu-items",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-menu-items"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Replaces the complete menu tree of one working-time block in a single call. This is NOT a single-item create: the body `data` is an object whose keys are `\"0\"`, `\"1\"`, … (one entry per menu item, flat list, any depth); all items must have the same `ivr_work_time`. All existing items of the block (taken from item `\"0\"`) are deleted first, then the new items are created and the Asterisk dialplan of the parent IVR is regenerated synchronously.\nItem fields: `id` — your own string id (stored as `uuid`); `parent` — `id` of the parent item or `null` for top level; `position` — the digit the caller presses (saved as `extension`); `levels` — array describing the nesting path, its length is the depth and is checked against the tariff limit `maxIVRSubVoutines`; exactly one of `playback` (`{ \"playback_audio\": { \"id\": N } }` — play audio and open sub-menu) or `redirect` (`{ \"user\": {\"id\": N} }` — employee, `{ \"group\": {\"id\": N} }` — group, `{ \"call_end\": true }` — hang up). Send `redirect: {}` together with `playback` if you have no redirect; `redirect` must not be omitted when `playback` is null.\nNote: `redirect.ivr` (jump to another IVR) exists in the data model but is ignored by this endpoint.\nAn empty `data` (`{}`) deletes nothing and returns an empty object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all existing menu items of the working-time block and recreates them; regenerates the IVR dialplan in Asterisk (routing changes immediately).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"0\": {\n      \"id\": \"a1\",\n      \"ivr_work_time\": 21,\n      \"parent\": null,\n      \"position\": 1,\n      \"levels\": [\n        1\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"group\": {\n          \"id\": 5\n        }\n      }\n    },\n    \"1\": {\n      \"id\": \"a2\",\n      \"ivr_work_time\": 21,\n      \"parent\": null,\n      \"position\": 2,\n      \"levels\": [\n        2\n      ],\n      \"playback\": {\n        \"playback_audio\": {\n          \"id\": 105\n        }\n      },\n      \"redirect\": {}\n    },\n    \"2\": {\n      \"id\": \"a2-1\",\n      \"ivr_work_time\": 21,\n      \"parent\": \"a2\",\n      \"position\": 1,\n      \"levels\": [\n        2,\n        1\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"user\": {\n          \"id\": 44\n        }\n      }\n    },\n    \"3\": {\n      \"id\": \"a2-2\",\n      \"ivr_work_time\": 21,\n      \"parent\": \"a2\",\n      \"position\": 0,\n      \"levels\": [\n        2,\n        0\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"call_end\": true\n      }\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-menu-items",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-menu-items"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Replaces the complete menu tree of one working-time block in a single call. This is NOT a single-item create: the body `data` is an object whose keys are `\"0\"`, `\"1\"`, … (one entry per menu item, flat list, any depth); all items must have the same `ivr_work_time`. All existing items of the block (taken from item `\"0\"`) are deleted first, then the new items are created and the Asterisk dialplan of the parent IVR is regenerated synchronously.\nItem fields: `id` — your own string id (stored as `uuid`); `parent` — `id` of the parent item or `null` for top level; `position` — the digit the caller presses (saved as `extension`); `levels` — array describing the nesting path, its length is the depth and is checked against the tariff limit `maxIVRSubVoutines`; exactly one of `playback` (`{ \"playback_audio\": { \"id\": N } }` — play audio and open sub-menu) or `redirect` (`{ \"user\": {\"id\": N} }` — employee, `{ \"group\": {\"id\": N} }` — group, `{ \"call_end\": true }` — hang up). Send `redirect: {}` together with `playback` if you have no redirect; `redirect` must not be omitted when `playback` is null.\nNote: `redirect.ivr` (jump to another IVR) exists in the data model but is ignored by this endpoint.\nAn empty `data` (`{}`) deletes nothing and returns an empty object.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all existing menu items of the working-time block and recreates them; regenerates the IVR dialplan in Asterisk (routing changes immediately).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"0\": {\n      \"id\": \"a1\",\n      \"ivr_work_time\": 21,\n      \"parent\": null,\n      \"position\": 1,\n      \"levels\": [\n        1\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"group\": {\n          \"id\": 5\n        }\n      }\n    },\n    \"1\": {\n      \"id\": \"a2\",\n      \"ivr_work_time\": 21,\n      \"parent\": null,\n      \"position\": 2,\n      \"levels\": [\n        2\n      ],\n      \"playback\": {\n        \"playback_audio\": {\n          \"id\": 105\n        }\n      },\n      \"redirect\": {}\n    },\n    \"2\": {\n      \"id\": \"a2-1\",\n      \"ivr_work_time\": 21,\n      \"parent\": \"a2\",\n      \"position\": 1,\n      \"levels\": [\n        2,\n        1\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"user\": {\n          \"id\": 44\n        }\n      }\n    },\n    \"3\": {\n      \"id\": \"a2-2\",\n      \"ivr_work_time\": 21,\n      \"parent\": \"a2\",\n      \"position\": 0,\n      \"levels\": [\n        2,\n        0\n      ],\n      \"playback\": null,\n      \"redirect\": {\n        \"call_end\": true\n      }\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get an IVR menu item",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/ivr-menu-items/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "ivr-menu-items",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "301",
                      "description": "Menu item id."
                    }
                  ]
                },
                "description": "Returns one menu item by id. Use `populate` to include `playback`, `redirect`, `parent`, `childs`, `ivr_work_time`.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Menu item.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-menu-items/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-menu-items",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "301",
                          "description": "Menu item id."
                        }
                      ]
                    },
                    "description": "Returns one menu item by id. Use `populate` to include `playback`, `redirect`, `parent`, `childs`, `ivr_work_time`.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Menu item.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 301,\n    \"attributes\": {\n      \"uuid\": \"a1\",\n      \"createdAt\": \"2026-01-15T10:10:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:10:00.000Z\",\n      \"playback\": null,\n      \"redirect\": {\n        \"id\": 51,\n        \"call_end\": null,\n        \"extension\": \"1\"\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-menu-items/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-menu-items",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "301",
                          "description": "Menu item id."
                        }
                      ]
                    },
                    "description": "Returns one menu item by id. Use `populate` to include `playback`, `redirect`, `parent`, `childs`, `ivr_work_time`.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-menu-items/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-menu-items",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "301",
                          "description": "Menu item id."
                        }
                      ]
                    },
                    "description": "Returns one menu item by id. Use `populate` to include `playback`, `redirect`, `parent`, `childs`, `ivr_work_time`.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-menu-items/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-menu-items",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "301",
                          "description": "Menu item id."
                        }
                      ]
                    },
                    "description": "Returns one menu item by id. Use `populate` to include `playback`, `redirect`, `parent`, `childs`, `ivr_work_time`.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete an IVR menu item (not functional)",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/ivr-menu-items/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "ivr-menu-items",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "301",
                      "description": "Menu item id."
                    }
                  ]
                },
                "description": "Intended to delete a single menu item, but in the current implementation the pre-check rejects every request with `Can`t delete ivr menu item with childs in` (the check never passes) and the handler itself is empty. Do not use. To remove items, resend the whole menu with `POST /ivr-menu-items` without them.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None (the request is always rejected)."
              },
              "response": [
                {
                  "name": "400 Always returned: `Can`t delete ivr menu item with childs in`.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-menu-items/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-menu-items",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "301",
                          "description": "Menu item id."
                        }
                      ]
                    },
                    "description": "Intended to delete a single menu item, but in the current implementation the pre-check rejects every request with `Can`t delete ivr menu item with childs in` (the check never passes) and the handler itself is empty. Do not use. To remove items, resend the whole menu with `POST /ivr-menu-items` without them.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None (the request is always rejected)."
                  },
                  "status": "Always returned: `Can`t delete ivr menu item with childs in`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Can`t delete ivr menu item with childs in\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-menu-items/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-menu-items",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "301",
                          "description": "Menu item id."
                        }
                      ]
                    },
                    "description": "Intended to delete a single menu item, but in the current implementation the pre-check rejects every request with `Can`t delete ivr menu item with childs in` (the check never passes) and the handler itself is empty. Do not use. To remove items, resend the whole menu with `POST /ivr-menu-items` without them.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None (the request is always rejected)."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/ivr-menu-items/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "ivr-menu-items",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "301",
                          "description": "Menu item id."
                        }
                      ]
                    },
                    "description": "Intended to delete a single menu item, but in the current implementation the pre-check rejects every request with `Can`t delete ivr menu item with childs in` (the check never passes) and the handler itself is empty. Do not use. To remove items, resend the whole menu with `POST /ivr-menu-items` without them.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None (the request is always rejected)."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "List call groups",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/groups",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "groups"
                  ],
                  "query": [
                    {
                      "key": "strapiSearch",
                      "value": "true",
                      "description": "`true` — query the database with Strapi parameters instead of the search index.",
                      "disabled": true
                    },
                    {
                      "key": "page",
                      "value": "1",
                      "description": "Search-index mode: page number (default 1).",
                      "disabled": true
                    },
                    {
                      "key": "pageSize",
                      "value": "10",
                      "description": "Search-index mode: page size (default 10).",
                      "disabled": true
                    },
                    {
                      "key": "search",
                      "value": "Sales",
                      "description": "Search-index mode: exact match by group name or internal SIP address.",
                      "disabled": true
                    },
                    {
                      "key": "order_by",
                      "value": "employees_count",
                      "description": "Search-index mode: sort field.",
                      "disabled": true
                    },
                    {
                      "key": "order_direction",
                      "value": "desc",
                      "description": "Search-index mode: sort direction.",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Returns the call groups (Asterisk queues) of the company. Two modes:\n1. Default — search index (Meilisearch): parameters `page`, `pageSize`, `search` (matches `name` or the internal SIP address `inner_number`), `order_by` (`id` | `employees_count`), `order_direction` (`asc` | `desc`). Extra computed fields are returned: `employees_count`, `inner_number`. The index is updated asynchronously, so a just-created group may appear with a short delay.\n2. `strapiSearch=true` — direct database query with standard Strapi parameters (`pagination[*]`, `sort`, `filters`, `populate`); `meta` is empty in this mode. Useful `populate`: `domain`, `group_employees`, `audio_musiconhold`, `in_phones`, `out_phone`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of groups.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups"
                      ],
                      "query": [
                        {
                          "key": "strapiSearch",
                          "value": "true",
                          "description": "`true` — query the database with Strapi parameters instead of the search index.",
                          "disabled": true
                        },
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Search-index mode: page number (default 1).",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "10",
                          "description": "Search-index mode: page size (default 10).",
                          "disabled": true
                        },
                        {
                          "key": "search",
                          "value": "Sales",
                          "description": "Search-index mode: exact match by group name or internal SIP address.",
                          "disabled": true
                        },
                        {
                          "key": "order_by",
                          "value": "employees_count",
                          "description": "Search-index mode: sort field.",
                          "disabled": true
                        },
                        {
                          "key": "order_direction",
                          "value": "desc",
                          "description": "Search-index mode: sort direction.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the call groups (Asterisk queues) of the company. Two modes:\n1. Default — search index (Meilisearch): parameters `page`, `pageSize`, `search` (matches `name` or the internal SIP address `inner_number`), `order_by` (`id` | `employees_count`), `order_direction` (`asc` | `desc`). Extra computed fields are returned: `employees_count`, `inner_number`. The index is updated asynchronously, so a just-created group may appear with a short delay.\n2. `strapiSearch=true` — direct database query with standard Strapi parameters (`pagination[*]`, `sort`, `filters`, `populate`); `meta` is empty in this mode. Useful `populate`: `domain`, `group_employees`, `audio_musiconhold`, `in_phones`, `out_phone`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Page of groups.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 5,\n      \"attributes\": {\n        \"name\": \"Sales\",\n        \"number\": \"001\",\n        \"algoritm\": \"to_all\",\n        \"redirect\": false,\n        \"to_anwer_remain\": false,\n        \"queue_number\": false,\n        \"timeout\": 90,\n        \"maxlen\": 0,\n        \"servicelevel\": 30,\n        \"wrapuptime\": 5,\n        \"anounceHoldTime\": \"no\",\n        \"retry\": 5,\n        \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n        \"updatedAt\": \"2026-01-15T10:00:00.000Z\",\n        \"domain\": {\n          \"data\": {\n            \"id\": 12,\n            \"attributes\": {\n              \"name\": \"examplellc\"\n            }\n          }\n        },\n        \"group_employees\": {\n          \"data\": [\n            {\n              \"id\": 71,\n              \"attributes\": {\n                \"penalty\": 1\n              }\n            }\n          ]\n        },\n        \"employees_count\": 1,\n        \"inner_number\": \"2001@examplellc.sip.onevoiplanet.com\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 10,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "400 `Service error` — the search index is unavailable; retry with `strapiSearch=true`.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups"
                      ],
                      "query": [
                        {
                          "key": "strapiSearch",
                          "value": "true",
                          "description": "`true` — query the database with Strapi parameters instead of the search index.",
                          "disabled": true
                        },
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Search-index mode: page number (default 1).",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "10",
                          "description": "Search-index mode: page size (default 10).",
                          "disabled": true
                        },
                        {
                          "key": "search",
                          "value": "Sales",
                          "description": "Search-index mode: exact match by group name or internal SIP address.",
                          "disabled": true
                        },
                        {
                          "key": "order_by",
                          "value": "employees_count",
                          "description": "Search-index mode: sort field.",
                          "disabled": true
                        },
                        {
                          "key": "order_direction",
                          "value": "desc",
                          "description": "Search-index mode: sort direction.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the call groups (Asterisk queues) of the company. Two modes:\n1. Default — search index (Meilisearch): parameters `page`, `pageSize`, `search` (matches `name` or the internal SIP address `inner_number`), `order_by` (`id` | `employees_count`), `order_direction` (`asc` | `desc`). Extra computed fields are returned: `employees_count`, `inner_number`. The index is updated asynchronously, so a just-created group may appear with a short delay.\n2. `strapiSearch=true` — direct database query with standard Strapi parameters (`pagination[*]`, `sort`, `filters`, `populate`); `meta` is empty in this mode. Useful `populate`: `domain`, `group_employees`, `audio_musiconhold`, `in_phones`, `out_phone`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "`Service error` — the search index is unavailable; retry with `strapiSearch=true`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"Service error\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups"
                      ],
                      "query": [
                        {
                          "key": "strapiSearch",
                          "value": "true",
                          "description": "`true` — query the database with Strapi parameters instead of the search index.",
                          "disabled": true
                        },
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Search-index mode: page number (default 1).",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "10",
                          "description": "Search-index mode: page size (default 10).",
                          "disabled": true
                        },
                        {
                          "key": "search",
                          "value": "Sales",
                          "description": "Search-index mode: exact match by group name or internal SIP address.",
                          "disabled": true
                        },
                        {
                          "key": "order_by",
                          "value": "employees_count",
                          "description": "Search-index mode: sort field.",
                          "disabled": true
                        },
                        {
                          "key": "order_direction",
                          "value": "desc",
                          "description": "Search-index mode: sort direction.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the call groups (Asterisk queues) of the company. Two modes:\n1. Default — search index (Meilisearch): parameters `page`, `pageSize`, `search` (matches `name` or the internal SIP address `inner_number`), `order_by` (`id` | `employees_count`), `order_direction` (`asc` | `desc`). Extra computed fields are returned: `employees_count`, `inner_number`. The index is updated asynchronously, so a just-created group may appear with a short delay.\n2. `strapiSearch=true` — direct database query with standard Strapi parameters (`pagination[*]`, `sort`, `filters`, `populate`); `meta` is empty in this mode. Useful `populate`: `domain`, `group_employees`, `audio_musiconhold`, `in_phones`, `out_phone`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups"
                      ],
                      "query": [
                        {
                          "key": "strapiSearch",
                          "value": "true",
                          "description": "`true` — query the database with Strapi parameters instead of the search index.",
                          "disabled": true
                        },
                        {
                          "key": "page",
                          "value": "1",
                          "description": "Search-index mode: page number (default 1).",
                          "disabled": true
                        },
                        {
                          "key": "pageSize",
                          "value": "10",
                          "description": "Search-index mode: page size (default 10).",
                          "disabled": true
                        },
                        {
                          "key": "search",
                          "value": "Sales",
                          "description": "Search-index mode: exact match by group name or internal SIP address.",
                          "disabled": true
                        },
                        {
                          "key": "order_by",
                          "value": "employees_count",
                          "description": "Search-index mode: sort field.",
                          "disabled": true
                        },
                        {
                          "key": "order_direction",
                          "value": "desc",
                          "description": "Search-index mode: sort direction.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Returns the call groups (Asterisk queues) of the company. Two modes:\n1. Default — search index (Meilisearch): parameters `page`, `pageSize`, `search` (matches `name` or the internal SIP address `inner_number`), `order_by` (`id` | `employees_count`), `order_direction` (`asc` | `desc`). Extra computed fields are returned: `employees_count`, `inner_number`. The index is updated asynchronously, so a just-created group may appear with a short delay.\n2. `strapiSearch=true` — direct database query with standard Strapi parameters (`pagination[*]`, `sort`, `filters`, `populate`); `meta` is empty in this mode. Useful `populate`: `domain`, `group_employees`, `audio_musiconhold`, `in_phones`, `out_phone`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Create a call group",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/groups",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "groups"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Creates a call group (queue) in one of the company's SIP domains. Body: `{ \"data\": {...} }`; `name`, `domain` and `algoritm` are required. The internal 3-digit queue number (`number`) is generated automatically if omitted (first free `001`–`999` in the domain). `company` is set from the token.\nMembers are not added here: use `POST /group-employee/bulk-create` (or `POST /group-employees`). If `group_employees` is sent in the body it is ignored, except an empty array which is rejected.\nThe queue is created in Asterisk asynchronously by a background job right after the record is saved. To receive calls, route a phone number to the group through the Numbers API (`addInPhone`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates the queue in Asterisk (background job).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"name\": \"Sales\",\n    \"domain\": 12,\n    \"algoritm\": \"uniform\",\n    \"timeout\": 60,\n    \"retry\": 5,\n    \"wrapuptime\": 5,\n    \"maxlen\": 0,\n    \"queue_number\": true,\n    \"anounceHoldTime\": \"once\",\n    \"audio_musiconhold\": 110\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created group.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a call group (queue) in one of the company's SIP domains. Body: `{ \"data\": {...} }`; `name`, `domain` and `algoritm` are required. The internal 3-digit queue number (`number`) is generated automatically if omitted (first free `001`–`999` in the domain). `company` is set from the token.\nMembers are not added here: use `POST /group-employee/bulk-create` (or `POST /group-employees`). If `group_employees` is sent in the body it is ignored, except an empty array which is rejected.\nThe queue is created in Asterisk asynchronously by a background job right after the record is saved. To receive calls, route a phone number to the group through the Numbers API (`addInPhone`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates the queue in Asterisk (background job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Sales\",\n    \"domain\": 12,\n    \"algoritm\": \"uniform\",\n    \"timeout\": 60,\n    \"retry\": 5,\n    \"wrapuptime\": 5,\n    \"maxlen\": 0,\n    \"queue_number\": true,\n    \"anounceHoldTime\": \"once\",\n    \"audio_musiconhold\": 110\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created group.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 5,\n    \"attributes\": {\n      \"name\": \"Sales\",\n      \"number\": \"001\",\n      \"algoritm\": \"uniform\",\n      \"redirect\": false,\n      \"to_anwer_remain\": false,\n      \"queue_number\": true,\n      \"timeout\": 60,\n      \"maxlen\": 0,\n      \"servicelevel\": null,\n      \"wrapuptime\": 5,\n      \"anounceHoldTime\": \"once\",\n      \"retry\": 5,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error. Messages: `Domain required!`, `Domain not found`, `Group already exist!` (same name in the domain), `Audio validation failed!` (audio file not of the company), `group_employees is empty`, `algoritm is a required field`, `Всі группи зайняті в данному домені` (no free queue number).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a call group (queue) in one of the company's SIP domains. Body: `{ \"data\": {...} }`; `name`, `domain` and `algoritm` are required. The internal 3-digit queue number (`number`) is generated automatically if omitted (first free `001`–`999` in the domain). `company` is set from the token.\nMembers are not added here: use `POST /group-employee/bulk-create` (or `POST /group-employees`). If `group_employees` is sent in the body it is ignored, except an empty array which is rejected.\nThe queue is created in Asterisk asynchronously by a background job right after the record is saved. To receive calls, route a phone number to the group through the Numbers API (`addInPhone`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates the queue in Asterisk (background job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Sales\",\n    \"domain\": 12,\n    \"algoritm\": \"uniform\",\n    \"timeout\": 60,\n    \"retry\": 5,\n    \"wrapuptime\": 5,\n    \"maxlen\": 0,\n    \"queue_number\": true,\n    \"anounceHoldTime\": \"once\",\n    \"audio_musiconhold\": 110\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error. Messages: `Domain required!`, `Domain not found`, `Group already exist!` (same name in the domain), `Audio validation failed!` (audio file not of the company), `group_employees is empty`, `algoritm is a required field`, `Всі группи зайняті в данному домені` (no free queue number).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Group already exist!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a call group (queue) in one of the company's SIP domains. Body: `{ \"data\": {...} }`; `name`, `domain` and `algoritm` are required. The internal 3-digit queue number (`number`) is generated automatically if omitted (first free `001`–`999` in the domain). `company` is set from the token.\nMembers are not added here: use `POST /group-employee/bulk-create` (or `POST /group-employees`). If `group_employees` is sent in the body it is ignored, except an empty array which is rejected.\nThe queue is created in Asterisk asynchronously by a background job right after the record is saved. To receive calls, route a phone number to the group through the Numbers API (`addInPhone`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates the queue in Asterisk (background job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Sales\",\n    \"domain\": 12,\n    \"algoritm\": \"uniform\",\n    \"timeout\": 60,\n    \"retry\": 5,\n    \"wrapuptime\": 5,\n    \"maxlen\": 0,\n    \"queue_number\": true,\n    \"anounceHoldTime\": \"once\",\n    \"audio_musiconhold\": 110\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a call group (queue) in one of the company's SIP domains. Body: `{ \"data\": {...} }`; `name`, `domain` and `algoritm` are required. The internal 3-digit queue number (`number`) is generated automatically if omitted (first free `001`–`999` in the domain). `company` is set from the token.\nMembers are not added here: use `POST /group-employee/bulk-create` (or `POST /group-employees`). If `group_employees` is sent in the body it is ignored, except an empty array which is rejected.\nThe queue is created in Asterisk asynchronously by a background job right after the record is saved. To receive calls, route a phone number to the group through the Numbers API (`addInPhone`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates the queue in Asterisk (background job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Sales\",\n    \"domain\": 12,\n    \"algoritm\": \"uniform\",\n    \"timeout\": 60,\n    \"retry\": 5,\n    \"wrapuptime\": 5,\n    \"maxlen\": 0,\n    \"queue_number\": true,\n    \"anounceHoldTime\": \"once\",\n    \"audio_musiconhold\": 110\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get a call group",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/groups/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "groups",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "5",
                      "description": "Group id."
                    }
                  ]
                },
                "description": "Returns one group of the company. Returns `data: null` if the group does not exist or belongs to another company. Use `populate` for `domain`, `group_employees`, audio files, `in_phones`, `out_phone`.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Group, or `data: null` when not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Group id."
                        }
                      ]
                    },
                    "description": "Returns one group of the company. Returns `data: null` if the group does not exist or belongs to another company. Use `populate` for `domain`, `group_employees`, audio files, `in_phones`, `out_phone`.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Group, or `data: null` when not found.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 5,\n    \"attributes\": {\n      \"name\": \"Sales\",\n      \"number\": \"001\",\n      \"algoritm\": \"uniform\",\n      \"redirect\": false,\n      \"to_anwer_remain\": false,\n      \"queue_number\": true,\n      \"timeout\": 60,\n      \"maxlen\": 0,\n      \"servicelevel\": 30,\n      \"wrapuptime\": 5,\n      \"anounceHoldTime\": \"once\",\n      \"retry\": 5,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\",\n      \"domain\": {\n        \"data\": {\n          \"id\": 12,\n          \"attributes\": {\n            \"name\": \"examplellc\"\n          }\n        }\n      },\n      \"group_employees\": {\n        \"data\": [\n          {\n            \"id\": 71,\n            \"attributes\": {\n              \"penalty\": 1\n            }\n          },\n          {\n            \"id\": 72,\n            \"attributes\": {\n              \"penalty\": 2\n            }\n          }\n        ]\n      },\n      \"audio_musiconhold\": {\n        \"data\": {\n          \"id\": 110,\n          \"attributes\": {\n            \"name\": \"Hold music\",\n            \"type\": \"moh\",\n            \"category\": \"additional\",\n            \"url\": \"/uploads/moh/company_1/hold.wav\",\n            \"size\": 1500.3\n          }\n        }\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Group id."
                        }
                      ]
                    },
                    "description": "Returns one group of the company. Returns `data: null` if the group does not exist or belongs to another company. Use `populate` for `domain`, `group_employees`, audio files, `in_phones`, `out_phone`.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Group id."
                        }
                      ]
                    },
                    "description": "Returns one group of the company. Returns `data: null` if the group does not exist or belongs to another company. Use `populate` for `domain`, `group_employees`, audio files, `in_phones`, `out_phone`.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update a call group",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/groups/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "groups",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "5",
                      "description": "Group id."
                    }
                  ]
                },
                "description": "Updates group settings. Body: `{ \"data\": {...} }`. `domain` cannot be changed (removed from the body); `group_employees` is ignored (empty array is rejected) — manage members through the group-employee endpoints.\nBefore saving, the current members are re-synchronised with the queue; if `algoritm` changes, member penalties are recalculated (`consistent` → 1, 2, 3…; other strategies → all 1). The Asterisk queue parameters are updated asynchronously by a background job.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Rewrites the queue members and queue parameters in Asterisk (background job).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"name\": \"Sales (EU)\",\n    \"algoritm\": \"consistent\",\n    \"timeout\": 45\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated group.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Group id."
                        }
                      ]
                    },
                    "description": "Updates group settings. Body: `{ \"data\": {...} }`. `domain` cannot be changed (removed from the body); `group_employees` is ignored (empty array is rejected) — manage members through the group-employee endpoints.\nBefore saving, the current members are re-synchronised with the queue; if `algoritm` changes, member penalties are recalculated (`consistent` → 1, 2, 3…; other strategies → all 1). The Asterisk queue parameters are updated asynchronously by a background job.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Rewrites the queue members and queue parameters in Asterisk (background job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Sales (EU)\",\n    \"algoritm\": \"consistent\",\n    \"timeout\": 45\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated group.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 5,\n    \"attributes\": {\n      \"name\": \"Sales (EU)\",\n      \"number\": \"001\",\n      \"algoritm\": \"consistent\",\n      \"redirect\": false,\n      \"to_anwer_remain\": false,\n      \"queue_number\": true,\n      \"timeout\": 45,\n      \"maxlen\": 0,\n      \"servicelevel\": 30,\n      \"wrapuptime\": 5,\n      \"anounceHoldTime\": \"once\",\n      \"retry\": 5,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-17T12:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error: `Audio validation failed!`, `group_employees is empty`, or a Strapi field error.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Group id."
                        }
                      ]
                    },
                    "description": "Updates group settings. Body: `{ \"data\": {...} }`. `domain` cannot be changed (removed from the body); `group_employees` is ignored (empty array is rejected) — manage members through the group-employee endpoints.\nBefore saving, the current members are re-synchronised with the queue; if `algoritm` changes, member penalties are recalculated (`consistent` → 1, 2, 3…; other strategies → all 1). The Asterisk queue parameters are updated asynchronously by a background job.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Rewrites the queue members and queue parameters in Asterisk (background job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Sales (EU)\",\n    \"algoritm\": \"consistent\",\n    \"timeout\": 45\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error: `Audio validation failed!`, `group_employees is empty`, or a Strapi field error.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Audio validation failed!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Group id."
                        }
                      ]
                    },
                    "description": "Updates group settings. Body: `{ \"data\": {...} }`. `domain` cannot be changed (removed from the body); `group_employees` is ignored (empty array is rejected) — manage members through the group-employee endpoints.\nBefore saving, the current members are re-synchronised with the queue; if `algoritm` changes, member penalties are recalculated (`consistent` → 1, 2, 3…; other strategies → all 1). The Asterisk queue parameters are updated asynchronously by a background job.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Rewrites the queue members and queue parameters in Asterisk (background job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Sales (EU)\",\n    \"algoritm\": \"consistent\",\n    \"timeout\": 45\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Group id."
                        }
                      ]
                    },
                    "description": "Updates group settings. Body: `{ \"data\": {...} }`. `domain` cannot be changed (removed from the body); `group_employees` is ignored (empty array is rejected) — manage members through the group-employee endpoints.\nBefore saving, the current members are re-synchronised with the queue; if `algoritm` changes, member penalties are recalculated (`consistent` → 1, 2, 3…; other strategies → all 1). The Asterisk queue parameters are updated asynchronously by a background job.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Rewrites the queue members and queue parameters in Asterisk (background job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Sales (EU)\",\n    \"algoritm\": \"consistent\",\n    \"timeout\": 45\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Group id."
                        }
                      ]
                    },
                    "description": "Updates group settings. Body: `{ \"data\": {...} }`. `domain` cannot be changed (removed from the body); `group_employees` is ignored (empty array is rejected) — manage members through the group-employee endpoints.\nBefore saving, the current members are re-synchronised with the queue; if `algoritm` changes, member penalties are recalculated (`consistent` → 1, 2, 3…; other strategies → all 1). The Asterisk queue parameters are updated asynchronously by a background job.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Rewrites the queue members and queue parameters in Asterisk (background job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Sales (EU)\",\n    \"algoritm\": \"consistent\",\n    \"timeout\": 45\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete a call group",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/groups/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "groups",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "5",
                      "description": "Group id."
                    }
                  ]
                },
                "description": "Deletes a group of the company together with its memberships. Refused while a phone number is routed to the group (incoming or outgoing) or while a callback/recall widget redirects to it. The queue is removed from Asterisk asynchronously by a background job.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the group and its memberships permanently; removes the queue from Asterisk (background job)."
              },
              "response": [
                {
                  "name": "200 Deleted group.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Group id."
                        }
                      ]
                    },
                    "description": "Deletes a group of the company together with its memberships. Refused while a phone number is routed to the group (incoming or outgoing) or while a callback/recall widget redirects to it. The queue is removed from Asterisk asynchronously by a background job.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the group and its memberships permanently; removes the queue from Asterisk (background job)."
                  },
                  "status": "Deleted group.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 5,\n    \"attributes\": {\n      \"name\": \"Sales\",\n      \"number\": \"001\",\n      \"algoritm\": \"uniform\",\n      \"redirect\": false,\n      \"to_anwer_remain\": false,\n      \"queue_number\": true,\n      \"timeout\": 60,\n      \"maxlen\": 0,\n      \"servicelevel\": 30,\n      \"wrapuptime\": 5,\n      \"anounceHoldTime\": \"once\",\n      \"retry\": 5,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Group is still in use: `Detach phones before remove group` (a number is routed to the group; `details.data` holds the group with its phones) or `Detach widgets before remove group` (`details.recallWidgetName` / `details.callbackWidgetName`).",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Group id."
                        }
                      ]
                    },
                    "description": "Deletes a group of the company together with its memberships. Refused while a phone number is routed to the group (incoming or outgoing) or while a callback/recall widget redirects to it. The queue is removed from Asterisk asynchronously by a background job.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the group and its memberships permanently; removes the queue from Asterisk (background job)."
                  },
                  "status": "Group is still in use: `Detach phones before remove group` (a number is routed to the group; `details.data` holds the group with its phones) or `Detach widgets before remove group` (`details.recallWidgetName` / `details.callbackWidgetName`).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Detach widgets before remove group\",\n    \"details\": {\n      \"callbackWidgetName\": [\n        \"Website widget\"\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Group id."
                        }
                      ]
                    },
                    "description": "Deletes a group of the company together with its memberships. Refused while a phone number is routed to the group (incoming or outgoing) or while a callback/recall widget redirects to it. The queue is removed from Asterisk asynchronously by a background job.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the group and its memberships permanently; removes the queue from Asterisk (background job)."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Group id."
                        }
                      ]
                    },
                    "description": "Deletes a group of the company together with its memberships. Refused while a phone number is routed to the group (incoming or outgoing) or while a callback/recall widget redirects to it. The queue is removed from Asterisk asynchronously by a background job.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the group and its memberships permanently; removes the queue from Asterisk (background job)."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Returned when the group does not exist or belongs to another company (the ownership check fails with an internal error instead of 404).",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/groups/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "groups",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Group id."
                        }
                      ]
                    },
                    "description": "Deletes a group of the company together with its memberships. Refused while a phone number is routed to the group (incoming or outgoing) or while a callback/recall widget redirects to it. The queue is removed from Asterisk asynchronously by a background job.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the group and its memberships permanently; removes the queue from Asterisk (background job)."
                  },
                  "status": "Returned when the group does not exist or belongs to another company (the ownership check fails with an internal error instead of 404).",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "List group members",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/group-employees",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "group-employees"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns group memberships (employee ↔ group with a `penalty` priority) for all groups of the company. Filter by group: `filters[group][id][$eq]=5`. Useful `populate`: `user` (employee), `group`. An employee can be a member of only one group.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of memberships.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns group memberships (employee ↔ group with a `penalty` priority) for all groups of the company. Filter by group: `filters[group][id][$eq]=5`. Useful `populate`: `user` (employee), `group`. An employee can be a member of only one group.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Page of memberships.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 71,\n      \"attributes\": {\n        \"penalty\": 1,\n        \"createdAt\": \"2026-01-15T10:20:00.000Z\",\n        \"updatedAt\": \"2026-01-15T10:20:00.000Z\",\n        \"group\": {\n          \"data\": {\n            \"id\": 5,\n            \"attributes\": {\n              \"name\": \"Sales\",\n              \"number\": \"001\",\n              \"algoritm\": \"uniform\"\n            }\n          }\n        },\n        \"user\": {\n          \"data\": {\n            \"id\": 44,\n            \"attributes\": {\n              \"username\": \"john.doe\",\n              \"email\": \"john.doe@example.com\",\n              \"firstName\": \"John\",\n              \"lastName\": \"Doe\"\n            }\n          }\n        }\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns group memberships (employee ↔ group with a `penalty` priority) for all groups of the company. Filter by group: `filters[group][id][$eq]=5`. Useful `populate`: `user` (employee), `group`. An employee can be a member of only one group.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns group memberships (employee ↔ group with a `penalty` priority) for all groups of the company. Filter by group: `filters[group][id][$eq]=5`. Useful `populate`: `user` (employee), `group`. An employee can be a member of only one group.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Add an employee to a group",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/group-employees",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "group-employees"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Adds one employee (`user`) of the company to a group of the company. Body: `{ \"data\": { \"group\": 5, \"user\": 44, \"penalty\": 1 } }`. `penalty` below 2 is stored as 1. An employee may belong to one group only.\nThe member is added to the Asterisk queue asynchronously (background job) and the group's phone states are refreshed. The employee must have a SIP line, otherwise the queue member is not created.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Adds the member to the Asterisk queue (background job).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"group\": 5,\n    \"user\": 44,\n    \"penalty\": 1\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created membership.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Adds one employee (`user`) of the company to a group of the company. Body: `{ \"data\": { \"group\": 5, \"user\": 44, \"penalty\": 1 } }`. `penalty` below 2 is stored as 1. An employee may belong to one group only.\nThe member is added to the Asterisk queue asynchronously (background job) and the group's phone states are refreshed. The employee must have a SIP line, otherwise the queue member is not created.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Adds the member to the Asterisk queue (background job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"group\": 5,\n    \"user\": 44,\n    \"penalty\": 1\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created membership.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 71,\n    \"attributes\": {\n      \"penalty\": 1,\n      \"createdAt\": \"2026-01-15T10:20:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:20:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error: `Empty group`, `Group not found` (also when the group belongs to another company), `User not found` (also when the user belongs to another company), `User already added to group`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Adds one employee (`user`) of the company to a group of the company. Body: `{ \"data\": { \"group\": 5, \"user\": 44, \"penalty\": 1 } }`. `penalty` below 2 is stored as 1. An employee may belong to one group only.\nThe member is added to the Asterisk queue asynchronously (background job) and the group's phone states are refreshed. The employee must have a SIP line, otherwise the queue member is not created.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Adds the member to the Asterisk queue (background job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"group\": 5,\n    \"user\": 44,\n    \"penalty\": 1\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error: `Empty group`, `Group not found` (also when the group belongs to another company), `User not found` (also when the user belongs to another company), `User already added to group`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"User already added to group\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Adds one employee (`user`) of the company to a group of the company. Body: `{ \"data\": { \"group\": 5, \"user\": 44, \"penalty\": 1 } }`. `penalty` below 2 is stored as 1. An employee may belong to one group only.\nThe member is added to the Asterisk queue asynchronously (background job) and the group's phone states are refreshed. The employee must have a SIP line, otherwise the queue member is not created.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Adds the member to the Asterisk queue (background job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"group\": 5,\n    \"user\": 44,\n    \"penalty\": 1\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Adds one employee (`user`) of the company to a group of the company. Body: `{ \"data\": { \"group\": 5, \"user\": 44, \"penalty\": 1 } }`. `penalty` below 2 is stored as 1. An employee may belong to one group only.\nThe member is added to the Asterisk queue asynchronously (background job) and the group's phone states are refreshed. The employee must have a SIP line, otherwise the queue member is not created.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Adds the member to the Asterisk queue (background job).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"group\": 5,\n    \"user\": 44,\n    \"penalty\": 1\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get a group membership",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/group-employees/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "group-employees",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "71",
                      "description": "Membership (group-employee) id."
                    }
                  ]
                },
                "description": "Returns one membership of the company's groups. Returns `data: null` if not found or if the group belongs to another company.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Membership, or `data: null`.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "71",
                          "description": "Membership (group-employee) id."
                        }
                      ]
                    },
                    "description": "Returns one membership of the company's groups. Returns `data: null` if not found or if the group belongs to another company.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Membership, or `data: null`.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 71,\n    \"attributes\": {\n      \"penalty\": 1,\n      \"createdAt\": \"2026-01-15T10:20:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:20:00.000Z\",\n      \"user\": {\n        \"data\": {\n          \"id\": 44,\n          \"attributes\": {\n            \"username\": \"john.doe\",\n            \"email\": \"john.doe@example.com\",\n            \"firstName\": \"John\",\n            \"lastName\": \"Doe\"\n          }\n        }\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "71",
                          "description": "Membership (group-employee) id."
                        }
                      ]
                    },
                    "description": "Returns one membership of the company's groups. Returns `data: null` if not found or if the group belongs to another company.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "71",
                          "description": "Membership (group-employee) id."
                        }
                      ]
                    },
                    "description": "Returns one membership of the company's groups. Returns `data: null` if not found or if the group belongs to another company.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Change a member's priority",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/group-employees/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "group-employees",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "71",
                      "description": "Membership (group-employee) id."
                    }
                  ]
                },
                "description": "Updates the `penalty` (priority) of a membership. Only `penalty` is taken from the body; values below 2 are stored as 1. The group cannot be changed — delete and re-add the member instead.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None beyond the record (the queue member penalty in Asterisk is not updated by this call).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"penalty\": 2\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated membership.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "71",
                          "description": "Membership (group-employee) id."
                        }
                      ]
                    },
                    "description": "Updates the `penalty` (priority) of a membership. Only `penalty` is taken from the body; values below 2 are stored as 1. The group cannot be changed — delete and re-add the member instead.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None beyond the record (the queue member penalty in Asterisk is not updated by this call).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"penalty\": 2\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated membership.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 71,\n    \"attributes\": {\n      \"penalty\": 2,\n      \"createdAt\": \"2026-01-15T10:20:00.000Z\",\n      \"updatedAt\": \"2026-01-17T12:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 `Not found` — the membership does not exist or belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "71",
                          "description": "Membership (group-employee) id."
                        }
                      ]
                    },
                    "description": "Updates the `penalty` (priority) of a membership. Only `penalty` is taken from the body; values below 2 are stored as 1. The group cannot be changed — delete and re-add the member instead.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None beyond the record (the queue member penalty in Asterisk is not updated by this call).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"penalty\": 2\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`Not found` — the membership does not exist or belongs to another company.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Not found\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "71",
                          "description": "Membership (group-employee) id."
                        }
                      ]
                    },
                    "description": "Updates the `penalty` (priority) of a membership. Only `penalty` is taken from the body; values below 2 are stored as 1. The group cannot be changed — delete and re-add the member instead.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None beyond the record (the queue member penalty in Asterisk is not updated by this call).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"penalty\": 2\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "71",
                          "description": "Membership (group-employee) id."
                        }
                      ]
                    },
                    "description": "Updates the `penalty` (priority) of a membership. Only `penalty` is taken from the body; values below 2 are stored as 1. The group cannot be changed — delete and re-add the member instead.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None beyond the record (the queue member penalty in Asterisk is not updated by this call).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"penalty\": 2\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Remove an employee from a group",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/group-employees/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "group-employees",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "71",
                      "description": "Membership (group-employee) id."
                    }
                  ]
                },
                "description": "Deletes a membership of the company's groups. The member is removed from the Asterisk queue asynchronously (background job) and the group's phone states are refreshed.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the membership permanently; removes the member from the Asterisk queue (background job)."
              },
              "response": [
                {
                  "name": "200 Deleted membership.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "71",
                          "description": "Membership (group-employee) id."
                        }
                      ]
                    },
                    "description": "Deletes a membership of the company's groups. The member is removed from the Asterisk queue asynchronously (background job) and the group's phone states are refreshed.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the membership permanently; removes the member from the Asterisk queue (background job)."
                  },
                  "status": "Deleted membership.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 71,\n    \"attributes\": {\n      \"penalty\": 1,\n      \"createdAt\": \"2026-01-15T10:20:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:20:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 `Not found` — the membership does not exist or belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "71",
                          "description": "Membership (group-employee) id."
                        }
                      ]
                    },
                    "description": "Deletes a membership of the company's groups. The member is removed from the Asterisk queue asynchronously (background job) and the group's phone states are refreshed.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the membership permanently; removes the member from the Asterisk queue (background job)."
                  },
                  "status": "`Not found` — the membership does not exist or belongs to another company.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Not found\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "71",
                          "description": "Membership (group-employee) id."
                        }
                      ]
                    },
                    "description": "Deletes a membership of the company's groups. The member is removed from the Asterisk queue asynchronously (background job) and the group's phone states are refreshed.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the membership permanently; removes the member from the Asterisk queue (background job)."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employees/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employees",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "71",
                          "description": "Membership (group-employee) id."
                        }
                      ]
                    },
                    "description": "Deletes a membership of the company's groups. The member is removed from the Asterisk queue asynchronously (background job) and the group's phone states are refreshed.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes the membership permanently; removes the member from the Asterisk queue (background job)."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Set the members of a group",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/group-employee/bulk-create",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "group-employee",
                    "bulk-create"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Replaces the whole member list of one group. Body: `{ \"data\": { \"group_employees\": [ { \"group\": 5, \"user\": 44 }, { \"group\": 5, \"user\": 45 } ] } }` — all entries must reference the same group (the group of the first entry is used). Existing memberships of that group are deleted, then the new ones are created. `penalty` is assigned automatically from the group's `algoritm`: `consistent` → 1, 2, 3… in list order; all other strategies → 1.\nThe Asterisk queue members are rewritten synchronously as part of the request. Employees must have SIP lines. Sending an empty `group_employees` array fails with 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all current memberships of the group and recreates them; rewrites the queue members in Asterisk.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"group_employees\": [\n      {\n        \"group\": 5,\n        \"user\": 44\n      },\n      {\n        \"group\": 5,\n        \"user\": 45\n      }\n    ]\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Result lists. `failed` is always empty in the current implementation.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employee/bulk-create",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employee",
                        "bulk-create"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Replaces the whole member list of one group. Body: `{ \"data\": { \"group_employees\": [ { \"group\": 5, \"user\": 44 }, { \"group\": 5, \"user\": 45 } ] } }` — all entries must reference the same group (the group of the first entry is used). Existing memberships of that group are deleted, then the new ones are created. `penalty` is assigned automatically from the group's `algoritm`: `consistent` → 1, 2, 3… in list order; all other strategies → 1.\nThe Asterisk queue members are rewritten synchronously as part of the request. Employees must have SIP lines. Sending an empty `group_employees` array fails with 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all current memberships of the group and recreates them; rewrites the queue members in Asterisk.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"group_employees\": [\n      {\n        \"group\": 5,\n        \"user\": 44\n      },\n      {\n        \"group\": 5,\n        \"user\": 45\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Result lists. `failed` is always empty in the current implementation.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"success\": [\n      {\n        \"group\": 5,\n        \"user\": 44,\n        \"penalty\": 1\n      },\n      {\n        \"group\": 5,\n        \"user\": 45,\n        \"penalty\": 1\n      }\n    ],\n    \"failed\": []\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error: `Employees not found` (the company has no employees), `Group not found` (also for a group of another company).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employee/bulk-create",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employee",
                        "bulk-create"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Replaces the whole member list of one group. Body: `{ \"data\": { \"group_employees\": [ { \"group\": 5, \"user\": 44 }, { \"group\": 5, \"user\": 45 } ] } }` — all entries must reference the same group (the group of the first entry is used). Existing memberships of that group are deleted, then the new ones are created. `penalty` is assigned automatically from the group's `algoritm`: `consistent` → 1, 2, 3… in list order; all other strategies → 1.\nThe Asterisk queue members are rewritten synchronously as part of the request. Employees must have SIP lines. Sending an empty `group_employees` array fails with 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all current memberships of the group and recreates them; rewrites the queue members in Asterisk.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"group_employees\": [\n      {\n        \"group\": 5,\n        \"user\": 44\n      },\n      {\n        \"group\": 5,\n        \"user\": 45\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error: `Employees not found` (the company has no employees), `Group not found` (also for a group of another company).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Group not found\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employee/bulk-create",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employee",
                        "bulk-create"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Replaces the whole member list of one group. Body: `{ \"data\": { \"group_employees\": [ { \"group\": 5, \"user\": 44 }, { \"group\": 5, \"user\": 45 } ] } }` — all entries must reference the same group (the group of the first entry is used). Existing memberships of that group are deleted, then the new ones are created. `penalty` is assigned automatically from the group's `algoritm`: `consistent` → 1, 2, 3… in list order; all other strategies → 1.\nThe Asterisk queue members are rewritten synchronously as part of the request. Employees must have SIP lines. Sending an empty `group_employees` array fails with 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all current memberships of the group and recreates them; rewrites the queue members in Asterisk.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"group_employees\": [\n      {\n        \"group\": 5,\n        \"user\": 44\n      },\n      {\n        \"group\": 5,\n        \"user\": 45\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employee/bulk-create",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employee",
                        "bulk-create"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Replaces the whole member list of one group. Body: `{ \"data\": { \"group_employees\": [ { \"group\": 5, \"user\": 44 }, { \"group\": 5, \"user\": 45 } ] } }` — all entries must reference the same group (the group of the first entry is used). Existing memberships of that group are deleted, then the new ones are created. `penalty` is assigned automatically from the group's `algoritm`: `consistent` → 1, 2, 3… in list order; all other strategies → 1.\nThe Asterisk queue members are rewritten synchronously as part of the request. Employees must have SIP lines. Sending an empty `group_employees` array fails with 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all current memberships of the group and recreates them; rewrites the queue members in Asterisk.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"group_employees\": [\n      {\n        \"group\": 5,\n        \"user\": 44\n      },\n      {\n        \"group\": 5,\n        \"user\": 45\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employee/bulk-create",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employee",
                        "bulk-create"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Replaces the whole member list of one group. Body: `{ \"data\": { \"group_employees\": [ { \"group\": 5, \"user\": 44 }, { \"group\": 5, \"user\": 45 } ] } }` — all entries must reference the same group (the group of the first entry is used). Existing memberships of that group are deleted, then the new ones are created. `penalty` is assigned automatically from the group's `algoritm`: `consistent` → 1, 2, 3… in list order; all other strategies → 1.\nThe Asterisk queue members are rewritten synchronously as part of the request. Employees must have SIP lines. Sending an empty `group_employees` array fails with 500.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all current memberships of the group and recreates them; rewrites the queue members in Asterisk.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"group_employees\": [\n      {\n        \"group\": 5,\n        \"user\": 44\n      },\n      {\n        \"group\": 5,\n        \"user\": 45\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Replace the members of a group",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/group-employee/bulk-update",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "group-employee",
                    "bulk-update"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Same as `POST /group-employee/bulk-create` (replaces the whole member list of the group and rewrites the Asterisk queue members), but an empty `group_employees` array is rejected with a 400 instead of failing.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all current memberships of the group and recreates them; rewrites the queue members in Asterisk.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"group_employees\": [\n      {\n        \"group\": 5,\n        \"user\": 44\n      },\n      {\n        \"group\": 5,\n        \"user\": 46\n      }\n    ]\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Result lists.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employee/bulk-update",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employee",
                        "bulk-update"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Same as `POST /group-employee/bulk-create` (replaces the whole member list of the group and rewrites the Asterisk queue members), but an empty `group_employees` array is rejected with a 400 instead of failing.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all current memberships of the group and recreates them; rewrites the queue members in Asterisk.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"group_employees\": [\n      {\n        \"group\": 5,\n        \"user\": 44\n      },\n      {\n        \"group\": 5,\n        \"user\": 46\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Result lists.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"success\": [\n      {\n        \"group\": 5,\n        \"user\": 44,\n        \"penalty\": 1\n      },\n      {\n        \"group\": 5,\n        \"user\": 46,\n        \"penalty\": 2\n      }\n    ],\n    \"failed\": []\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error: `group_employees is empty`, `Employees not found`, `Group not found`.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employee/bulk-update",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employee",
                        "bulk-update"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Same as `POST /group-employee/bulk-create` (replaces the whole member list of the group and rewrites the Asterisk queue members), but an empty `group_employees` array is rejected with a 400 instead of failing.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all current memberships of the group and recreates them; rewrites the queue members in Asterisk.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"group_employees\": [\n      {\n        \"group\": 5,\n        \"user\": 44\n      },\n      {\n        \"group\": 5,\n        \"user\": 46\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error: `group_employees is empty`, `Employees not found`, `Group not found`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"group_employees is empty\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employee/bulk-update",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employee",
                        "bulk-update"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Same as `POST /group-employee/bulk-create` (replaces the whole member list of the group and rewrites the Asterisk queue members), but an empty `group_employees` array is rejected with a 400 instead of failing.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all current memberships of the group and recreates them; rewrites the queue members in Asterisk.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"group_employees\": [\n      {\n        \"group\": 5,\n        \"user\": 44\n      },\n      {\n        \"group\": 5,\n        \"user\": 46\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employee/bulk-update",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employee",
                        "bulk-update"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Same as `POST /group-employee/bulk-create` (replaces the whole member list of the group and rewrites the Asterisk queue members), but an empty `group_employees` array is rejected with a 400 instead of failing.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes all current memberships of the group and recreates them; rewrites the queue members in Asterisk.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"group_employees\": [\n      {\n        \"group\": 5,\n        \"user\": 44\n      },\n      {\n        \"group\": 5,\n        \"user\": 46\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Remove several members from a group",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/group-employee/bulk-delete?ids=71,72",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "group-employee",
                    "bulk-delete"
                  ],
                  "query": [
                    {
                      "key": "ids",
                      "value": "71,72",
                      "description": "Membership ids to delete, array form: `ids[0]=71&ids[1]=72`.",
                      "disabled": false
                    }
                  ],
                  "variable": []
                },
                "description": "Deletes several memberships of ONE group by id. Ids are passed in the query string as an array: `?ids[0]=71&ids[1]=72` (a single `ids=71` value is not accepted — always use the array form). Only memberships that belong to the same group as the first id and to the company are deleted; the others are returned in `failed`.\nQuirk: the request must also carry a JSON body with a `data` object (e.g. `{ \"data\": {} }`), otherwise the pre-check fails with 500.\nMemberships are deleted directly; the queue members in Asterisk are removed for the affected group.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes memberships permanently; removes the members from the Asterisk queue.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {}\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Deleted ids (`success`) and skipped ids (`failed`, as strings).",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employee/bulk-delete?ids=71,72",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employee",
                        "bulk-delete"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "71,72",
                          "description": "Membership ids to delete, array form: `ids[0]=71&ids[1]=72`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes several memberships of ONE group by id. Ids are passed in the query string as an array: `?ids[0]=71&ids[1]=72` (a single `ids=71` value is not accepted — always use the array form). Only memberships that belong to the same group as the first id and to the company are deleted; the others are returned in `failed`.\nQuirk: the request must also carry a JSON body with a `data` object (e.g. `{ \"data\": {} }`), otherwise the pre-check fails with 500.\nMemberships are deleted directly; the queue members in Asterisk are removed for the affected group.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes memberships permanently; removes the members from the Asterisk queue.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {}\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Deleted ids (`success`) and skipped ids (`failed`, as strings).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"success\": [\n      71,\n      72\n    ],\n    \"failed\": [\n      \"99\"\n    ]\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 `Not found` — none of the ids exist.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employee/bulk-delete?ids=71,72",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employee",
                        "bulk-delete"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "71,72",
                          "description": "Membership ids to delete, array form: `ids[0]=71&ids[1]=72`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes several memberships of ONE group by id. Ids are passed in the query string as an array: `?ids[0]=71&ids[1]=72` (a single `ids=71` value is not accepted — always use the array form). Only memberships that belong to the same group as the first id and to the company are deleted; the others are returned in `failed`.\nQuirk: the request must also carry a JSON body with a `data` object (e.g. `{ \"data\": {} }`), otherwise the pre-check fails with 500.\nMemberships are deleted directly; the queue members in Asterisk are removed for the affected group.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes memberships permanently; removes the members from the Asterisk queue.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {}\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`Not found` — none of the ids exist.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"Not found\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employee/bulk-delete?ids=71,72",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employee",
                        "bulk-delete"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "71,72",
                          "description": "Membership ids to delete, array form: `ids[0]=71&ids[1]=72`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes several memberships of ONE group by id. Ids are passed in the query string as an array: `?ids[0]=71&ids[1]=72` (a single `ids=71` value is not accepted — always use the array form). Only memberships that belong to the same group as the first id and to the company are deleted; the others are returned in `failed`.\nQuirk: the request must also carry a JSON body with a `data` object (e.g. `{ \"data\": {} }`), otherwise the pre-check fails with 500.\nMemberships are deleted directly; the queue members in Asterisk are removed for the affected group.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes memberships permanently; removes the members from the Asterisk queue.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {}\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employee/bulk-delete?ids=71,72",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employee",
                        "bulk-delete"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "71,72",
                          "description": "Membership ids to delete, array form: `ids[0]=71&ids[1]=72`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes several memberships of ONE group by id. Ids are passed in the query string as an array: `?ids[0]=71&ids[1]=72` (a single `ids=71` value is not accepted — always use the array form). Only memberships that belong to the same group as the first id and to the company are deleted; the others are returned in `failed`.\nQuirk: the request must also carry a JSON body with a `data` object (e.g. `{ \"data\": {} }`), otherwise the pre-check fails with 500.\nMemberships are deleted directly; the queue members in Asterisk are removed for the affected group.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes memberships permanently; removes the members from the Asterisk queue.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {}\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/group-employee/bulk-delete?ids=71,72",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "group-employee",
                        "bulk-delete"
                      ],
                      "query": [
                        {
                          "key": "ids",
                          "value": "71,72",
                          "description": "Membership ids to delete, array form: `ids[0]=71&ids[1]=72`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes several memberships of ONE group by id. Ids are passed in the query string as an array: `?ids[0]=71&ids[1]=72` (a single `ids=71` value is not accepted — always use the array form). Only memberships that belong to the same group as the first id and to the company are deleted; the others are returned in `failed`.\nQuirk: the request must also carry a JSON body with a `data` object (e.g. `{ \"data\": {} }`), otherwise the pre-check fails with 500.\nMemberships are deleted directly; the queue members in Asterisk are removed for the affected group.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Deletes memberships permanently; removes the members from the Asterisk queue.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {}\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            }
          ]
        },
        {
          "name": "Callback widget",
          "description": "Callback and recall widgets for your website: configuration, embed code, tickets and activity.",
          "item": [
            {
              "name": "List callback widgets",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widgets",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widgets"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the callback widgets of the user's company (the list is filtered by the company of the authenticated user).\nA callback widget is a button on your website: the visitor leaves a phone number and the platform calls the visitor\nback and connects the call to the configured employee or group (`redirect`).\n\nUseful `populate` values: `callback_widget_design`, `callback_widget_activity`, `redirect` (with nested\n`populate[redirect][populate]=*` to get the user/group), `callback_widget_tickets`.\nFilters: `filters[activity][$eq]=true`, `filters[sitename][$contains]=example`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of callback widgets.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the callback widgets of the user's company (the list is filtered by the company of the authenticated user).\nA callback widget is a button on your website: the visitor leaves a phone number and the platform calls the visitor\nback and connects the call to the configured employee or group (`redirect`).\n\nUseful `populate` values: `callback_widget_design`, `callback_widget_activity`, `redirect` (with nested\n`populate[redirect][populate]=*` to get the user/group), `callback_widget_tickets`.\nFilters: `filters[activity][$eq]=true`, `filters[sitename][$contains]=example`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Page of callback widgets.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 15,\n      \"attributes\": {\n        \"sitename\": \"example.com\",\n        \"activity\": true,\n        \"widget_name\": \"Main site\",\n        \"work_time\": {\n          \"mon\": \"09:00-18:00\",\n          \"tue\": \"09:00-18:00\",\n          \"wed\": \"09:00-18:00\",\n          \"thu\": \"09:00-18:00\",\n          \"fri\": \"09:00-18:00\"\n        },\n        \"active_on_exit\": true,\n        \"hide_on_weekend\": false,\n        \"widget_hash\": \"5c5822c3-0356-4230-b855-0879ff937e3d\",\n        \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n        \"updatedAt\": \"2026-02-01T12:00:00.000Z\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the callback widgets of the user's company (the list is filtered by the company of the authenticated user).\nA callback widget is a button on your website: the visitor leaves a phone number and the platform calls the visitor\nback and connects the call to the configured employee or group (`redirect`).\n\nUseful `populate` values: `callback_widget_design`, `callback_widget_activity`, `redirect` (with nested\n`populate[redirect][populate]=*` to get the user/group), `callback_widget_tickets`.\nFilters: `filters[activity][$eq]=true`, `filters[sitename][$contains]=example`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the callback widgets of the user's company (the list is filtered by the company of the authenticated user).\nA callback widget is a button on your website: the visitor leaves a phone number and the platform calls the visitor\nback and connects the call to the configured employee or group (`redirect`).\n\nUseful `populate` values: `callback_widget_design`, `callback_widget_activity`, `redirect` (with nested\n`populate[redirect][populate]=*` to get the user/group), `callback_widget_tickets`.\nFilters: `filters[activity][$eq]=true`, `filters[sitename][$contains]=example`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Create callback widget",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widgets",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widgets"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Creates a callback widget for the user's company. The company is attached automatically.\n`widget_hash` (used in the embed code, see `GET /callback-widgets/getCode/{id}`) is generated by the server.\n\n`sitename` must be the bare domain of the site where the widget is installed (e.g. `example.com`, without protocol\nand `www.`): public ticket requests from the widget are accepted only if the `Origin` of the request matches it.\n`redirect` defines who receives the call: an employee (`user`) or a call group (`group`).\n\nAfter creation set up the look and behaviour with `POST /callback-widget-designs` and `POST /callback-widget-activities`\n(pass `callback_widget: <id>`), or pass an existing `callback_widget_activity` id in this request.\n\nTariff limit: each tariff includes a number of free callback widgets (`max_callback_widgets`). If the company already\nhas that many widgets, the new widget is paid: an order is created and the monthly price `callback_widget_cost`\nof the tariff is charged from the balance (a monthly subscription for the widget is created). If the balance is\ninsufficient, the request fails with 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** If the tariff limit of free callback widgets is exceeded: creates an order, charges the tariff price `callback_widget_cost` from the balance and starts a monthly subscription for the widget. Otherwise none.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"sitename\": \"example.com\",\n    \"widget_name\": \"Main site\",\n    \"activity\": true,\n    \"redirect\": {\n      \"user\": 7\n    },\n    \"work_time\": {\n      \"mon\": \"09:00-18:00\",\n      \"tue\": \"09:00-18:00\",\n      \"wed\": \"09:00-18:00\",\n      \"thu\": \"09:00-18:00\",\n      \"fri\": \"09:00-18:00\"\n    },\n    \"active_on_exit\": true,\n    \"hide_on_weekend\": false\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created widget.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a callback widget for the user's company. The company is attached automatically.\n`widget_hash` (used in the embed code, see `GET /callback-widgets/getCode/{id}`) is generated by the server.\n\n`sitename` must be the bare domain of the site where the widget is installed (e.g. `example.com`, without protocol\nand `www.`): public ticket requests from the widget are accepted only if the `Origin` of the request matches it.\n`redirect` defines who receives the call: an employee (`user`) or a call group (`group`).\n\nAfter creation set up the look and behaviour with `POST /callback-widget-designs` and `POST /callback-widget-activities`\n(pass `callback_widget: <id>`), or pass an existing `callback_widget_activity` id in this request.\n\nTariff limit: each tariff includes a number of free callback widgets (`max_callback_widgets`). If the company already\nhas that many widgets, the new widget is paid: an order is created and the monthly price `callback_widget_cost`\nof the tariff is charged from the balance (a monthly subscription for the widget is created). If the balance is\ninsufficient, the request fails with 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** If the tariff limit of free callback widgets is exceeded: creates an order, charges the tariff price `callback_widget_cost` from the balance and starts a monthly subscription for the widget. Otherwise none.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"sitename\": \"example.com\",\n    \"widget_name\": \"Main site\",\n    \"activity\": true,\n    \"redirect\": {\n      \"user\": 7\n    },\n    \"work_time\": {\n      \"mon\": \"09:00-18:00\",\n      \"tue\": \"09:00-18:00\",\n      \"wed\": \"09:00-18:00\",\n      \"thu\": \"09:00-18:00\",\n      \"fri\": \"09:00-18:00\"\n    },\n    \"active_on_exit\": true,\n    \"hide_on_weekend\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created widget.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 15,\n    \"attributes\": {\n      \"sitename\": \"example.com\",\n      \"activity\": true,\n      \"widget_name\": \"Main site\",\n      \"work_time\": {\n        \"mon\": \"09:00-18:00\",\n        \"tue\": \"09:00-18:00\",\n        \"wed\": \"09:00-18:00\",\n        \"thu\": \"09:00-18:00\",\n        \"fri\": \"09:00-18:00\"\n      },\n      \"active_on_exit\": true,\n      \"hide_on_weekend\": false,\n      \"widget_hash\": \"5c5822c3-0356-4230-b855-0879ff937e3d\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error: insufficient balance for a paid widget (`Not enough money on balance`), missing required field (`sitename must be defined.`, `widget_name must be defined.`), or `sitename` already used (`This attribute must be unique`).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a callback widget for the user's company. The company is attached automatically.\n`widget_hash` (used in the embed code, see `GET /callback-widgets/getCode/{id}`) is generated by the server.\n\n`sitename` must be the bare domain of the site where the widget is installed (e.g. `example.com`, without protocol\nand `www.`): public ticket requests from the widget are accepted only if the `Origin` of the request matches it.\n`redirect` defines who receives the call: an employee (`user`) or a call group (`group`).\n\nAfter creation set up the look and behaviour with `POST /callback-widget-designs` and `POST /callback-widget-activities`\n(pass `callback_widget: <id>`), or pass an existing `callback_widget_activity` id in this request.\n\nTariff limit: each tariff includes a number of free callback widgets (`max_callback_widgets`). If the company already\nhas that many widgets, the new widget is paid: an order is created and the monthly price `callback_widget_cost`\nof the tariff is charged from the balance (a monthly subscription for the widget is created). If the balance is\ninsufficient, the request fails with 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** If the tariff limit of free callback widgets is exceeded: creates an order, charges the tariff price `callback_widget_cost` from the balance and starts a monthly subscription for the widget. Otherwise none.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"sitename\": \"example.com\",\n    \"widget_name\": \"Main site\",\n    \"activity\": true,\n    \"redirect\": {\n      \"user\": 7\n    },\n    \"work_time\": {\n      \"mon\": \"09:00-18:00\",\n      \"tue\": \"09:00-18:00\",\n      \"wed\": \"09:00-18:00\",\n      \"thu\": \"09:00-18:00\",\n      \"fri\": \"09:00-18:00\"\n    },\n    \"active_on_exit\": true,\n    \"hide_on_weekend\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error: insufficient balance for a paid widget (`Not enough money on balance`), missing required field (`sitename must be defined.`, `widget_name must be defined.`), or `sitename` already used (`This attribute must be unique`).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Not enough money on balance\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a callback widget for the user's company. The company is attached automatically.\n`widget_hash` (used in the embed code, see `GET /callback-widgets/getCode/{id}`) is generated by the server.\n\n`sitename` must be the bare domain of the site where the widget is installed (e.g. `example.com`, without protocol\nand `www.`): public ticket requests from the widget are accepted only if the `Origin` of the request matches it.\n`redirect` defines who receives the call: an employee (`user`) or a call group (`group`).\n\nAfter creation set up the look and behaviour with `POST /callback-widget-designs` and `POST /callback-widget-activities`\n(pass `callback_widget: <id>`), or pass an existing `callback_widget_activity` id in this request.\n\nTariff limit: each tariff includes a number of free callback widgets (`max_callback_widgets`). If the company already\nhas that many widgets, the new widget is paid: an order is created and the monthly price `callback_widget_cost`\nof the tariff is charged from the balance (a monthly subscription for the widget is created). If the balance is\ninsufficient, the request fails with 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** If the tariff limit of free callback widgets is exceeded: creates an order, charges the tariff price `callback_widget_cost` from the balance and starts a monthly subscription for the widget. Otherwise none.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"sitename\": \"example.com\",\n    \"widget_name\": \"Main site\",\n    \"activity\": true,\n    \"redirect\": {\n      \"user\": 7\n    },\n    \"work_time\": {\n      \"mon\": \"09:00-18:00\",\n      \"tue\": \"09:00-18:00\",\n      \"wed\": \"09:00-18:00\",\n      \"thu\": \"09:00-18:00\",\n      \"fri\": \"09:00-18:00\"\n    },\n    \"active_on_exit\": true,\n    \"hide_on_weekend\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a callback widget for the user's company. The company is attached automatically.\n`widget_hash` (used in the embed code, see `GET /callback-widgets/getCode/{id}`) is generated by the server.\n\n`sitename` must be the bare domain of the site where the widget is installed (e.g. `example.com`, without protocol\nand `www.`): public ticket requests from the widget are accepted only if the `Origin` of the request matches it.\n`redirect` defines who receives the call: an employee (`user`) or a call group (`group`).\n\nAfter creation set up the look and behaviour with `POST /callback-widget-designs` and `POST /callback-widget-activities`\n(pass `callback_widget: <id>`), or pass an existing `callback_widget_activity` id in this request.\n\nTariff limit: each tariff includes a number of free callback widgets (`max_callback_widgets`). If the company already\nhas that many widgets, the new widget is paid: an order is created and the monthly price `callback_widget_cost`\nof the tariff is charged from the balance (a monthly subscription for the widget is created). If the balance is\ninsufficient, the request fails with 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** If the tariff limit of free callback widgets is exceeded: creates an order, charges the tariff price `callback_widget_cost` from the balance and starts a monthly subscription for the widget. Otherwise none.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"sitename\": \"example.com\",\n    \"widget_name\": \"Main site\",\n    \"activity\": true,\n    \"redirect\": {\n      \"user\": 7\n    },\n    \"work_time\": {\n      \"mon\": \"09:00-18:00\",\n      \"tue\": \"09:00-18:00\",\n      \"wed\": \"09:00-18:00\",\n      \"thu\": \"09:00-18:00\",\n      \"fri\": \"09:00-18:00\"\n    },\n    \"active_on_exit\": true,\n    \"hide_on_weekend\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a callback widget for the user's company. The company is attached automatically.\n`widget_hash` (used in the embed code, see `GET /callback-widgets/getCode/{id}`) is generated by the server.\n\n`sitename` must be the bare domain of the site where the widget is installed (e.g. `example.com`, without protocol\nand `www.`): public ticket requests from the widget are accepted only if the `Origin` of the request matches it.\n`redirect` defines who receives the call: an employee (`user`) or a call group (`group`).\n\nAfter creation set up the look and behaviour with `POST /callback-widget-designs` and `POST /callback-widget-activities`\n(pass `callback_widget: <id>`), or pass an existing `callback_widget_activity` id in this request.\n\nTariff limit: each tariff includes a number of free callback widgets (`max_callback_widgets`). If the company already\nhas that many widgets, the new widget is paid: an order is created and the monthly price `callback_widget_cost`\nof the tariff is charged from the balance (a monthly subscription for the widget is created). If the balance is\ninsufficient, the request fails with 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** If the tariff limit of free callback widgets is exceeded: creates an order, charges the tariff price `callback_widget_cost` from the balance and starts a monthly subscription for the widget. Otherwise none.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"sitename\": \"example.com\",\n    \"widget_name\": \"Main site\",\n    \"activity\": true,\n    \"redirect\": {\n      \"user\": 7\n    },\n    \"work_time\": {\n      \"mon\": \"09:00-18:00\",\n      \"tue\": \"09:00-18:00\",\n      \"wed\": \"09:00-18:00\",\n      \"thu\": \"09:00-18:00\",\n      \"fri\": \"09:00-18:00\"\n    },\n    \"active_on_exit\": true,\n    \"hide_on_weekend\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Start the callback call for a ticket",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widgets/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widgets",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "15",
                      "description": "Callback widget id (ignored by the handler; pass the same id as `data.widgetId`)."
                    }
                  ]
                },
                "description": "Service method of the callback engine: originates the callback call for an existing ticket right now.\nNormally you do not call it yourself: when a ticket is created (`POST /callback-widget-tickets`) the platform\nqueues this call automatically at `when_call_time`. Use it only to force an immediate (re)call for a ticket.\n\nThe call is placed from the SIP line of the employee (`redirect.user`) or from the call group (`redirect.group`)\nof the widget `data.widgetId` to the visitor number `data.contact_number`; the ticket `data.ticketId` is switched\nto status `calling`. The path parameter `{id}` is not used by the handler — the widget is taken from `data.widgetId`.\nRate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Initiates an outgoing call from the company (employee SIP line or group) to the visitor number; the call is charged by the company tariff for outgoing calls. Sets the ticket status to `calling`.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"widgetId\": 15,\n    \"contact_number\": \"+380441234567\",\n    \"ticketId\": 101,\n    \"actionId\": \"1737000000\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Call originated. The body is the literal `true`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id (ignored by the handler; pass the same id as `data.widgetId`)."
                        }
                      ]
                    },
                    "description": "Service method of the callback engine: originates the callback call for an existing ticket right now.\nNormally you do not call it yourself: when a ticket is created (`POST /callback-widget-tickets`) the platform\nqueues this call automatically at `when_call_time`. Use it only to force an immediate (re)call for a ticket.\n\nThe call is placed from the SIP line of the employee (`redirect.user`) or from the call group (`redirect.group`)\nof the widget `data.widgetId` to the visitor number `data.contact_number`; the ticket `data.ticketId` is switched\nto status `calling`. The path parameter `{id}` is not used by the handler — the widget is taken from `data.widgetId`.\nRate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Initiates an outgoing call from the company (employee SIP line or group) to the visitor number; the call is charged by the company tariff for outgoing calls. Sets the ticket status to `calling`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"widgetId\": 15,\n    \"contact_number\": \"+380441234567\",\n    \"ticketId\": 101,\n    \"actionId\": \"1737000000\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Call originated. The body is the literal `true`.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "true"
                },
                {
                  "name": "400 `data.contact_number` is missing.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id (ignored by the handler; pass the same id as `data.widgetId`)."
                        }
                      ]
                    },
                    "description": "Service method of the callback engine: originates the callback call for an existing ticket right now.\nNormally you do not call it yourself: when a ticket is created (`POST /callback-widget-tickets`) the platform\nqueues this call automatically at `when_call_time`. Use it only to force an immediate (re)call for a ticket.\n\nThe call is placed from the SIP line of the employee (`redirect.user`) or from the call group (`redirect.group`)\nof the widget `data.widgetId` to the visitor number `data.contact_number`; the ticket `data.ticketId` is switched\nto status `calling`. The path parameter `{id}` is not used by the handler — the widget is taken from `data.widgetId`.\nRate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Initiates an outgoing call from the company (employee SIP line or group) to the visitor number; the call is charged by the company tariff for outgoing calls. Sets the ticket status to `calling`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"widgetId\": 15,\n    \"contact_number\": \"+380441234567\",\n    \"ticketId\": 101,\n    \"actionId\": \"1737000000\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`data.contact_number` is missing.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Contact_number must be defined\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id (ignored by the handler; pass the same id as `data.widgetId`)."
                        }
                      ]
                    },
                    "description": "Service method of the callback engine: originates the callback call for an existing ticket right now.\nNormally you do not call it yourself: when a ticket is created (`POST /callback-widget-tickets`) the platform\nqueues this call automatically at `when_call_time`. Use it only to force an immediate (re)call for a ticket.\n\nThe call is placed from the SIP line of the employee (`redirect.user`) or from the call group (`redirect.group`)\nof the widget `data.widgetId` to the visitor number `data.contact_number`; the ticket `data.ticketId` is switched\nto status `calling`. The path parameter `{id}` is not used by the handler — the widget is taken from `data.widgetId`.\nRate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Initiates an outgoing call from the company (employee SIP line or group) to the visitor number; the call is charged by the company tariff for outgoing calls. Sets the ticket status to `calling`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"widgetId\": 15,\n    \"contact_number\": \"+380441234567\",\n    \"ticketId\": 101,\n    \"actionId\": \"1737000000\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id (ignored by the handler; pass the same id as `data.widgetId`)."
                        }
                      ]
                    },
                    "description": "Service method of the callback engine: originates the callback call for an existing ticket right now.\nNormally you do not call it yourself: when a ticket is created (`POST /callback-widget-tickets`) the platform\nqueues this call automatically at `when_call_time`. Use it only to force an immediate (re)call for a ticket.\n\nThe call is placed from the SIP line of the employee (`redirect.user`) or from the call group (`redirect.group`)\nof the widget `data.widgetId` to the visitor number `data.contact_number`; the ticket `data.ticketId` is switched\nto status `calling`. The path parameter `{id}` is not used by the handler — the widget is taken from `data.widgetId`.\nRate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Initiates an outgoing call from the company (employee SIP line or group) to the visitor number; the call is charged by the company tariff for outgoing calls. Sets the ticket status to `calling`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"widgetId\": 15,\n    \"contact_number\": \"+380441234567\",\n    \"ticketId\": 101,\n    \"actionId\": \"1737000000\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id (ignored by the handler; pass the same id as `data.widgetId`)."
                        }
                      ]
                    },
                    "description": "Service method of the callback engine: originates the callback call for an existing ticket right now.\nNormally you do not call it yourself: when a ticket is created (`POST /callback-widget-tickets`) the platform\nqueues this call automatically at `when_call_time`. Use it only to force an immediate (re)call for a ticket.\n\nThe call is placed from the SIP line of the employee (`redirect.user`) or from the call group (`redirect.group`)\nof the widget `data.widgetId` to the visitor number `data.contact_number`; the ticket `data.ticketId` is switched\nto status `calling`. The path parameter `{id}` is not used by the handler — the widget is taken from `data.widgetId`.\nRate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Initiates an outgoing call from the company (employee SIP line or group) to the visitor number; the call is charged by the company tariff for outgoing calls. Sets the ticket status to `calling`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"widgetId\": 15,\n    \"contact_number\": \"+380441234567\",\n    \"ticketId\": 101,\n    \"actionId\": \"1737000000\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Widget `data.widgetId` not found or has no `redirect` (user/group), or the telephony server is unavailable.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id (ignored by the handler; pass the same id as `data.widgetId`)."
                        }
                      ]
                    },
                    "description": "Service method of the callback engine: originates the callback call for an existing ticket right now.\nNormally you do not call it yourself: when a ticket is created (`POST /callback-widget-tickets`) the platform\nqueues this call automatically at `when_call_time`. Use it only to force an immediate (re)call for a ticket.\n\nThe call is placed from the SIP line of the employee (`redirect.user`) or from the call group (`redirect.group`)\nof the widget `data.widgetId` to the visitor number `data.contact_number`; the ticket `data.ticketId` is switched\nto status `calling`. The path parameter `{id}` is not used by the handler — the widget is taken from `data.widgetId`.\nRate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Initiates an outgoing call from the company (employee SIP line or group) to the visitor number; the call is charged by the company tariff for outgoing calls. Sets the ticket status to `calling`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"widgetId\": 15,\n    \"contact_number\": \"+380441234567\",\n    \"ticketId\": 101,\n    \"actionId\": \"1737000000\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Widget `data.widgetId` not found or has no `redirect` (user/group), or the telephony server is unavailable.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update callback widget",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widgets/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widgets",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "15",
                      "description": "Callback widget id."
                    }
                  ]
                },
                "description": "Updates the fields of a callback widget (Strapi envelope `{ \"data\": {...} }`, only the passed fields change).\nUse it to turn the widget on/off (`activity`), change the schedule (`work_time`, `hide_on_weekend`), the site domain\nor the call destination (`redirect`). `widget_hash` and `company` cannot be changed.\nPass the id of a widget of your company (see `GET /callback-widgets`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"activity\": false,\n    \"work_time\": {\n      \"mon\": \"10:00-19:00\",\n      \"tue\": \"10:00-19:00\",\n      \"wed\": \"10:00-19:00\",\n      \"thu\": \"10:00-19:00\",\n      \"fri\": \"10:00-19:00\",\n      \"sat\": \"10:00-15:00\"\n    },\n    \"hide_on_weekend\": true\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated widget.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id."
                        }
                      ]
                    },
                    "description": "Updates the fields of a callback widget (Strapi envelope `{ \"data\": {...} }`, only the passed fields change).\nUse it to turn the widget on/off (`activity`), change the schedule (`work_time`, `hide_on_weekend`), the site domain\nor the call destination (`redirect`). `widget_hash` and `company` cannot be changed.\nPass the id of a widget of your company (see `GET /callback-widgets`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"activity\": false,\n    \"work_time\": {\n      \"mon\": \"10:00-19:00\",\n      \"tue\": \"10:00-19:00\",\n      \"wed\": \"10:00-19:00\",\n      \"thu\": \"10:00-19:00\",\n      \"fri\": \"10:00-19:00\",\n      \"sat\": \"10:00-15:00\"\n    },\n    \"hide_on_weekend\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated widget.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 15,\n    \"attributes\": {\n      \"sitename\": \"example.com\",\n      \"activity\": false,\n      \"widget_name\": \"Main site\",\n      \"work_time\": {\n        \"mon\": \"10:00-19:00\",\n        \"tue\": \"10:00-19:00\",\n        \"wed\": \"10:00-19:00\",\n        \"thu\": \"10:00-19:00\",\n        \"fri\": \"10:00-19:00\",\n        \"sat\": \"10:00-15:00\"\n      },\n      \"active_on_exit\": true,\n      \"hide_on_weekend\": true,\n      \"widget_hash\": \"5c5822c3-0356-4230-b855-0879ff937e3d\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T12:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error (e.g. `sitename` already used by another widget: `This attribute must be unique`).",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id."
                        }
                      ]
                    },
                    "description": "Updates the fields of a callback widget (Strapi envelope `{ \"data\": {...} }`, only the passed fields change).\nUse it to turn the widget on/off (`activity`), change the schedule (`work_time`, `hide_on_weekend`), the site domain\nor the call destination (`redirect`). `widget_hash` and `company` cannot be changed.\nPass the id of a widget of your company (see `GET /callback-widgets`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"activity\": false,\n    \"work_time\": {\n      \"mon\": \"10:00-19:00\",\n      \"tue\": \"10:00-19:00\",\n      \"wed\": \"10:00-19:00\",\n      \"thu\": \"10:00-19:00\",\n      \"fri\": \"10:00-19:00\",\n      \"sat\": \"10:00-15:00\"\n    },\n    \"hide_on_weekend\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error (e.g. `sitename` already used by another widget: `This attribute must be unique`).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"This attribute must be unique\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id."
                        }
                      ]
                    },
                    "description": "Updates the fields of a callback widget (Strapi envelope `{ \"data\": {...} }`, only the passed fields change).\nUse it to turn the widget on/off (`activity`), change the schedule (`work_time`, `hide_on_weekend`), the site domain\nor the call destination (`redirect`). `widget_hash` and `company` cannot be changed.\nPass the id of a widget of your company (see `GET /callback-widgets`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"activity\": false,\n    \"work_time\": {\n      \"mon\": \"10:00-19:00\",\n      \"tue\": \"10:00-19:00\",\n      \"wed\": \"10:00-19:00\",\n      \"thu\": \"10:00-19:00\",\n      \"fri\": \"10:00-19:00\",\n      \"sat\": \"10:00-15:00\"\n    },\n    \"hide_on_weekend\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id."
                        }
                      ]
                    },
                    "description": "Updates the fields of a callback widget (Strapi envelope `{ \"data\": {...} }`, only the passed fields change).\nUse it to turn the widget on/off (`activity`), change the schedule (`work_time`, `hide_on_weekend`), the site domain\nor the call destination (`redirect`). `widget_hash` and `company` cannot be changed.\nPass the id of a widget of your company (see `GET /callback-widgets`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"activity\": false,\n    \"work_time\": {\n      \"mon\": \"10:00-19:00\",\n      \"tue\": \"10:00-19:00\",\n      \"wed\": \"10:00-19:00\",\n      \"thu\": \"10:00-19:00\",\n      \"fri\": \"10:00-19:00\",\n      \"sat\": \"10:00-15:00\"\n    },\n    \"hide_on_weekend\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id."
                        }
                      ]
                    },
                    "description": "Updates the fields of a callback widget (Strapi envelope `{ \"data\": {...} }`, only the passed fields change).\nUse it to turn the widget on/off (`activity`), change the schedule (`work_time`, `hide_on_weekend`), the site domain\nor the call destination (`redirect`). `widget_hash` and `company` cannot be changed.\nPass the id of a widget of your company (see `GET /callback-widgets`).\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"activity\": false,\n    \"work_time\": {\n      \"mon\": \"10:00-19:00\",\n      \"tue\": \"10:00-19:00\",\n      \"wed\": \"10:00-19:00\",\n      \"thu\": \"10:00-19:00\",\n      \"fri\": \"10:00-19:00\",\n      \"sat\": \"10:00-15:00\"\n    },\n    \"hide_on_weekend\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete callback widget",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widgets/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widgets",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "15",
                      "description": "Callback widget id."
                    }
                  ]
                },
                "description": "Deletes a callback widget permanently together with its design, activity settings, all its tickets and call\nstatistics records. The monthly subscription for the widget (if it was a paid one) is revoked. The embed code\non the site stops working. This cannot be undone.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the widget, its design, activity, tickets and statistics; revokes the widget subscription."
              },
              "response": [
                {
                  "name": "200 Deleted widget.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id."
                        }
                      ]
                    },
                    "description": "Deletes a callback widget permanently together with its design, activity settings, all its tickets and call\nstatistics records. The monthly subscription for the widget (if it was a paid one) is revoked. The embed code\non the site stops working. This cannot be undone.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the widget, its design, activity, tickets and statistics; revokes the widget subscription."
                  },
                  "status": "Deleted widget.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 15,\n    \"attributes\": {\n      \"sitename\": \"example.com\",\n      \"activity\": false,\n      \"widget_name\": \"Main site\",\n      \"work_time\": {\n        \"mon\": \"09:00-18:00\"\n      },\n      \"active_on_exit\": true,\n      \"hide_on_weekend\": false,\n      \"widget_hash\": \"5c5822c3-0356-4230-b855-0879ff937e3d\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T12:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id."
                        }
                      ]
                    },
                    "description": "Deletes a callback widget permanently together with its design, activity settings, all its tickets and call\nstatistics records. The monthly subscription for the widget (if it was a paid one) is revoked. The embed code\non the site stops working. This cannot be undone.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the widget, its design, activity, tickets and statistics; revokes the widget subscription."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id."
                        }
                      ]
                    },
                    "description": "Deletes a callback widget permanently together with its design, activity settings, all its tickets and call\nstatistics records. The monthly subscription for the widget (if it was a paid one) is revoked. The embed code\non the site stops working. This cannot be undone.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the widget, its design, activity, tickets and statistics; revokes the widget subscription."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id."
                        }
                      ]
                    },
                    "description": "Deletes a callback widget permanently together with its design, activity settings, all its tickets and call\nstatistics records. The monthly subscription for the widget (if it was a paid one) is revoked. The embed code\non the site stops working. This cannot be undone.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the widget, its design, activity, tickets and statistics; revokes the widget subscription."
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get callback widget by id",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widgets/byId/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widgets",
                    "byId",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "15",
                      "description": "Callback widget id."
                    }
                  ]
                },
                "description": "Returns one callback widget by its numeric id. Supports `populate`, e.g.\n`populate[redirect][populate]=*&populate[callback_widget_design][populate]=*&populate[callback_widget_activity]=true`.\n(The plain `GET /callback-widgets/{id}` route is reserved for the widget script and looks the widget up by `widget_hash`.)\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Callback widget. If the id does not exist, `data` is `null`.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/byId/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        "byId",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id."
                        }
                      ]
                    },
                    "description": "Returns one callback widget by its numeric id. Supports `populate`, e.g.\n`populate[redirect][populate]=*&populate[callback_widget_design][populate]=*&populate[callback_widget_activity]=true`.\n(The plain `GET /callback-widgets/{id}` route is reserved for the widget script and looks the widget up by `widget_hash`.)\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Callback widget. If the id does not exist, `data` is `null`.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 15,\n    \"attributes\": {\n      \"sitename\": \"example.com\",\n      \"activity\": true,\n      \"widget_name\": \"Main site\",\n      \"work_time\": {\n        \"mon\": \"09:00-18:00\",\n        \"tue\": \"09:00-18:00\",\n        \"wed\": \"09:00-18:00\",\n        \"thu\": \"09:00-18:00\",\n        \"fri\": \"09:00-18:00\"\n      },\n      \"active_on_exit\": true,\n      \"hide_on_weekend\": false,\n      \"widget_hash\": \"5c5822c3-0356-4230-b855-0879ff937e3d\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T12:00:00.000Z\",\n      \"redirect\": {\n        \"id\": 3,\n        \"call_end\": null,\n        \"extension\": null,\n        \"user\": {\n          \"data\": {\n            \"id\": 7,\n            \"attributes\": {\n              \"username\": \"+380441234567\",\n              \"email\": \"john.doe@example.com\",\n              \"firstName\": \"John\",\n              \"lastName\": \"Doe\"\n            }\n          }\n        },\n        \"group\": {\n          \"data\": null\n        },\n        \"ivr\": {\n          \"data\": null\n        }\n      },\n      \"callback_widget_design\": {\n        \"data\": {\n          \"id\": 29,\n          \"attributes\": {\n            \"button\": \"default\",\n            \"button_size\": \"medium\",\n            \"button_animation\": true,\n            \"button_color\": \"#3538CD\",\n            \"block_color\": \"#F2F2F2\"\n          }\n        }\n      },\n      \"callback_widget_activity\": {\n        \"data\": {\n          \"id\": 29,\n          \"attributes\": {\n            \"countdown\": 30,\n            \"after_open\": 5,\n            \"limit\": 3\n          }\n        }\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/byId/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        "byId",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id."
                        }
                      ]
                    },
                    "description": "Returns one callback widget by its numeric id. Supports `populate`, e.g.\n`populate[redirect][populate]=*&populate[callback_widget_design][populate]=*&populate[callback_widget_activity]=true`.\n(The plain `GET /callback-widgets/{id}` route is reserved for the widget script and looks the widget up by `widget_hash`.)\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/byId/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        "byId",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id."
                        }
                      ]
                    },
                    "description": "Returns one callback widget by its numeric id. Supports `populate`, e.g.\n`populate[redirect][populate]=*&populate[callback_widget_design][populate]=*&populate[callback_widget_activity]=true`.\n(The plain `GET /callback-widgets/{id}` route is reserved for the widget script and looks the widget up by `widget_hash`.)\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "First-time callers of a widget for a period",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widgets/firstTimeOrder/:id?from=2026-01-01&to=2026-02-01",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widgets",
                    "firstTimeOrder",
                    ":id"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "2026-01-01",
                      "description": "Period start (inclusive), ISO date or date-time.",
                      "disabled": false
                    },
                    {
                      "key": "to",
                      "value": "2026-02-01",
                      "description": "Period end (inclusive), ISO date or date-time.",
                      "disabled": false
                    }
                  ],
                  "variable": [
                    {
                      "key": "id",
                      "value": "15",
                      "description": "Callback widget id."
                    }
                  ]
                },
                "description": "Report for a callback widget: unique phone numbers that left tickets in the period `from`–`to`, with the date\nof the first ticket of each number in that period. Use it to count new leads from the widget.\nBoth `from` and `to` are required (dates/timestamps understood by the database, e.g. `2026-01-01` or\n`2026-01-01T00:00:00.000Z`); without them the request fails with 500.\nThe response is a plain array (no Strapi `data`/`meta` envelope).\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Unique numbers with the date of their first ticket in the period.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/firstTimeOrder/:id?from=2026-01-01&to=2026-02-01",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        "firstTimeOrder",
                        ":id"
                      ],
                      "query": [
                        {
                          "key": "from",
                          "value": "2026-01-01",
                          "description": "Period start (inclusive), ISO date or date-time.",
                          "disabled": false
                        },
                        {
                          "key": "to",
                          "value": "2026-02-01",
                          "description": "Period end (inclusive), ISO date or date-time.",
                          "disabled": false
                        }
                      ],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id."
                        }
                      ]
                    },
                    "description": "Report for a callback widget: unique phone numbers that left tickets in the period `from`–`to`, with the date\nof the first ticket of each number in that period. Use it to count new leads from the widget.\nBoth `from` and `to` are required (dates/timestamps understood by the database, e.g. `2026-01-01` or\n`2026-01-01T00:00:00.000Z`); without them the request fails with 500.\nThe response is a plain array (no Strapi `data`/`meta` envelope).\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Unique numbers with the date of their first ticket in the period.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "[\n  {\n    \"contact_number\": \"+380441234567\",\n    \"first_created_at\": \"2026-01-05T09:12:48.546Z\"\n  },\n  {\n    \"contact_number\": \"+15551234567\",\n    \"first_created_at\": \"2026-01-20T14:10:00.673Z\"\n  }\n]"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/firstTimeOrder/:id?from=2026-01-01&to=2026-02-01",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        "firstTimeOrder",
                        ":id"
                      ],
                      "query": [
                        {
                          "key": "from",
                          "value": "2026-01-01",
                          "description": "Period start (inclusive), ISO date or date-time.",
                          "disabled": false
                        },
                        {
                          "key": "to",
                          "value": "2026-02-01",
                          "description": "Period end (inclusive), ISO date or date-time.",
                          "disabled": false
                        }
                      ],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id."
                        }
                      ]
                    },
                    "description": "Report for a callback widget: unique phone numbers that left tickets in the period `from`–`to`, with the date\nof the first ticket of each number in that period. Use it to count new leads from the widget.\nBoth `from` and `to` are required (dates/timestamps understood by the database, e.g. `2026-01-01` or\n`2026-01-01T00:00:00.000Z`); without them the request fails with 500.\nThe response is a plain array (no Strapi `data`/`meta` envelope).\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/firstTimeOrder/:id?from=2026-01-01&to=2026-02-01",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        "firstTimeOrder",
                        ":id"
                      ],
                      "query": [
                        {
                          "key": "from",
                          "value": "2026-01-01",
                          "description": "Period start (inclusive), ISO date or date-time.",
                          "disabled": false
                        },
                        {
                          "key": "to",
                          "value": "2026-02-01",
                          "description": "Period end (inclusive), ISO date or date-time.",
                          "disabled": false
                        }
                      ],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id."
                        }
                      ]
                    },
                    "description": "Report for a callback widget: unique phone numbers that left tickets in the period `from`–`to`, with the date\nof the first ticket of each number in that period. Use it to count new leads from the widget.\nBoth `from` and `to` are required (dates/timestamps understood by the database, e.g. `2026-01-01` or\n`2026-01-01T00:00:00.000Z`); without them the request fails with 500.\nThe response is a plain array (no Strapi `data`/`meta` envelope).\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 `from`/`to` missing or not a valid date.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/firstTimeOrder/:id?from=2026-01-01&to=2026-02-01",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        "firstTimeOrder",
                        ":id"
                      ],
                      "query": [
                        {
                          "key": "from",
                          "value": "2026-01-01",
                          "description": "Period start (inclusive), ISO date or date-time.",
                          "disabled": false
                        },
                        {
                          "key": "to",
                          "value": "2026-02-01",
                          "description": "Period end (inclusive), ISO date or date-time.",
                          "disabled": false
                        }
                      ],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "Callback widget id."
                        }
                      ]
                    },
                    "description": "Report for a callback widget: unique phone numbers that left tickets in the period `from`–`to`, with the date\nof the first ticket of each number in that period. Use it to count new leads from the widget.\nBoth `from` and `to` are required (dates/timestamps understood by the database, e.g. `2026-01-01` or\n`2026-01-01T00:00:00.000Z`); without them the request fails with 500.\nThe response is a plain array (no Strapi `data`/`meta` envelope).\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "`from`/`to` missing or not a valid date.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Embed code of a callback widget",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widgets/getCode/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widgets",
                    "getCode",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "5c5822c3-0356-4230-b855-0879ff937e3d",
                      "description": "Widget `widget_hash` (UUID)."
                    }
                  ]
                },
                "description": "Returns the HTML/JS snippet to paste into your website before `</body>`. The snippet loads the widget script\nand styles from the OneVOIPlanet widget CDN and renders the widget into `<div id='app-onevoip-widgets'></div>`.\n`{id}` is the widget `widget_hash` (UUID from the widget attributes), not the numeric id. The value is not\nvalidated: the snippet is generated for any string, so copy `widget_hash` exactly.\nThe response is `text/html`, not JSON.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/getCode/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        "getCode",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5c5822c3-0356-4230-b855-0879ff937e3d",
                          "description": "Widget `widget_hash` (UUID)."
                        }
                      ]
                    },
                    "description": "Returns the HTML/JS snippet to paste into your website before `</body>`. The snippet loads the widget script\nand styles from the OneVOIPlanet widget CDN and renders the widget into `<div id='app-onevoip-widgets'></div>`.\n`{id}` is the widget `widget_hash` (UUID from the widget attributes), not the numeric id. The value is not\nvalidated: the snippet is generated for any string, so copy `widget_hash` exactly.\nThe response is `text/html`, not JSON.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widgets/getCode/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widgets",
                        "getCode",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "5c5822c3-0356-4230-b855-0879ff937e3d",
                          "description": "Widget `widget_hash` (UUID)."
                        }
                      ]
                    },
                    "description": "Returns the HTML/JS snippet to paste into your website before `</body>`. The snippet loads the widget script\nand styles from the OneVOIPlanet widget CDN and renders the widget into `<div id='app-onevoip-widgets'></div>`.\n`{id}` is the widget `widget_hash` (UUID from the widget attributes), not the numeric id. The value is not\nvalidated: the snippet is generated for any string, so copy `widget_hash` exactly.\nThe response is `text/html`, not JSON.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "List callback tickets",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widget-tickets",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widget-tickets"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns callback tickets (requests left by site visitors). Always filter by your widget:\n`filters[callback_widget][id][$eq]=15` (or `filters[callback_widget][company][id][$eq]=<companyId>`), and use\n`sort=createdAt:desc`. Useful filters: `filters[ticket_status][$eq]=queued`, `filters[isFirstTime][$eq]=true`,\n`filters[createdAt][$gte]=2026-01-01`. `populate=callback_widget` adds the widget, `populate=statistics` the call\nlegs of the callback (see Calls & Statistics).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of tickets.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns callback tickets (requests left by site visitors). Always filter by your widget:\n`filters[callback_widget][id][$eq]=15` (or `filters[callback_widget][company][id][$eq]=<companyId>`), and use\n`sort=createdAt:desc`. Useful filters: `filters[ticket_status][$eq]=queued`, `filters[isFirstTime][$eq]=true`,\n`filters[createdAt][$gte]=2026-01-01`. `populate=callback_widget` adds the widget, `populate=statistics` the call\nlegs of the callback (see Calls & Statistics).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Page of tickets.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 101,\n      \"attributes\": {\n        \"contact_number\": \"+380441234567\",\n        \"when_call_time\": \"2026-01-20T14:10:00.000Z\",\n        \"ticket_status\": \"call_success\",\n        \"action_id\": \"1737000000\",\n        \"isFirstTime\": true,\n        \"domain\": \"https://example.com/pricing\",\n        \"ip\": \"203.0.113.10\",\n        \"createdAt\": \"2026-01-20T14:10:00.673Z\",\n        \"updatedAt\": \"2026-01-20T14:15:19.138Z\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns callback tickets (requests left by site visitors). Always filter by your widget:\n`filters[callback_widget][id][$eq]=15` (or `filters[callback_widget][company][id][$eq]=<companyId>`), and use\n`sort=createdAt:desc`. Useful filters: `filters[ticket_status][$eq]=queued`, `filters[isFirstTime][$eq]=true`,\n`filters[createdAt][$gte]=2026-01-01`. `populate=callback_widget` adds the widget, `populate=statistics` the call\nlegs of the callback (see Calls & Statistics).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns callback tickets (requests left by site visitors). Always filter by your widget:\n`filters[callback_widget][id][$eq]=15` (or `filters[callback_widget][company][id][$eq]=<companyId>`), and use\n`sort=createdAt:desc`. Useful filters: `filters[ticket_status][$eq]=queued`, `filters[isFirstTime][$eq]=true`,\n`filters[createdAt][$gte]=2026-01-01`. `populate=callback_widget` adds the widget, `populate=statistics` the call\nlegs of the callback (see Calls & Statistics).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Create callback ticket (public, triggers the callback)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widget-tickets",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widget-tickets"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Public method called by the widget script on your website when a visitor asks to be called back. No token is\nrequired. Creating a ticket starts the callback: the platform queues a call from the widget's employee/group to\n`contact_number` at `when_call_time` (immediately if omitted or in the past) and sends an in-app/push\nnotification about the new request to the responsible employee(s).\n\nChecks performed, in order:\n* `data.callback_widget` is required (400 `Callback_widget must be defined`);\n* per-IP limit: the number of tickets with status `queued` from the same IP for this widget must be below\n  `limit` of the widget activity settings (400 `IP limit!`);\n* the `Origin` header domain must equal the widget `sitename` (400 ``Your sitename isn`t match the URL domain!``);\n  the browser sends `Origin` automatically; without the header the request fails with 500;\n* if the number is in the company's contacts with `allowlist`/`global_allowlist` set (blocked), 403\n  `Your phone is on the black list`.\n`ticket_status`, `action_id` and `statistic` in the body are ignored; `ip` is taken from the request; `isFirstTime`\nis set to `true` when this number has never left a ticket for this widget. Rate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Public, Company owner (approved), Supervisor\n\n**Side effects:** Initiates a callback call from the company number/SIP line (employee or group of the widget) to the visitor at `when_call_time`; the call is charged by the company tariff. Sends notifications to the responsible employee(s).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"callback_widget\": 15,\n    \"contact_number\": \"+380441234567\",\n    \"when_call_time\": \"2026-01-20T14:10:00.000Z\",\n    \"domain\": \"https://example.com/pricing\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created ticket (status `queued`).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Public method called by the widget script on your website when a visitor asks to be called back. No token is\nrequired. Creating a ticket starts the callback: the platform queues a call from the widget's employee/group to\n`contact_number` at `when_call_time` (immediately if omitted or in the past) and sends an in-app/push\nnotification about the new request to the responsible employee(s).\n\nChecks performed, in order:\n* `data.callback_widget` is required (400 `Callback_widget must be defined`);\n* per-IP limit: the number of tickets with status `queued` from the same IP for this widget must be below\n  `limit` of the widget activity settings (400 `IP limit!`);\n* the `Origin` header domain must equal the widget `sitename` (400 ``Your sitename isn`t match the URL domain!``);\n  the browser sends `Origin` automatically; without the header the request fails with 500;\n* if the number is in the company's contacts with `allowlist`/`global_allowlist` set (blocked), 403\n  `Your phone is on the black list`.\n`ticket_status`, `action_id` and `statistic` in the body are ignored; `ip` is taken from the request; `isFirstTime`\nis set to `true` when this number has never left a ticket for this widget. Rate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Public, Company owner (approved), Supervisor\n\n**Side effects:** Initiates a callback call from the company number/SIP line (employee or group of the widget) to the visitor at `when_call_time`; the call is charged by the company tariff. Sends notifications to the responsible employee(s).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"callback_widget\": 15,\n    \"contact_number\": \"+380441234567\",\n    \"when_call_time\": \"2026-01-20T14:10:00.000Z\",\n    \"domain\": \"https://example.com/pricing\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created ticket (status `queued`).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 101,\n    \"attributes\": {\n      \"contact_number\": \"+380441234567\",\n      \"when_call_time\": \"2026-01-20T14:10:00.000Z\",\n      \"ticket_status\": \"queued\",\n      \"action_id\": \"1737000000\",\n      \"isFirstTime\": true,\n      \"domain\": \"https://example.com/pricing\",\n      \"ip\": \"203.0.113.10\",\n      \"createdAt\": \"2026-01-20T14:10:00.673Z\",\n      \"updatedAt\": \"2026-01-20T14:10:00.673Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error: `Callback_widget must be defined`, `IP limit!`, ``Your sitename isn`t match the URL domain!``, or `contact_number` missing/too short (`contact_number must be at least 9 characters`).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Public method called by the widget script on your website when a visitor asks to be called back. No token is\nrequired. Creating a ticket starts the callback: the platform queues a call from the widget's employee/group to\n`contact_number` at `when_call_time` (immediately if omitted or in the past) and sends an in-app/push\nnotification about the new request to the responsible employee(s).\n\nChecks performed, in order:\n* `data.callback_widget` is required (400 `Callback_widget must be defined`);\n* per-IP limit: the number of tickets with status `queued` from the same IP for this widget must be below\n  `limit` of the widget activity settings (400 `IP limit!`);\n* the `Origin` header domain must equal the widget `sitename` (400 ``Your sitename isn`t match the URL domain!``);\n  the browser sends `Origin` automatically; without the header the request fails with 500;\n* if the number is in the company's contacts with `allowlist`/`global_allowlist` set (blocked), 403\n  `Your phone is on the black list`.\n`ticket_status`, `action_id` and `statistic` in the body are ignored; `ip` is taken from the request; `isFirstTime`\nis set to `true` when this number has never left a ticket for this widget. Rate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Public, Company owner (approved), Supervisor\n\n**Side effects:** Initiates a callback call from the company number/SIP line (employee or group of the widget) to the visitor at `when_call_time`; the call is charged by the company tariff. Sends notifications to the responsible employee(s).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"callback_widget\": 15,\n    \"contact_number\": \"+380441234567\",\n    \"when_call_time\": \"2026-01-20T14:10:00.000Z\",\n    \"domain\": \"https://example.com/pricing\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error: `Callback_widget must be defined`, `IP limit!`, ``Your sitename isn`t match the URL domain!``, or `contact_number` missing/too short (`contact_number must be at least 9 characters`).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"IP limit!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The phone number is blocked in the company contacts.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Public method called by the widget script on your website when a visitor asks to be called back. No token is\nrequired. Creating a ticket starts the callback: the platform queues a call from the widget's employee/group to\n`contact_number` at `when_call_time` (immediately if omitted or in the past) and sends an in-app/push\nnotification about the new request to the responsible employee(s).\n\nChecks performed, in order:\n* `data.callback_widget` is required (400 `Callback_widget must be defined`);\n* per-IP limit: the number of tickets with status `queued` from the same IP for this widget must be below\n  `limit` of the widget activity settings (400 `IP limit!`);\n* the `Origin` header domain must equal the widget `sitename` (400 ``Your sitename isn`t match the URL domain!``);\n  the browser sends `Origin` automatically; without the header the request fails with 500;\n* if the number is in the company's contacts with `allowlist`/`global_allowlist` set (blocked), 403\n  `Your phone is on the black list`.\n`ticket_status`, `action_id` and `statistic` in the body are ignored; `ip` is taken from the request; `isFirstTime`\nis set to `true` when this number has never left a ticket for this widget. Rate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Public, Company owner (approved), Supervisor\n\n**Side effects:** Initiates a callback call from the company number/SIP line (employee or group of the widget) to the visitor at `when_call_time`; the call is charged by the company tariff. Sends notifications to the responsible employee(s).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"callback_widget\": 15,\n    \"contact_number\": \"+380441234567\",\n    \"when_call_time\": \"2026-01-20T14:10:00.000Z\",\n    \"domain\": \"https://example.com/pricing\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The phone number is blocked in the company contacts.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Your phone is on the black list\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Public method called by the widget script on your website when a visitor asks to be called back. No token is\nrequired. Creating a ticket starts the callback: the platform queues a call from the widget's employee/group to\n`contact_number` at `when_call_time` (immediately if omitted or in the past) and sends an in-app/push\nnotification about the new request to the responsible employee(s).\n\nChecks performed, in order:\n* `data.callback_widget` is required (400 `Callback_widget must be defined`);\n* per-IP limit: the number of tickets with status `queued` from the same IP for this widget must be below\n  `limit` of the widget activity settings (400 `IP limit!`);\n* the `Origin` header domain must equal the widget `sitename` (400 ``Your sitename isn`t match the URL domain!``);\n  the browser sends `Origin` automatically; without the header the request fails with 500;\n* if the number is in the company's contacts with `allowlist`/`global_allowlist` set (blocked), 403\n  `Your phone is on the black list`.\n`ticket_status`, `action_id` and `statistic` in the body are ignored; `ip` is taken from the request; `isFirstTime`\nis set to `true` when this number has never left a ticket for this widget. Rate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Public, Company owner (approved), Supervisor\n\n**Side effects:** Initiates a callback call from the company number/SIP line (employee or group of the widget) to the visitor at `when_call_time`; the call is charged by the company tariff. Sends notifications to the responsible employee(s).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"callback_widget\": 15,\n    \"contact_number\": \"+380441234567\",\n    \"when_call_time\": \"2026-01-20T14:10:00.000Z\",\n    \"domain\": \"https://example.com/pricing\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 `Origin` header missing, or widget `callback_widget` not found / has no activity settings.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Public method called by the widget script on your website when a visitor asks to be called back. No token is\nrequired. Creating a ticket starts the callback: the platform queues a call from the widget's employee/group to\n`contact_number` at `when_call_time` (immediately if omitted or in the past) and sends an in-app/push\nnotification about the new request to the responsible employee(s).\n\nChecks performed, in order:\n* `data.callback_widget` is required (400 `Callback_widget must be defined`);\n* per-IP limit: the number of tickets with status `queued` from the same IP for this widget must be below\n  `limit` of the widget activity settings (400 `IP limit!`);\n* the `Origin` header domain must equal the widget `sitename` (400 ``Your sitename isn`t match the URL domain!``);\n  the browser sends `Origin` automatically; without the header the request fails with 500;\n* if the number is in the company's contacts with `allowlist`/`global_allowlist` set (blocked), 403\n  `Your phone is on the black list`.\n`ticket_status`, `action_id` and `statistic` in the body are ignored; `ip` is taken from the request; `isFirstTime`\nis set to `true` when this number has never left a ticket for this widget. Rate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Public, Company owner (approved), Supervisor\n\n**Side effects:** Initiates a callback call from the company number/SIP line (employee or group of the widget) to the visitor at `when_call_time`; the call is charged by the company tariff. Sends notifications to the responsible employee(s).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"callback_widget\": 15,\n    \"contact_number\": \"+380441234567\",\n    \"when_call_time\": \"2026-01-20T14:10:00.000Z\",\n    \"domain\": \"https://example.com/pricing\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`Origin` header missing, or widget `callback_widget` not found / has no activity settings.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Recalculate ticket status from call result",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widget-tickets/status",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widget-tickets",
                    "status"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Service method of the callback engine: recomputes `ticket_status` of a ticket from its latest call statistics\nrecord (the last call leg) and saves it. Normally the telephony backend calls it when the callback ends; call it\nyourself only to refresh a status that looks stale.\nRules: leg to the visitor (`rightLeg`) answered (SIP 200 / `Ok` / `Normal call clearing`) → `call_success`;\n`487 Request Terminated` → `canceled`; other `rightLeg` result → `call_success_left` (employee answered, visitor\nnot reached); leg to the employee (`leftLeg`) failed → `call_unsuccess`; otherwise `calling`.\nReturns the updated ticket as a flat object (no `data`/`attributes` envelope). Rate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Updates `ticket_status` of the ticket.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"id\": 101\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated ticket (flat object).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/status",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        "status"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Service method of the callback engine: recomputes `ticket_status` of a ticket from its latest call statistics\nrecord (the last call leg) and saves it. Normally the telephony backend calls it when the callback ends; call it\nyourself only to refresh a status that looks stale.\nRules: leg to the visitor (`rightLeg`) answered (SIP 200 / `Ok` / `Normal call clearing`) → `call_success`;\n`487 Request Terminated` → `canceled`; other `rightLeg` result → `call_success_left` (employee answered, visitor\nnot reached); leg to the employee (`leftLeg`) failed → `call_unsuccess`; otherwise `calling`.\nReturns the updated ticket as a flat object (no `data`/`attributes` envelope). Rate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Updates `ticket_status` of the ticket.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"id\": 101\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated ticket (flat object).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 101,\n  \"contact_number\": \"+380441234567\",\n  \"when_call_time\": \"2026-01-20T14:10:00.000Z\",\n  \"ticket_status\": \"call_success\",\n  \"action_id\": \"1737000000\",\n  \"isFirstTime\": true,\n  \"domain\": \"https://example.com/pricing\",\n  \"ip\": \"203.0.113.10\",\n  \"createdAt\": \"2026-01-20T14:10:00.673Z\",\n  \"updatedAt\": \"2026-01-20T14:15:19.138Z\"\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/status",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        "status"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Service method of the callback engine: recomputes `ticket_status` of a ticket from its latest call statistics\nrecord (the last call leg) and saves it. Normally the telephony backend calls it when the callback ends; call it\nyourself only to refresh a status that looks stale.\nRules: leg to the visitor (`rightLeg`) answered (SIP 200 / `Ok` / `Normal call clearing`) → `call_success`;\n`487 Request Terminated` → `canceled`; other `rightLeg` result → `call_success_left` (employee answered, visitor\nnot reached); leg to the employee (`leftLeg`) failed → `call_unsuccess`; otherwise `calling`.\nReturns the updated ticket as a flat object (no `data`/`attributes` envelope). Rate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Updates `ticket_status` of the ticket.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"id\": 101\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/status",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        "status"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Service method of the callback engine: recomputes `ticket_status` of a ticket from its latest call statistics\nrecord (the last call leg) and saves it. Normally the telephony backend calls it when the callback ends; call it\nyourself only to refresh a status that looks stale.\nRules: leg to the visitor (`rightLeg`) answered (SIP 200 / `Ok` / `Normal call clearing`) → `call_success`;\n`487 Request Terminated` → `canceled`; other `rightLeg` result → `call_success_left` (employee answered, visitor\nnot reached); leg to the employee (`leftLeg`) failed → `call_unsuccess`; otherwise `calling`.\nReturns the updated ticket as a flat object (no `data`/`attributes` envelope). Rate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Updates `ticket_status` of the ticket.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"id\": 101\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "429 Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/status",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        "status"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Service method of the callback engine: recomputes `ticket_status` of a ticket from its latest call statistics\nrecord (the last call leg) and saves it. Normally the telephony backend calls it when the callback ends; call it\nyourself only to refresh a status that looks stale.\nRules: leg to the visitor (`rightLeg`) answered (SIP 200 / `Ok` / `Normal call clearing`) → `call_success`;\n`487 Request Terminated` → `canceled`; other `rightLeg` result → `call_success_left` (employee answered, visitor\nnot reached); leg to the employee (`leftLeg`) failed → `call_unsuccess`; otherwise `calling`.\nReturns the updated ticket as a flat object (no `data`/`attributes` envelope). Rate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Updates `ticket_status` of the ticket.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"id\": 101\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Rate limit exceeded. Retry after the `Retry-After` header value (seconds).",
                  "code": 429,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 429,\n    \"name\": \"RateLimitError\",\n    \"message\": \"Too many requests, please try again later.\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Ticket not found or it has no call statistics yet.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/status",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        "status"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Service method of the callback engine: recomputes `ticket_status` of a ticket from its latest call statistics\nrecord (the last call leg) and saves it. Normally the telephony backend calls it when the callback ends; call it\nyourself only to refresh a status that looks stale.\nRules: leg to the visitor (`rightLeg`) answered (SIP 200 / `Ok` / `Normal call clearing`) → `call_success`;\n`487 Request Terminated` → `canceled`; other `rightLeg` result → `call_success_left` (employee answered, visitor\nnot reached); leg to the employee (`leftLeg`) failed → `call_unsuccess`; otherwise `calling`.\nReturns the updated ticket as a flat object (no `data`/`attributes` envelope). Rate limit: 20 requests per 5 minutes per IP.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Updates `ticket_status` of the ticket.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"id\": 101\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Ticket not found or it has no call statistics yet.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get callback ticket",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widget-tickets/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widget-tickets",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "101",
                      "description": "Ticket id."
                    }
                  ]
                },
                "description": "Returns one ticket by id. `populate=callback_widget` adds the widget, `populate=statistics` the call legs.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Ticket.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Ticket id."
                        }
                      ]
                    },
                    "description": "Returns one ticket by id. `populate=callback_widget` adds the widget, `populate=statistics` the call legs.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Ticket.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 101,\n    \"attributes\": {\n      \"contact_number\": \"+380441234567\",\n      \"when_call_time\": \"2026-01-20T14:10:00.000Z\",\n      \"ticket_status\": \"call_success\",\n      \"action_id\": \"1737000000\",\n      \"isFirstTime\": true,\n      \"domain\": \"https://example.com/pricing\",\n      \"ip\": \"203.0.113.10\",\n      \"createdAt\": \"2026-01-20T14:10:00.673Z\",\n      \"updatedAt\": \"2026-01-20T14:15:19.138Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Ticket id."
                        }
                      ]
                    },
                    "description": "Returns one ticket by id. `populate=callback_widget` adds the widget, `populate=statistics` the call legs.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Ticket id."
                        }
                      ]
                    },
                    "description": "Returns one ticket by id. `populate=callback_widget` adds the widget, `populate=statistics` the call legs.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Ticket id."
                        }
                      ]
                    },
                    "description": "Returns one ticket by id. `populate=callback_widget` adds the widget, `populate=statistics` the call legs.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update callback ticket",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widget-tickets/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widget-tickets",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "101",
                      "description": "Ticket id."
                    }
                  ]
                },
                "description": "Updates ticket fields (Strapi envelope). Typical use: cancel a queued request (`ticket_status: canceled`) or\ncorrect `when_call_time`/`contact_number`. Note: changing `when_call_time` does not reschedule a call that is\nalready queued.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"ticket_status\": \"canceled\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated ticket.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Ticket id."
                        }
                      ]
                    },
                    "description": "Updates ticket fields (Strapi envelope). Typical use: cancel a queued request (`ticket_status: canceled`) or\ncorrect `when_call_time`/`contact_number`. Note: changing `when_call_time` does not reschedule a call that is\nalready queued.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"ticket_status\": \"canceled\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated ticket.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 101,\n    \"attributes\": {\n      \"contact_number\": \"+380441234567\",\n      \"when_call_time\": \"2026-01-20T14:10:00.000Z\",\n      \"ticket_status\": \"canceled\",\n      \"action_id\": \"1737000000\",\n      \"isFirstTime\": true,\n      \"domain\": \"https://example.com/pricing\",\n      \"ip\": \"203.0.113.10\",\n      \"createdAt\": \"2026-01-20T14:10:00.673Z\",\n      \"updatedAt\": \"2026-01-20T14:20:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error or malformed request.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Ticket id."
                        }
                      ]
                    },
                    "description": "Updates ticket fields (Strapi envelope). Typical use: cancel a queued request (`ticket_status: canceled`) or\ncorrect `when_call_time`/`contact_number`. Note: changing `when_call_time` does not reschedule a call that is\nalready queued.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"ticket_status\": \"canceled\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error or malformed request.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"email must be a valid email\",\n    \"details\": {\n      \"errors\": [\n        {\n          \"path\": [\n            \"email\"\n          ],\n          \"message\": \"email must be a valid email\",\n          \"name\": \"ValidationError\"\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Ticket id."
                        }
                      ]
                    },
                    "description": "Updates ticket fields (Strapi envelope). Typical use: cancel a queued request (`ticket_status: canceled`) or\ncorrect `when_call_time`/`contact_number`. Note: changing `when_call_time` does not reschedule a call that is\nalready queued.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"ticket_status\": \"canceled\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Ticket id."
                        }
                      ]
                    },
                    "description": "Updates ticket fields (Strapi envelope). Typical use: cancel a queued request (`ticket_status: canceled`) or\ncorrect `when_call_time`/`contact_number`. Note: changing `when_call_time` does not reschedule a call that is\nalready queued.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"ticket_status\": \"canceled\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Ticket id."
                        }
                      ]
                    },
                    "description": "Updates ticket fields (Strapi envelope). Typical use: cancel a queued request (`ticket_status: canceled`) or\ncorrect `when_call_time`/`contact_number`. Note: changing `when_call_time` does not reschedule a call that is\nalready queued.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"ticket_status\": \"canceled\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete callback ticket",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widget-tickets/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widget-tickets",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "101",
                      "description": "Ticket id."
                    }
                  ]
                },
                "description": "Deletes a ticket permanently. Call statistics records linked to it are kept. Deleting a `queued` ticket does not cancel an already queued call.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the ticket."
              },
              "response": [
                {
                  "name": "200 Deleted ticket.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Ticket id."
                        }
                      ]
                    },
                    "description": "Deletes a ticket permanently. Call statistics records linked to it are kept. Deleting a `queued` ticket does not cancel an already queued call.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the ticket."
                  },
                  "status": "Deleted ticket.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 101,\n    \"attributes\": {\n      \"contact_number\": \"+380441234567\",\n      \"when_call_time\": \"2026-01-20T14:10:00.000Z\",\n      \"ticket_status\": \"canceled\",\n      \"action_id\": \"1737000000\",\n      \"isFirstTime\": true,\n      \"domain\": \"https://example.com/pricing\",\n      \"ip\": \"203.0.113.10\",\n      \"createdAt\": \"2026-01-20T14:10:00.673Z\",\n      \"updatedAt\": \"2026-01-20T14:20:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Ticket id."
                        }
                      ]
                    },
                    "description": "Deletes a ticket permanently. Call statistics records linked to it are kept. Deleting a `queued` ticket does not cancel an already queued call.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the ticket."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Ticket id."
                        }
                      ]
                    },
                    "description": "Deletes a ticket permanently. Call statistics records linked to it are kept. Deleting a `queued` ticket does not cancel an already queued call.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the ticket."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-tickets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-tickets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Ticket id."
                        }
                      ]
                    },
                    "description": "Deletes a ticket permanently. Call statistics records linked to it are kept. Deleting a `queued` ticket does not cancel an already queued call.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the ticket."
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "List widget activity settings",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widget-activities",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widget-activities"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns activity (behaviour) settings of callback widgets: countdown before the call, auto-open delay and the\nper-IP request limit. One record belongs to one widget. Filter by widget: `filters[callback_widget][id][$eq]=15`;\n`populate=callback_widget` adds the widget.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of activity settings.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns activity (behaviour) settings of callback widgets: countdown before the call, auto-open delay and the\nper-IP request limit. One record belongs to one widget. Filter by widget: `filters[callback_widget][id][$eq]=15`;\n`populate=callback_widget` adds the widget.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Page of activity settings.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 29,\n      \"attributes\": {\n        \"countdown\": 30,\n        \"after_open\": 5,\n        \"limit\": 3,\n        \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n        \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns activity (behaviour) settings of callback widgets: countdown before the call, auto-open delay and the\nper-IP request limit. One record belongs to one widget. Filter by widget: `filters[callback_widget][id][$eq]=15`;\n`populate=callback_widget` adds the widget.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns activity (behaviour) settings of callback widgets: countdown before the call, auto-open delay and the\nper-IP request limit. One record belongs to one widget. Filter by widget: `filters[callback_widget][id][$eq]=15`;\n`populate=callback_widget` adds the widget.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Create widget activity settings",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widget-activities",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widget-activities"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Creates activity settings and links them to a callback widget (`callback_widget`). Each widget needs exactly one record: without it public ticket creation fails. All three numeric fields are required.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"countdown\": 30,\n    \"after_open\": 5,\n    \"limit\": 3,\n    \"callback_widget\": 15\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created settings.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates activity settings and links them to a callback widget (`callback_widget`). Each widget needs exactly one record: without it public ticket creation fails. All three numeric fields are required.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"countdown\": 30,\n    \"after_open\": 5,\n    \"limit\": 3,\n    \"callback_widget\": 15\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created settings.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 29,\n    \"attributes\": {\n      \"countdown\": 30,\n      \"after_open\": 5,\n      \"limit\": 3,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error: required field missing (`countdown must be defined.`) or value above the maximum (`countdown must be less than or equal to 300`).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates activity settings and links them to a callback widget (`callback_widget`). Each widget needs exactly one record: without it public ticket creation fails. All three numeric fields are required.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"countdown\": 30,\n    \"after_open\": 5,\n    \"limit\": 3,\n    \"callback_widget\": 15\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error: required field missing (`countdown must be defined.`) or value above the maximum (`countdown must be less than or equal to 300`).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"countdown must be defined.\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates activity settings and links them to a callback widget (`callback_widget`). Each widget needs exactly one record: without it public ticket creation fails. All three numeric fields are required.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"countdown\": 30,\n    \"after_open\": 5,\n    \"limit\": 3,\n    \"callback_widget\": 15\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates activity settings and links them to a callback widget (`callback_widget`). Each widget needs exactly one record: without it public ticket creation fails. All three numeric fields are required.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"countdown\": 30,\n    \"after_open\": 5,\n    \"limit\": 3,\n    \"callback_widget\": 15\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get widget activity settings",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widget-activities/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widget-activities",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "29",
                      "description": "Activity settings id."
                    }
                  ]
                },
                "description": "Returns one activity settings record by id. `populate=callback_widget` adds the widget.\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Activity settings.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Activity settings id."
                        }
                      ]
                    },
                    "description": "Returns one activity settings record by id. `populate=callback_widget` adds the widget.\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Activity settings.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 29,\n    \"attributes\": {\n      \"countdown\": 30,\n      \"after_open\": 5,\n      \"limit\": 3,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Activity settings id."
                        }
                      ]
                    },
                    "description": "Returns one activity settings record by id. `populate=callback_widget` adds the widget.\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Activity settings id."
                        }
                      ]
                    },
                    "description": "Returns one activity settings record by id. `populate=callback_widget` adds the widget.\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Activity settings id."
                        }
                      ]
                    },
                    "description": "Returns one activity settings record by id. `populate=callback_widget` adds the widget.\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update widget activity settings",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widget-activities/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widget-activities",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "29",
                      "description": "Activity settings id."
                    }
                  ]
                },
                "description": "Updates activity settings (Strapi envelope, only passed fields change). Changes apply to the widget on the site on its next load.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"countdown\": 25,\n    \"limit\": 5\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated settings.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Activity settings id."
                        }
                      ]
                    },
                    "description": "Updates activity settings (Strapi envelope, only passed fields change). Changes apply to the widget on the site on its next load.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"countdown\": 25,\n    \"limit\": 5\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated settings.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 29,\n    \"attributes\": {\n      \"countdown\": 25,\n      \"after_open\": 5,\n      \"limit\": 5,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T12:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error or malformed request.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Activity settings id."
                        }
                      ]
                    },
                    "description": "Updates activity settings (Strapi envelope, only passed fields change). Changes apply to the widget on the site on its next load.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"countdown\": 25,\n    \"limit\": 5\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error or malformed request.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"email must be a valid email\",\n    \"details\": {\n      \"errors\": [\n        {\n          \"path\": [\n            \"email\"\n          ],\n          \"message\": \"email must be a valid email\",\n          \"name\": \"ValidationError\"\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Activity settings id."
                        }
                      ]
                    },
                    "description": "Updates activity settings (Strapi envelope, only passed fields change). Changes apply to the widget on the site on its next load.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"countdown\": 25,\n    \"limit\": 5\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Activity settings id."
                        }
                      ]
                    },
                    "description": "Updates activity settings (Strapi envelope, only passed fields change). Changes apply to the widget on the site on its next load.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"countdown\": 25,\n    \"limit\": 5\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Activity settings id."
                        }
                      ]
                    },
                    "description": "Updates activity settings (Strapi envelope, only passed fields change). Changes apply to the widget on the site on its next load.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"countdown\": 25,\n    \"limit\": 5\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete widget activity settings",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widget-activities/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widget-activities",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "29",
                      "description": "Activity settings id."
                    }
                  ]
                },
                "description": "Deletes the activity settings record permanently. The widget is left without behaviour settings and stops accepting tickets until new settings are created.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the settings record."
              },
              "response": [
                {
                  "name": "200 Deleted settings.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Activity settings id."
                        }
                      ]
                    },
                    "description": "Deletes the activity settings record permanently. The widget is left without behaviour settings and stops accepting tickets until new settings are created.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the settings record."
                  },
                  "status": "Deleted settings.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 29,\n    \"attributes\": {\n      \"countdown\": 25,\n      \"after_open\": 5,\n      \"limit\": 5,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T12:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Activity settings id."
                        }
                      ]
                    },
                    "description": "Deletes the activity settings record permanently. The widget is left without behaviour settings and stops accepting tickets until new settings are created.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the settings record."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Activity settings id."
                        }
                      ]
                    },
                    "description": "Deletes the activity settings record permanently. The widget is left without behaviour settings and stops accepting tickets until new settings are created.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the settings record."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-activities/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-activities",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Activity settings id."
                        }
                      ]
                    },
                    "description": "Deletes the activity settings record permanently. The widget is left without behaviour settings and stops accepting tickets until new settings are created.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the settings record."
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "List widget designs",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widget-designs",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widget-designs"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns design settings of callback widgets: button size/colours, position and the texts shown in the form.\nOne record belongs to one widget. Filter by widget: `filters[callback_widget][id][$eq]=15`.\nUse `populate=*` (or `populate[0]=location&populate[1]=inscription`) to get the `location` and `inscription` components.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of designs.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns design settings of callback widgets: button size/colours, position and the texts shown in the form.\nOne record belongs to one widget. Filter by widget: `filters[callback_widget][id][$eq]=15`.\nUse `populate=*` (or `populate[0]=location&populate[1]=inscription`) to get the `location` and `inscription` components.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Page of designs.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 29,\n      \"attributes\": {\n        \"button\": \"default\",\n        \"button_size\": \"medium\",\n        \"button_animation\": true,\n        \"button_color\": \"#3538CD\",\n        \"block_color\": \"#F2F2F2\",\n        \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n        \"updatedAt\": \"2026-01-15T10:00:00.000Z\",\n        \"location\": {\n          \"id\": 1,\n          \"corner_location\": \"right\",\n          \"padding_x\": 10,\n          \"padding_y\": 10\n        },\n        \"inscription\": [\n          {\n            \"id\": 1,\n            \"title\": \"Have a question? We will call you back!\",\n            \"text\": \"We will call you in %countdown% seconds. It is fast and free!\",\n            \"button_text\": \"Call me\",\n            \"phone_placeholder\": \"Enter your phone number\",\n            \"call_later_label\": \"Not a good time to talk?\",\n            \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n            \"call_limit\": \"You can order another callback in half an hour.\",\n            \"make_order\": \"Request accepted. We are calling you now!\",\n            \"call_now\": null,\n            \"thanks\": null\n          }\n        ]\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns design settings of callback widgets: button size/colours, position and the texts shown in the form.\nOne record belongs to one widget. Filter by widget: `filters[callback_widget][id][$eq]=15`.\nUse `populate=*` (or `populate[0]=location&populate[1]=inscription`) to get the `location` and `inscription` components.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns design settings of callback widgets: button size/colours, position and the texts shown in the form.\nOne record belongs to one widget. Filter by widget: `filters[callback_widget][id][$eq]=15`.\nUse `populate=*` (or `populate[0]=location&populate[1]=inscription`) to get the `location` and `inscription` components.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Create widget design",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widget-designs",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widget-designs"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Creates design settings and links them to a callback widget (`callback_widget`). Each widget needs one design.\n`inscription` is a list of text sets used by the widget form in different situations (e.g. main form, exit-intent\nform, out-of-hours form); texts may contain the placeholders `%countdown%` (seconds) and `%country%`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"callback_widget\": 15,\n    \"button\": \"default\",\n    \"button_size\": \"medium\",\n    \"button_animation\": true,\n    \"button_color\": \"#3538CD\",\n    \"block_color\": \"#F2F2F2\",\n    \"location\": {\n      \"corner_location\": \"right\",\n      \"padding_x\": 10,\n      \"padding_y\": 10\n    },\n    \"inscription\": [\n      {\n        \"title\": \"Have a question? We will call you back!\",\n        \"text\": \"We will call you in %countdown% seconds. It is fast and free!\",\n        \"button_text\": \"Call me\",\n        \"phone_placeholder\": \"Enter your phone number\",\n        \"call_later_label\": \"Not a good time to talk?\",\n        \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n        \"call_limit\": \"You can order another callback in half an hour.\",\n        \"make_order\": \"Request accepted. We are calling you now!\"\n      },\n      {\n        \"title\": \"Did not find what you were looking for?\",\n        \"text\": \"We will call you in %countdown% seconds.\",\n        \"button_text\": \"Call me\",\n        \"phone_placeholder\": \"Enter your phone number\",\n        \"call_later_label\": \"Not a good time to talk?\",\n        \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n        \"call_limit\": \"You can order another callback in half an hour.\",\n        \"make_order\": \"Request accepted. We are calling you now!\"\n      },\n      {\n        \"title\": \"We are closed right now\",\n        \"text\": \"Let us call you back\",\n        \"button_text\": \"Call me\",\n        \"phone_placeholder\": \"Enter your phone number\",\n        \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n        \"call_limit\": \"You can order another callback in half an hour.\",\n        \"make_order\": \"Request accepted. We will call you at the selected time.\"\n      }\n    ]\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created design.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates design settings and links them to a callback widget (`callback_widget`). Each widget needs one design.\n`inscription` is a list of text sets used by the widget form in different situations (e.g. main form, exit-intent\nform, out-of-hours form); texts may contain the placeholders `%countdown%` (seconds) and `%country%`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"callback_widget\": 15,\n    \"button\": \"default\",\n    \"button_size\": \"medium\",\n    \"button_animation\": true,\n    \"button_color\": \"#3538CD\",\n    \"block_color\": \"#F2F2F2\",\n    \"location\": {\n      \"corner_location\": \"right\",\n      \"padding_x\": 10,\n      \"padding_y\": 10\n    },\n    \"inscription\": [\n      {\n        \"title\": \"Have a question? We will call you back!\",\n        \"text\": \"We will call you in %countdown% seconds. It is fast and free!\",\n        \"button_text\": \"Call me\",\n        \"phone_placeholder\": \"Enter your phone number\",\n        \"call_later_label\": \"Not a good time to talk?\",\n        \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n        \"call_limit\": \"You can order another callback in half an hour.\",\n        \"make_order\": \"Request accepted. We are calling you now!\"\n      },\n      {\n        \"title\": \"Did not find what you were looking for?\",\n        \"text\": \"We will call you in %countdown% seconds.\",\n        \"button_text\": \"Call me\",\n        \"phone_placeholder\": \"Enter your phone number\",\n        \"call_later_label\": \"Not a good time to talk?\",\n        \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n        \"call_limit\": \"You can order another callback in half an hour.\",\n        \"make_order\": \"Request accepted. We are calling you now!\"\n      },\n      {\n        \"title\": \"We are closed right now\",\n        \"text\": \"Let us call you back\",\n        \"button_text\": \"Call me\",\n        \"phone_placeholder\": \"Enter your phone number\",\n        \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n        \"call_limit\": \"You can order another callback in half an hour.\",\n        \"make_order\": \"Request accepted. We will call you at the selected time.\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created design.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 29,\n    \"attributes\": {\n      \"button\": \"default\",\n      \"button_size\": \"medium\",\n      \"button_animation\": true,\n      \"button_color\": \"#3538CD\",\n      \"block_color\": \"#F2F2F2\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error: required field missing (`button_size must be defined.`), invalid enum value (`button_size must be one of the following values: big, medium`) or text longer than allowed.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates design settings and links them to a callback widget (`callback_widget`). Each widget needs one design.\n`inscription` is a list of text sets used by the widget form in different situations (e.g. main form, exit-intent\nform, out-of-hours form); texts may contain the placeholders `%countdown%` (seconds) and `%country%`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"callback_widget\": 15,\n    \"button\": \"default\",\n    \"button_size\": \"medium\",\n    \"button_animation\": true,\n    \"button_color\": \"#3538CD\",\n    \"block_color\": \"#F2F2F2\",\n    \"location\": {\n      \"corner_location\": \"right\",\n      \"padding_x\": 10,\n      \"padding_y\": 10\n    },\n    \"inscription\": [\n      {\n        \"title\": \"Have a question? We will call you back!\",\n        \"text\": \"We will call you in %countdown% seconds. It is fast and free!\",\n        \"button_text\": \"Call me\",\n        \"phone_placeholder\": \"Enter your phone number\",\n        \"call_later_label\": \"Not a good time to talk?\",\n        \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n        \"call_limit\": \"You can order another callback in half an hour.\",\n        \"make_order\": \"Request accepted. We are calling you now!\"\n      },\n      {\n        \"title\": \"Did not find what you were looking for?\",\n        \"text\": \"We will call you in %countdown% seconds.\",\n        \"button_text\": \"Call me\",\n        \"phone_placeholder\": \"Enter your phone number\",\n        \"call_later_label\": \"Not a good time to talk?\",\n        \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n        \"call_limit\": \"You can order another callback in half an hour.\",\n        \"make_order\": \"Request accepted. We are calling you now!\"\n      },\n      {\n        \"title\": \"We are closed right now\",\n        \"text\": \"Let us call you back\",\n        \"button_text\": \"Call me\",\n        \"phone_placeholder\": \"Enter your phone number\",\n        \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n        \"call_limit\": \"You can order another callback in half an hour.\",\n        \"make_order\": \"Request accepted. We will call you at the selected time.\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error: required field missing (`button_size must be defined.`), invalid enum value (`button_size must be one of the following values: big, medium`) or text longer than allowed.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"button_size must be defined.\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates design settings and links them to a callback widget (`callback_widget`). Each widget needs one design.\n`inscription` is a list of text sets used by the widget form in different situations (e.g. main form, exit-intent\nform, out-of-hours form); texts may contain the placeholders `%countdown%` (seconds) and `%country%`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"callback_widget\": 15,\n    \"button\": \"default\",\n    \"button_size\": \"medium\",\n    \"button_animation\": true,\n    \"button_color\": \"#3538CD\",\n    \"block_color\": \"#F2F2F2\",\n    \"location\": {\n      \"corner_location\": \"right\",\n      \"padding_x\": 10,\n      \"padding_y\": 10\n    },\n    \"inscription\": [\n      {\n        \"title\": \"Have a question? We will call you back!\",\n        \"text\": \"We will call you in %countdown% seconds. It is fast and free!\",\n        \"button_text\": \"Call me\",\n        \"phone_placeholder\": \"Enter your phone number\",\n        \"call_later_label\": \"Not a good time to talk?\",\n        \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n        \"call_limit\": \"You can order another callback in half an hour.\",\n        \"make_order\": \"Request accepted. We are calling you now!\"\n      },\n      {\n        \"title\": \"Did not find what you were looking for?\",\n        \"text\": \"We will call you in %countdown% seconds.\",\n        \"button_text\": \"Call me\",\n        \"phone_placeholder\": \"Enter your phone number\",\n        \"call_later_label\": \"Not a good time to talk?\",\n        \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n        \"call_limit\": \"You can order another callback in half an hour.\",\n        \"make_order\": \"Request accepted. We are calling you now!\"\n      },\n      {\n        \"title\": \"We are closed right now\",\n        \"text\": \"Let us call you back\",\n        \"button_text\": \"Call me\",\n        \"phone_placeholder\": \"Enter your phone number\",\n        \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n        \"call_limit\": \"You can order another callback in half an hour.\",\n        \"make_order\": \"Request accepted. We will call you at the selected time.\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates design settings and links them to a callback widget (`callback_widget`). Each widget needs one design.\n`inscription` is a list of text sets used by the widget form in different situations (e.g. main form, exit-intent\nform, out-of-hours form); texts may contain the placeholders `%countdown%` (seconds) and `%country%`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"callback_widget\": 15,\n    \"button\": \"default\",\n    \"button_size\": \"medium\",\n    \"button_animation\": true,\n    \"button_color\": \"#3538CD\",\n    \"block_color\": \"#F2F2F2\",\n    \"location\": {\n      \"corner_location\": \"right\",\n      \"padding_x\": 10,\n      \"padding_y\": 10\n    },\n    \"inscription\": [\n      {\n        \"title\": \"Have a question? We will call you back!\",\n        \"text\": \"We will call you in %countdown% seconds. It is fast and free!\",\n        \"button_text\": \"Call me\",\n        \"phone_placeholder\": \"Enter your phone number\",\n        \"call_later_label\": \"Not a good time to talk?\",\n        \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n        \"call_limit\": \"You can order another callback in half an hour.\",\n        \"make_order\": \"Request accepted. We are calling you now!\"\n      },\n      {\n        \"title\": \"Did not find what you were looking for?\",\n        \"text\": \"We will call you in %countdown% seconds.\",\n        \"button_text\": \"Call me\",\n        \"phone_placeholder\": \"Enter your phone number\",\n        \"call_later_label\": \"Not a good time to talk?\",\n        \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n        \"call_limit\": \"You can order another callback in half an hour.\",\n        \"make_order\": \"Request accepted. We are calling you now!\"\n      },\n      {\n        \"title\": \"We are closed right now\",\n        \"text\": \"Let us call you back\",\n        \"button_text\": \"Call me\",\n        \"phone_placeholder\": \"Enter your phone number\",\n        \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n        \"call_limit\": \"You can order another callback in half an hour.\",\n        \"make_order\": \"Request accepted. We will call you at the selected time.\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get widget design",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widget-designs/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widget-designs",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "29",
                      "description": "Design id."
                    }
                  ]
                },
                "description": "Returns one design by id. Use `populate=*` to include `location`, `inscription` and the widget.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Design.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Design id."
                        }
                      ]
                    },
                    "description": "Returns one design by id. Use `populate=*` to include `location`, `inscription` and the widget.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Design.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 29,\n    \"attributes\": {\n      \"button\": \"default\",\n      \"button_size\": \"medium\",\n      \"button_animation\": true,\n      \"button_color\": \"#3538CD\",\n      \"block_color\": \"#F2F2F2\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\",\n      \"location\": {\n        \"id\": 1,\n        \"corner_location\": \"right\",\n        \"padding_x\": 10,\n        \"padding_y\": 10\n      },\n      \"inscription\": [\n        {\n          \"id\": 1,\n          \"title\": \"Have a question? We will call you back!\",\n          \"text\": \"We will call you in %countdown% seconds. It is fast and free!\",\n          \"button_text\": \"Call me\",\n          \"phone_placeholder\": \"Enter your phone number\",\n          \"call_later_label\": \"Not a good time to talk?\",\n          \"blocked_country\": \"Sorry, we cannot call %country% or the number is incorrect.\",\n          \"call_limit\": \"You can order another callback in half an hour.\",\n          \"make_order\": \"Request accepted. We are calling you now!\",\n          \"call_now\": null,\n          \"thanks\": null\n        }\n      ]\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Design id."
                        }
                      ]
                    },
                    "description": "Returns one design by id. Use `populate=*` to include `location`, `inscription` and the widget.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Design id."
                        }
                      ]
                    },
                    "description": "Returns one design by id. Use `populate=*` to include `location`, `inscription` and the widget.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Design id."
                        }
                      ]
                    },
                    "description": "Returns one design by id. Use `populate=*` to include `location`, `inscription` and the widget.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update widget design",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widget-designs/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widget-designs",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "29",
                      "description": "Design id."
                    }
                  ]
                },
                "description": "Updates design settings (Strapi envelope, only passed fields change). When passing `inscription`, send the whole list: components are replaced, not merged.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"button_size\": \"big\",\n    \"button_color\": \"#4671F6\",\n    \"location\": {\n      \"corner_location\": \"left\",\n      \"padding_x\": 20,\n      \"padding_y\": 20\n    }\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated design.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Design id."
                        }
                      ]
                    },
                    "description": "Updates design settings (Strapi envelope, only passed fields change). When passing `inscription`, send the whole list: components are replaced, not merged.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"button_size\": \"big\",\n    \"button_color\": \"#4671F6\",\n    \"location\": {\n      \"corner_location\": \"left\",\n      \"padding_x\": 20,\n      \"padding_y\": 20\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated design.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 29,\n    \"attributes\": {\n      \"button\": \"default\",\n      \"button_size\": \"big\",\n      \"button_animation\": true,\n      \"button_color\": \"#4671F6\",\n      \"block_color\": \"#F2F2F2\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T12:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error or malformed request.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Design id."
                        }
                      ]
                    },
                    "description": "Updates design settings (Strapi envelope, only passed fields change). When passing `inscription`, send the whole list: components are replaced, not merged.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"button_size\": \"big\",\n    \"button_color\": \"#4671F6\",\n    \"location\": {\n      \"corner_location\": \"left\",\n      \"padding_x\": 20,\n      \"padding_y\": 20\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error or malformed request.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"email must be a valid email\",\n    \"details\": {\n      \"errors\": [\n        {\n          \"path\": [\n            \"email\"\n          ],\n          \"message\": \"email must be a valid email\",\n          \"name\": \"ValidationError\"\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Design id."
                        }
                      ]
                    },
                    "description": "Updates design settings (Strapi envelope, only passed fields change). When passing `inscription`, send the whole list: components are replaced, not merged.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"button_size\": \"big\",\n    \"button_color\": \"#4671F6\",\n    \"location\": {\n      \"corner_location\": \"left\",\n      \"padding_x\": 20,\n      \"padding_y\": 20\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Design id."
                        }
                      ]
                    },
                    "description": "Updates design settings (Strapi envelope, only passed fields change). When passing `inscription`, send the whole list: components are replaced, not merged.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"button_size\": \"big\",\n    \"button_color\": \"#4671F6\",\n    \"location\": {\n      \"corner_location\": \"left\",\n      \"padding_x\": 20,\n      \"padding_y\": 20\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Design id."
                        }
                      ]
                    },
                    "description": "Updates design settings (Strapi envelope, only passed fields change). When passing `inscription`, send the whole list: components are replaced, not merged.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"button_size\": \"big\",\n    \"button_color\": \"#4671F6\",\n    \"location\": {\n      \"corner_location\": \"left\",\n      \"padding_x\": 20,\n      \"padding_y\": 20\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete widget design",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/callback-widget-designs/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "callback-widget-designs",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "29",
                      "description": "Design id."
                    }
                  ]
                },
                "description": "Deletes the design record permanently. The widget is left without design settings until a new one is created.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the design record."
              },
              "response": [
                {
                  "name": "200 Deleted design.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Design id."
                        }
                      ]
                    },
                    "description": "Deletes the design record permanently. The widget is left without design settings until a new one is created.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the design record."
                  },
                  "status": "Deleted design.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 29,\n    \"attributes\": {\n      \"button\": \"default\",\n      \"button_size\": \"big\",\n      \"button_animation\": true,\n      \"button_color\": \"#4671F6\",\n      \"block_color\": \"#F2F2F2\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T12:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Design id."
                        }
                      ]
                    },
                    "description": "Deletes the design record permanently. The widget is left without design settings until a new one is created.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the design record."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Design id."
                        }
                      ]
                    },
                    "description": "Deletes the design record permanently. The widget is left without design settings until a new one is created.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the design record."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/callback-widget-designs/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "callback-widget-designs",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "29",
                          "description": "Design id."
                        }
                      ]
                    },
                    "description": "Deletes the design record permanently. The widget is left without design settings until a new one is created.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the design record."
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "List recall widgets",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/recall-widgets",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "recall-widgets"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the recall (\"call from site\") widgets of the user's company (filtered by the user's company).\nUnlike a callback widget, a recall widget lets the visitor call the company directly from the browser\n(WebRTC): the platform creates a dedicated SIP line for the widget and routes the call to the configured employee,\ngroup or IVR (`redirect_data`). The widget can also show Telegram/Viber links.\nUseful `populate`: `redirect_data` (with `populate[redirect_data][populate]=*`), `color_state`, `telegram`, `viber`, `sip`.\nFilters: `filters[active][$eq]=true`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of recall widgets.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the recall (\"call from site\") widgets of the user's company (filtered by the user's company).\nUnlike a callback widget, a recall widget lets the visitor call the company directly from the browser\n(WebRTC): the platform creates a dedicated SIP line for the widget and routes the call to the configured employee,\ngroup or IVR (`redirect_data`). The widget can also show Telegram/Viber links.\nUseful `populate`: `redirect_data` (with `populate[redirect_data][populate]=*`), `color_state`, `telegram`, `viber`, `sip`.\nFilters: `filters[active][$eq]=true`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Page of recall widgets.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 4,\n      \"attributes\": {\n        \"name\": \"Call us\",\n        \"active\": true,\n        \"text\": \"Call us from the site\",\n        \"shape\": \"circle\",\n        \"font\": \"Inter\",\n        \"uuid\": \"0f8fad5b-d9cb-469f-a165-70867728950e\",\n        \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n        \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the recall (\"call from site\") widgets of the user's company (filtered by the user's company).\nUnlike a callback widget, a recall widget lets the visitor call the company directly from the browser\n(WebRTC): the platform creates a dedicated SIP line for the widget and routes the call to the configured employee,\ngroup or IVR (`redirect_data`). The widget can also show Telegram/Viber links.\nUseful `populate`: `redirect_data` (with `populate[redirect_data][populate]=*`), `color_state`, `telegram`, `viber`, `sip`.\nFilters: `filters[active][$eq]=true`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the recall (\"call from site\") widgets of the user's company (filtered by the user's company).\nUnlike a callback widget, a recall widget lets the visitor call the company directly from the browser\n(WebRTC): the platform creates a dedicated SIP line for the widget and routes the call to the configured employee,\ngroup or IVR (`redirect_data`). The widget can also show Telegram/Viber links.\nUseful `populate`: `redirect_data` (with `populate[redirect_data][populate]=*`), `color_state`, `telegram`, `viber`, `sip`.\nFilters: `filters[active][$eq]=true`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Create recall widget",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/recall-widgets",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "recall-widgets"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Creates a recall (\"call from site\") widget for the user's company. The company is attached automatically and a\n`uuid` for the embed code is generated. On creation the platform also creates a dedicated SIP line for the widget\nin the SIP domain `domain` (the visitor's browser call is placed through it) and registers it on the telephony\nservers. `domain` is required on create and cannot be changed later.\n\nValidation (in order): if `telegram.display`/`viber.display` is `true`, the corresponding `nickName` is required;\n`color_state` must contain exactly 4 items (button colour states); `redirect_data` must point to a `user`, `group`\nor `ivr`; `domain` is required.\n\nTariff limit: the tariff includes `maxRecallWidgets` free recall widgets. Above that the new widget is paid: an\norder is created and the monthly tariff price `recall_widget_cost` is charged from the balance (monthly\nsubscription). If the balance is insufficient, 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates a SIP line for the widget in the given SIP domain and registers it on the telephony servers. If the tariff limit of free recall widgets is exceeded: creates an order, charges `recall_widget_cost` from the balance and starts a monthly subscription.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"name\": \"Call us\",\n    \"active\": true,\n    \"domain\": 3,\n    \"redirect_data\": {\n      \"group\": 2\n    },\n    \"telegram\": {\n      \"display\": true,\n      \"nickName\": \"example_support\"\n    },\n    \"viber\": {\n      \"display\": false,\n      \"nickName\": \"\"\n    },\n    \"text\": \"Call us from the site\",\n    \"shape\": \"circle\",\n    \"font\": \"Inter\",\n    \"color_state\": [\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#3538CD\"\n      },\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#2A2DAB\"\n      },\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#1F2280\"\n      },\n      {\n        \"text_color\": \"#9A9A9A\",\n        \"background_color\": \"#E5E5E5\"\n      }\n    ]\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created recall widget.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a recall (\"call from site\") widget for the user's company. The company is attached automatically and a\n`uuid` for the embed code is generated. On creation the platform also creates a dedicated SIP line for the widget\nin the SIP domain `domain` (the visitor's browser call is placed through it) and registers it on the telephony\nservers. `domain` is required on create and cannot be changed later.\n\nValidation (in order): if `telegram.display`/`viber.display` is `true`, the corresponding `nickName` is required;\n`color_state` must contain exactly 4 items (button colour states); `redirect_data` must point to a `user`, `group`\nor `ivr`; `domain` is required.\n\nTariff limit: the tariff includes `maxRecallWidgets` free recall widgets. Above that the new widget is paid: an\norder is created and the monthly tariff price `recall_widget_cost` is charged from the balance (monthly\nsubscription). If the balance is insufficient, 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates a SIP line for the widget in the given SIP domain and registers it on the telephony servers. If the tariff limit of free recall widgets is exceeded: creates an order, charges `recall_widget_cost` from the balance and starts a monthly subscription.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Call us\",\n    \"active\": true,\n    \"domain\": 3,\n    \"redirect_data\": {\n      \"group\": 2\n    },\n    \"telegram\": {\n      \"display\": true,\n      \"nickName\": \"example_support\"\n    },\n    \"viber\": {\n      \"display\": false,\n      \"nickName\": \"\"\n    },\n    \"text\": \"Call us from the site\",\n    \"shape\": \"circle\",\n    \"font\": \"Inter\",\n    \"color_state\": [\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#3538CD\"\n      },\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#2A2DAB\"\n      },\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#1F2280\"\n      },\n      {\n        \"text_color\": \"#9A9A9A\",\n        \"background_color\": \"#E5E5E5\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created recall widget.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 4,\n    \"attributes\": {\n      \"name\": \"Call us\",\n      \"active\": true,\n      \"text\": \"Call us from the site\",\n      \"shape\": \"circle\",\n      \"font\": \"Inter\",\n      \"uuid\": \"0f8fad5b-d9cb-469f-a165-70867728950e\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error: `Telegram nickname must be defined`, `Viber nickname must be defined`, `All color states must be defined`, `Relation to must be defined`, `Domain must be defined`, `Not enough money on balance`, or a schema error (`name must be defined.`, `name must be at least 3 characters`).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a recall (\"call from site\") widget for the user's company. The company is attached automatically and a\n`uuid` for the embed code is generated. On creation the platform also creates a dedicated SIP line for the widget\nin the SIP domain `domain` (the visitor's browser call is placed through it) and registers it on the telephony\nservers. `domain` is required on create and cannot be changed later.\n\nValidation (in order): if `telegram.display`/`viber.display` is `true`, the corresponding `nickName` is required;\n`color_state` must contain exactly 4 items (button colour states); `redirect_data` must point to a `user`, `group`\nor `ivr`; `domain` is required.\n\nTariff limit: the tariff includes `maxRecallWidgets` free recall widgets. Above that the new widget is paid: an\norder is created and the monthly tariff price `recall_widget_cost` is charged from the balance (monthly\nsubscription). If the balance is insufficient, 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates a SIP line for the widget in the given SIP domain and registers it on the telephony servers. If the tariff limit of free recall widgets is exceeded: creates an order, charges `recall_widget_cost` from the balance and starts a monthly subscription.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Call us\",\n    \"active\": true,\n    \"domain\": 3,\n    \"redirect_data\": {\n      \"group\": 2\n    },\n    \"telegram\": {\n      \"display\": true,\n      \"nickName\": \"example_support\"\n    },\n    \"viber\": {\n      \"display\": false,\n      \"nickName\": \"\"\n    },\n    \"text\": \"Call us from the site\",\n    \"shape\": \"circle\",\n    \"font\": \"Inter\",\n    \"color_state\": [\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#3538CD\"\n      },\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#2A2DAB\"\n      },\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#1F2280\"\n      },\n      {\n        \"text_color\": \"#9A9A9A\",\n        \"background_color\": \"#E5E5E5\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error: `Telegram nickname must be defined`, `Viber nickname must be defined`, `All color states must be defined`, `Relation to must be defined`, `Domain must be defined`, `Not enough money on balance`, or a schema error (`name must be defined.`, `name must be at least 3 characters`).",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"All color states must be defined\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a recall (\"call from site\") widget for the user's company. The company is attached automatically and a\n`uuid` for the embed code is generated. On creation the platform also creates a dedicated SIP line for the widget\nin the SIP domain `domain` (the visitor's browser call is placed through it) and registers it on the telephony\nservers. `domain` is required on create and cannot be changed later.\n\nValidation (in order): if `telegram.display`/`viber.display` is `true`, the corresponding `nickName` is required;\n`color_state` must contain exactly 4 items (button colour states); `redirect_data` must point to a `user`, `group`\nor `ivr`; `domain` is required.\n\nTariff limit: the tariff includes `maxRecallWidgets` free recall widgets. Above that the new widget is paid: an\norder is created and the monthly tariff price `recall_widget_cost` is charged from the balance (monthly\nsubscription). If the balance is insufficient, 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates a SIP line for the widget in the given SIP domain and registers it on the telephony servers. If the tariff limit of free recall widgets is exceeded: creates an order, charges `recall_widget_cost` from the balance and starts a monthly subscription.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Call us\",\n    \"active\": true,\n    \"domain\": 3,\n    \"redirect_data\": {\n      \"group\": 2\n    },\n    \"telegram\": {\n      \"display\": true,\n      \"nickName\": \"example_support\"\n    },\n    \"viber\": {\n      \"display\": false,\n      \"nickName\": \"\"\n    },\n    \"text\": \"Call us from the site\",\n    \"shape\": \"circle\",\n    \"font\": \"Inter\",\n    \"color_state\": [\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#3538CD\"\n      },\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#2A2DAB\"\n      },\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#1F2280\"\n      },\n      {\n        \"text_color\": \"#9A9A9A\",\n        \"background_color\": \"#E5E5E5\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a recall (\"call from site\") widget for the user's company. The company is attached automatically and a\n`uuid` for the embed code is generated. On creation the platform also creates a dedicated SIP line for the widget\nin the SIP domain `domain` (the visitor's browser call is placed through it) and registers it on the telephony\nservers. `domain` is required on create and cannot be changed later.\n\nValidation (in order): if `telegram.display`/`viber.display` is `true`, the corresponding `nickName` is required;\n`color_state` must contain exactly 4 items (button colour states); `redirect_data` must point to a `user`, `group`\nor `ivr`; `domain` is required.\n\nTariff limit: the tariff includes `maxRecallWidgets` free recall widgets. Above that the new widget is paid: an\norder is created and the monthly tariff price `recall_widget_cost` is charged from the balance (monthly\nsubscription). If the balance is insufficient, 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates a SIP line for the widget in the given SIP domain and registers it on the telephony servers. If the tariff limit of free recall widgets is exceeded: creates an order, charges `recall_widget_cost` from the balance and starts a monthly subscription.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Call us\",\n    \"active\": true,\n    \"domain\": 3,\n    \"redirect_data\": {\n      \"group\": 2\n    },\n    \"telegram\": {\n      \"display\": true,\n      \"nickName\": \"example_support\"\n    },\n    \"viber\": {\n      \"display\": false,\n      \"nickName\": \"\"\n    },\n    \"text\": \"Call us from the site\",\n    \"shape\": \"circle\",\n    \"font\": \"Inter\",\n    \"color_state\": [\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#3538CD\"\n      },\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#2A2DAB\"\n      },\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#1F2280\"\n      },\n      {\n        \"text_color\": \"#9A9A9A\",\n        \"background_color\": \"#E5E5E5\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a recall (\"call from site\") widget for the user's company. The company is attached automatically and a\n`uuid` for the embed code is generated. On creation the platform also creates a dedicated SIP line for the widget\nin the SIP domain `domain` (the visitor's browser call is placed through it) and registers it on the telephony\nservers. `domain` is required on create and cannot be changed later.\n\nValidation (in order): if `telegram.display`/`viber.display` is `true`, the corresponding `nickName` is required;\n`color_state` must contain exactly 4 items (button colour states); `redirect_data` must point to a `user`, `group`\nor `ivr`; `domain` is required.\n\nTariff limit: the tariff includes `maxRecallWidgets` free recall widgets. Above that the new widget is paid: an\norder is created and the monthly tariff price `recall_widget_cost` is charged from the balance (monthly\nsubscription). If the balance is insufficient, 400 `Not enough money on balance` and a declined order is recorded.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Creates a SIP line for the widget in the given SIP domain and registers it on the telephony servers. If the tariff limit of free recall widgets is exceeded: creates an order, charges `recall_widget_cost` from the balance and starts a monthly subscription.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"name\": \"Call us\",\n    \"active\": true,\n    \"domain\": 3,\n    \"redirect_data\": {\n      \"group\": 2\n    },\n    \"telegram\": {\n      \"display\": true,\n      \"nickName\": \"example_support\"\n    },\n    \"viber\": {\n      \"display\": false,\n      \"nickName\": \"\"\n    },\n    \"text\": \"Call us from the site\",\n    \"shape\": \"circle\",\n    \"font\": \"Inter\",\n    \"color_state\": [\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#3538CD\"\n      },\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#2A2DAB\"\n      },\n      {\n        \"text_color\": \"#FFFFFF\",\n        \"background_color\": \"#1F2280\"\n      },\n      {\n        \"text_color\": \"#9A9A9A\",\n        \"background_color\": \"#E5E5E5\"\n      }\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get recall widget by UUID",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/recall-widgets/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "recall-widgets",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "0f8fad5b-d9cb-469f-a165-70867728950e",
                      "description": "Recall widget `uuid`."
                    }
                  ]
                },
                "description": "Returns one recall widget. Note: `{id}` is the widget `uuid` (the value used in the embed code), not the numeric id.\nSupports `populate` (e.g. `populate=*`). If no widget has this uuid, the response is `200` with `data: null`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Recall widget, or `data: null` if not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "0f8fad5b-d9cb-469f-a165-70867728950e",
                          "description": "Recall widget `uuid`."
                        }
                      ]
                    },
                    "description": "Returns one recall widget. Note: `{id}` is the widget `uuid` (the value used in the embed code), not the numeric id.\nSupports `populate` (e.g. `populate=*`). If no widget has this uuid, the response is `200` with `data: null`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Recall widget, or `data: null` if not found.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 4,\n    \"attributes\": {\n      \"name\": \"Call us\",\n      \"active\": true,\n      \"text\": \"Call us from the site\",\n      \"shape\": \"circle\",\n      \"font\": \"Inter\",\n      \"uuid\": \"0f8fad5b-d9cb-469f-a165-70867728950e\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\",\n      \"redirect_data\": {\n        \"id\": 5,\n        \"call_end\": null,\n        \"extension\": null\n      },\n      \"telegram\": {\n        \"id\": 5,\n        \"nickName\": \"example_support\",\n        \"display\": true\n      },\n      \"viber\": {\n        \"id\": 5,\n        \"nickName\": \"\",\n        \"display\": false\n      },\n      \"color_state\": [\n        {\n          \"id\": 1,\n          \"text_color\": \"#FFFFFF\",\n          \"background_color\": \"#3538CD\"\n        },\n        {\n          \"id\": 2,\n          \"text_color\": \"#FFFFFF\",\n          \"background_color\": \"#2A2DAB\"\n        },\n        {\n          \"id\": 3,\n          \"text_color\": \"#FFFFFF\",\n          \"background_color\": \"#1F2280\"\n        },\n        {\n          \"id\": 4,\n          \"text_color\": \"#9A9A9A\",\n          \"background_color\": \"#E5E5E5\"\n        }\n      ]\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "0f8fad5b-d9cb-469f-a165-70867728950e",
                          "description": "Recall widget `uuid`."
                        }
                      ]
                    },
                    "description": "Returns one recall widget. Note: `{id}` is the widget `uuid` (the value used in the embed code), not the numeric id.\nSupports `populate` (e.g. `populate=*`). If no widget has this uuid, the response is `200` with `data: null`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "0f8fad5b-d9cb-469f-a165-70867728950e",
                          "description": "Recall widget `uuid`."
                        }
                      ]
                    },
                    "description": "Returns one recall widget. Note: `{id}` is the widget `uuid` (the value used in the embed code), not the numeric id.\nSupports `populate` (e.g. `populate=*`). If no widget has this uuid, the response is `200` with `data: null`.\n\n\n**Required role:** Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update recall widget",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/recall-widgets/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "recall-widgets",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "4",
                      "description": "Recall widget id."
                    }
                  ]
                },
                "description": "Updates recall widget fields (Strapi envelope, only passed fields change): name, `active`, texts, colours,\nmessenger links, `redirect_data`. `domain` and `company` in the body are ignored. `{id}` is the numeric id.\nValidation policies of create (4 colour states, messenger nicknames) are not applied on update, but the schema\nrules (`name` 3–50 chars, `text` up to 100, enum `shape`) are.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"active\": false,\n    \"text\": \"Call us\",\n    \"redirect_data\": {\n      \"user\": 7\n    }\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated recall widget.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "4",
                          "description": "Recall widget id."
                        }
                      ]
                    },
                    "description": "Updates recall widget fields (Strapi envelope, only passed fields change): name, `active`, texts, colours,\nmessenger links, `redirect_data`. `domain` and `company` in the body are ignored. `{id}` is the numeric id.\nValidation policies of create (4 colour states, messenger nicknames) are not applied on update, but the schema\nrules (`name` 3–50 chars, `text` up to 100, enum `shape`) are.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"active\": false,\n    \"text\": \"Call us\",\n    \"redirect_data\": {\n      \"user\": 7\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated recall widget.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 4,\n    \"attributes\": {\n      \"name\": \"Call us\",\n      \"active\": false,\n      \"text\": \"Call us\",\n      \"shape\": \"circle\",\n      \"font\": \"Inter\",\n      \"uuid\": \"0f8fad5b-d9cb-469f-a165-70867728950e\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T12:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error or malformed request.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "4",
                          "description": "Recall widget id."
                        }
                      ]
                    },
                    "description": "Updates recall widget fields (Strapi envelope, only passed fields change): name, `active`, texts, colours,\nmessenger links, `redirect_data`. `domain` and `company` in the body are ignored. `{id}` is the numeric id.\nValidation policies of create (4 colour states, messenger nicknames) are not applied on update, but the schema\nrules (`name` 3–50 chars, `text` up to 100, enum `shape`) are.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"active\": false,\n    \"text\": \"Call us\",\n    \"redirect_data\": {\n      \"user\": 7\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error or malformed request.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"email must be a valid email\",\n    \"details\": {\n      \"errors\": [\n        {\n          \"path\": [\n            \"email\"\n          ],\n          \"message\": \"email must be a valid email\",\n          \"name\": \"ValidationError\"\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "4",
                          "description": "Recall widget id."
                        }
                      ]
                    },
                    "description": "Updates recall widget fields (Strapi envelope, only passed fields change): name, `active`, texts, colours,\nmessenger links, `redirect_data`. `domain` and `company` in the body are ignored. `{id}` is the numeric id.\nValidation policies of create (4 colour states, messenger nicknames) are not applied on update, but the schema\nrules (`name` 3–50 chars, `text` up to 100, enum `shape`) are.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"active\": false,\n    \"text\": \"Call us\",\n    \"redirect_data\": {\n      \"user\": 7\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "4",
                          "description": "Recall widget id."
                        }
                      ]
                    },
                    "description": "Updates recall widget fields (Strapi envelope, only passed fields change): name, `active`, texts, colours,\nmessenger links, `redirect_data`. `domain` and `company` in the body are ignored. `{id}` is the numeric id.\nValidation policies of create (4 colour states, messenger nicknames) are not applied on update, but the schema\nrules (`name` 3–50 chars, `text` up to 100, enum `shape`) are.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"active\": false,\n    \"text\": \"Call us\",\n    \"redirect_data\": {\n      \"user\": 7\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "4",
                          "description": "Recall widget id."
                        }
                      ]
                    },
                    "description": "Updates recall widget fields (Strapi envelope, only passed fields change): name, `active`, texts, colours,\nmessenger links, `redirect_data`. `domain` and `company` in the body are ignored. `{id}` is the numeric id.\nValidation policies of create (4 colour states, messenger nicknames) are not applied on update, but the schema\nrules (`name` 3–50 chars, `text` up to 100, enum `shape`) are.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"active\": false,\n    \"text\": \"Call us\",\n    \"redirect_data\": {\n      \"user\": 7\n    }\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete recall widget",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/recall-widgets/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "recall-widgets",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "4",
                      "description": "Recall widget id."
                    }
                  ]
                },
                "description": "Deletes a recall widget permanently together with its dedicated SIP line and call statistics records; the monthly subscription (if paid) is revoked. The embed code on the site stops working. Cannot be undone.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the widget, its SIP line and statistics; revokes the widget subscription."
              },
              "response": [
                {
                  "name": "200 Deleted recall widget.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "4",
                          "description": "Recall widget id."
                        }
                      ]
                    },
                    "description": "Deletes a recall widget permanently together with its dedicated SIP line and call statistics records; the monthly subscription (if paid) is revoked. The embed code on the site stops working. Cannot be undone.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the widget, its SIP line and statistics; revokes the widget subscription."
                  },
                  "status": "Deleted recall widget.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 4,\n    \"attributes\": {\n      \"name\": \"Call us\",\n      \"active\": false,\n      \"text\": \"Call us\",\n      \"shape\": \"circle\",\n      \"font\": \"Inter\",\n      \"uuid\": \"0f8fad5b-d9cb-469f-a165-70867728950e\",\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T12:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "4",
                          "description": "Recall widget id."
                        }
                      ]
                    },
                    "description": "Deletes a recall widget permanently together with its dedicated SIP line and call statistics records; the monthly subscription (if paid) is revoked. The embed code on the site stops working. Cannot be undone.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the widget, its SIP line and statistics; revokes the widget subscription."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "4",
                          "description": "Recall widget id."
                        }
                      ]
                    },
                    "description": "Deletes a recall widget permanently together with its dedicated SIP line and call statistics records; the monthly subscription (if paid) is revoked. The embed code on the site stops working. Cannot be undone.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the widget, its SIP line and statistics; revokes the widget subscription."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "4",
                          "description": "Recall widget id."
                        }
                      ]
                    },
                    "description": "Deletes a recall widget permanently together with its dedicated SIP line and call statistics records; the monthly subscription (if paid) is revoked. The embed code on the site stops working. Cannot be undone.\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Permanently deletes the widget, its SIP line and statistics; revokes the widget subscription."
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Embed code of a recall widget",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/recall-widgets/getCode/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "recall-widgets",
                    "getCode",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "0f8fad5b-d9cb-469f-a165-70867728950e",
                      "description": "Recall widget `uuid`."
                    }
                  ]
                },
                "description": "Returns the HTML/JS snippet to paste into your website before `</body>`. The snippet loads the \"call from site\"\nwidget script and styles from the OneVOIPlanet widget CDN (with a 2-second delay) and renders it into\n`<div id='app-onevoip-widgets'></div>`. `{id}` is the widget `uuid`, not the numeric id; it is not validated,\nso copy `uuid` exactly. The response is `text/html`, not JSON.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets/getCode/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets",
                        "getCode",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "0f8fad5b-d9cb-469f-a165-70867728950e",
                          "description": "Recall widget `uuid`."
                        }
                      ]
                    },
                    "description": "Returns the HTML/JS snippet to paste into your website before `</body>`. The snippet loads the \"call from site\"\nwidget script and styles from the OneVOIPlanet widget CDN (with a 2-second delay) and renders it into\n`<div id='app-onevoip-widgets'></div>`. `{id}` is the widget `uuid`, not the numeric id; it is not validated,\nso copy `uuid` exactly. The response is `text/html`, not JSON.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/recall-widgets/getCode/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "recall-widgets",
                        "getCode",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "0f8fad5b-d9cb-469f-a165-70867728950e",
                          "description": "Recall widget `uuid`."
                        }
                      ]
                    },
                    "description": "Returns the HTML/JS snippet to paste into your website before `</body>`. The snippet loads the \"call from site\"\nwidget script and styles from the OneVOIPlanet widget CDN (with a 2-second delay) and renders it into\n`<div id='app-onevoip-widgets'></div>`. `{id}` is the widget `uuid`, not the numeric id; it is not validated,\nso copy `uuid` exactly. The response is `text/html`, not JSON.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            }
          ]
        },
        {
          "name": "Contacts",
          "description": "Company address book.",
          "item": [
            {
              "name": "List contacts",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/contacts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "contacts"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the contacts of the authenticated user's company (the company filter is added server-side). Standard Strapi query parameters are supported.\nUseful filters: `filters[number][$contains]=38044`, `filters[FIO][$containsi]=john`, `filters[allowlist][$eq]=true`. Sorting: `sort=FIO:asc`. Relations: `populate=statistics` (calls linked to the contact — see Calls & Statistics).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of contacts.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the contacts of the authenticated user's company (the company filter is added server-side). Standard Strapi query parameters are supported.\nUseful filters: `filters[number][$contains]=38044`, `filters[FIO][$containsi]=john`, `filters[allowlist][$eq]=true`. Sorting: `sort=FIO:asc`. Relations: `populate=statistics` (calls linked to the contact — see Calls & Statistics).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Page of contacts.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 31,\n      \"attributes\": {\n        \"number\": \"380441234567\",\n        \"FIO\": \"John Doe\",\n        \"Comment\": \"Example LLC, purchasing\",\n        \"allowlist\": false,\n        \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n        \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n      }\n    },\n    {\n      \"id\": 32,\n      \"attributes\": {\n        \"number\": \"15551234567\",\n        \"FIO\": \"Spam caller\",\n        \"Comment\": \"\",\n        \"allowlist\": true,\n        \"createdAt\": \"2026-01-16T08:00:00.000Z\",\n        \"updatedAt\": \"2026-01-16T08:00:00.000Z\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 25,\n      \"pageCount\": 1,\n      \"total\": 2\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the contacts of the authenticated user's company (the company filter is added server-side). Standard Strapi query parameters are supported.\nUseful filters: `filters[number][$contains]=38044`, `filters[FIO][$containsi]=john`, `filters[allowlist][$eq]=true`. Sorting: `sort=FIO:asc`. Relations: `populate=statistics` (calls linked to the contact — see Calls & Statistics).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the contacts of the authenticated user's company (the company filter is added server-side). Standard Strapi query parameters are supported.\nUseful filters: `filters[number][$contains]=38044`, `filters[FIO][$containsi]=john`, `filters[allowlist][$eq]=true`. Sorting: `sort=FIO:asc`. Relations: `populate=statistics` (calls linked to the contact — see Calls & Statistics).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Create a contact",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/contacts",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "contacts"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Creates a contact in the company address book. Body: `{ \"data\": {...} }`. `company` is set from the token (a `company` sent in the body is overwritten). `number` must be unique within the company — store it in international format without `+` (e.g. `380441234567`), exactly as numbers appear in call history, so names are matched in the call log.\nIf `allowlist: true`, incoming calls from this number are blocked on all SIP domains of the company immediately (the number is written to the Kamailio block list).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** With `allowlist: true` the number is added to the call block list of the company's SIP domains (incoming calls from it are rejected).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"number\": \"380441234567\",\n    \"FIO\": \"John Doe\",\n    \"Comment\": \"Example LLC, purchasing\",\n    \"allowlist\": false\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created contact.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a contact in the company address book. Body: `{ \"data\": {...} }`. `company` is set from the token (a `company` sent in the body is overwritten). `number` must be unique within the company — store it in international format without `+` (e.g. `380441234567`), exactly as numbers appear in call history, so names are matched in the call log.\nIf `allowlist: true`, incoming calls from this number are blocked on all SIP domains of the company immediately (the number is written to the Kamailio block list).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** With `allowlist: true` the number is added to the call block list of the company's SIP domains (incoming calls from it are rejected).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"number\": \"380441234567\",\n    \"FIO\": \"John Doe\",\n    \"Comment\": \"Example LLC, purchasing\",\n    \"allowlist\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created contact.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 31,\n    \"attributes\": {\n      \"number\": \"380441234567\",\n      \"FIO\": \"John Doe\",\n      \"Comment\": \"Example LLC, purchasing\",\n      \"allowlist\": false,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 `Number is already exists!` — a contact with this `number` already exists in the company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a contact in the company address book. Body: `{ \"data\": {...} }`. `company` is set from the token (a `company` sent in the body is overwritten). `number` must be unique within the company — store it in international format without `+` (e.g. `380441234567`), exactly as numbers appear in call history, so names are matched in the call log.\nIf `allowlist: true`, incoming calls from this number are blocked on all SIP domains of the company immediately (the number is written to the Kamailio block list).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** With `allowlist: true` the number is added to the call block list of the company's SIP domains (incoming calls from it are rejected).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"number\": \"380441234567\",\n    \"FIO\": \"John Doe\",\n    \"Comment\": \"Example LLC, purchasing\",\n    \"allowlist\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`Number is already exists!` — a contact with this `number` already exists in the company.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Number is already exists!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a contact in the company address book. Body: `{ \"data\": {...} }`. `company` is set from the token (a `company` sent in the body is overwritten). `number` must be unique within the company — store it in international format without `+` (e.g. `380441234567`), exactly as numbers appear in call history, so names are matched in the call log.\nIf `allowlist: true`, incoming calls from this number are blocked on all SIP domains of the company immediately (the number is written to the Kamailio block list).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** With `allowlist: true` the number is added to the call block list of the company's SIP domains (incoming calls from it are rejected).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"number\": \"380441234567\",\n    \"FIO\": \"John Doe\",\n    \"Comment\": \"Example LLC, purchasing\",\n    \"allowlist\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a contact in the company address book. Body: `{ \"data\": {...} }`. `company` is set from the token (a `company` sent in the body is overwritten). `number` must be unique within the company — store it in international format without `+` (e.g. `380441234567`), exactly as numbers appear in call history, so names are matched in the call log.\nIf `allowlist: true`, incoming calls from this number are blocked on all SIP domains of the company immediately (the number is written to the Kamailio block list).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** With `allowlist: true` the number is added to the call block list of the company's SIP domains (incoming calls from it are rejected).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"number\": \"380441234567\",\n    \"FIO\": \"John Doe\",\n    \"Comment\": \"Example LLC, purchasing\",\n    \"allowlist\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete several contacts",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/contacts?id=31,32",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "contacts"
                  ],
                  "query": [
                    {
                      "key": "id",
                      "value": "31,32",
                      "description": "Contact id(s): `id=31` or `id[0]=31&id[1]=32`.",
                      "disabled": false
                    }
                  ],
                  "variable": []
                },
                "description": "Deletes contacts by id passed in the query string: one id `?id=31` or several `?id[0]=31&id[1]=32`. Returns the number of deleted rows (plain object, no Strapi envelope).\nBlocked numbers (`allowlist: true`) are removed from the block list before deletion.\nNote: the current implementation does not verify that the ids belong to your company — pass only ids received from `GET /contacts`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Deletes contacts permanently; removes their numbers from the call block list."
              },
              "response": [
                {
                  "name": "200 Number of deleted contacts.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts?id=31,32",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts"
                      ],
                      "query": [
                        {
                          "key": "id",
                          "value": "31,32",
                          "description": "Contact id(s): `id=31` or `id[0]=31&id[1]=32`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes contacts by id passed in the query string: one id `?id=31` or several `?id[0]=31&id[1]=32`. Returns the number of deleted rows (plain object, no Strapi envelope).\nBlocked numbers (`allowlist: true`) are removed from the block list before deletion.\nNote: the current implementation does not verify that the ids belong to your company — pass only ids received from `GET /contacts`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Deletes contacts permanently; removes their numbers from the call block list."
                  },
                  "status": "Number of deleted contacts.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"count\": 2\n}"
                },
                {
                  "name": "400 `Id is required` — no `id` in the query string.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts?id=31,32",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts"
                      ],
                      "query": [
                        {
                          "key": "id",
                          "value": "31,32",
                          "description": "Contact id(s): `id=31` or `id[0]=31&id[1]=32`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes contacts by id passed in the query string: one id `?id=31` or several `?id[0]=31&id[1]=32`. Returns the number of deleted rows (plain object, no Strapi envelope).\nBlocked numbers (`allowlist: true`) are removed from the block list before deletion.\nNote: the current implementation does not verify that the ids belong to your company — pass only ids received from `GET /contacts`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Deletes contacts permanently; removes their numbers from the call block list."
                  },
                  "status": "`Id is required` — no `id` in the query string.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"Id is required\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts?id=31,32",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts"
                      ],
                      "query": [
                        {
                          "key": "id",
                          "value": "31,32",
                          "description": "Contact id(s): `id=31` or `id[0]=31&id[1]=32`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes contacts by id passed in the query string: one id `?id=31` or several `?id[0]=31&id[1]=32`. Returns the number of deleted rows (plain object, no Strapi envelope).\nBlocked numbers (`allowlist: true`) are removed from the block list before deletion.\nNote: the current implementation does not verify that the ids belong to your company — pass only ids received from `GET /contacts`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Deletes contacts permanently; removes their numbers from the call block list."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts?id=31,32",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts"
                      ],
                      "query": [
                        {
                          "key": "id",
                          "value": "31,32",
                          "description": "Contact id(s): `id=31` or `id[0]=31&id[1]=32`.",
                          "disabled": false
                        }
                      ],
                      "variable": []
                    },
                    "description": "Deletes contacts by id passed in the query string: one id `?id=31` or several `?id[0]=31&id[1]=32`. Returns the number of deleted rows (plain object, no Strapi envelope).\nBlocked numbers (`allowlist: true`) are removed from the block list before deletion.\nNote: the current implementation does not verify that the ids belong to your company — pass only ids received from `GET /contacts`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Deletes contacts permanently; removes their numbers from the call block list."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get a contact",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/contacts/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "contacts",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "31",
                      "description": "Contact id."
                    }
                  ]
                },
                "description": "Returns one contact by id. `populate=statistics` adds the linked calls.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Contact.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "31",
                          "description": "Contact id."
                        }
                      ]
                    },
                    "description": "Returns one contact by id. `populate=statistics` adds the linked calls.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Contact.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 31,\n    \"attributes\": {\n      \"number\": \"380441234567\",\n      \"FIO\": \"John Doe\",\n      \"Comment\": \"Example LLC, purchasing\",\n      \"allowlist\": false,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "31",
                          "description": "Contact id."
                        }
                      ]
                    },
                    "description": "Returns one contact by id. `populate=statistics` adds the linked calls.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "31",
                          "description": "Contact id."
                        }
                      ]
                    },
                    "description": "Returns one contact by id. `populate=statistics` adds the linked calls.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "31",
                          "description": "Contact id."
                        }
                      ]
                    },
                    "description": "Returns one contact by id. `populate=statistics` adds the linked calls.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update a contact",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/contacts/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "contacts",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "31",
                      "description": "Contact id."
                    }
                  ]
                },
                "description": "Updates a contact by id. Body: `{ \"data\": {...} }`; send only the fields to change. Changing `number` is allowed if the new number is not used by another contact of the company.\nThe block list is re-applied: the old number is removed from it, and the new state is written (`allowlist: true` → blocked on all company SIP domains, `false` → unblocked).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Updates the call block list of the company's SIP domains according to `allowlist`.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"FIO\": \"John A. Doe\",\n    \"allowlist\": true\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated contact.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "31",
                          "description": "Contact id."
                        }
                      ]
                    },
                    "description": "Updates a contact by id. Body: `{ \"data\": {...} }`; send only the fields to change. Changing `number` is allowed if the new number is not used by another contact of the company.\nThe block list is re-applied: the old number is removed from it, and the new state is written (`allowlist: true` → blocked on all company SIP domains, `false` → unblocked).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Updates the call block list of the company's SIP domains according to `allowlist`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"FIO\": \"John A. Doe\",\n    \"allowlist\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated contact.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 31,\n    \"attributes\": {\n      \"number\": \"380441234567\",\n      \"FIO\": \"John A. Doe\",\n      \"Comment\": \"Example LLC, purchasing\",\n      \"allowlist\": true,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-17T12:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 `Number is already exists!` — another contact of the company already has this `number`.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "31",
                          "description": "Contact id."
                        }
                      ]
                    },
                    "description": "Updates a contact by id. Body: `{ \"data\": {...} }`; send only the fields to change. Changing `number` is allowed if the new number is not used by another contact of the company.\nThe block list is re-applied: the old number is removed from it, and the new state is written (`allowlist: true` → blocked on all company SIP domains, `false` → unblocked).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Updates the call block list of the company's SIP domains according to `allowlist`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"FIO\": \"John A. Doe\",\n    \"allowlist\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "`Number is already exists!` — another contact of the company already has this `number`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Number is already exists!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "31",
                          "description": "Contact id."
                        }
                      ]
                    },
                    "description": "Updates a contact by id. Body: `{ \"data\": {...} }`; send only the fields to change. Changing `number` is allowed if the new number is not used by another contact of the company.\nThe block list is re-applied: the old number is removed from it, and the new state is written (`allowlist: true` → blocked on all company SIP domains, `false` → unblocked).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Updates the call block list of the company's SIP domains according to `allowlist`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"FIO\": \"John A. Doe\",\n    \"allowlist\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "31",
                          "description": "Contact id."
                        }
                      ]
                    },
                    "description": "Updates a contact by id. Body: `{ \"data\": {...} }`; send only the fields to change. Changing `number` is allowed if the new number is not used by another contact of the company.\nThe block list is re-applied: the old number is removed from it, and the new state is written (`allowlist: true` → blocked on all company SIP domains, `false` → unblocked).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Updates the call block list of the company's SIP domains according to `allowlist`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"FIO\": \"John A. Doe\",\n    \"allowlist\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "31",
                          "description": "Contact id."
                        }
                      ]
                    },
                    "description": "Updates a contact by id. Body: `{ \"data\": {...} }`; send only the fields to change. Changing `number` is allowed if the new number is not used by another contact of the company.\nThe block list is re-applied: the old number is removed from it, and the new state is written (`allowlist: true` → blocked on all company SIP domains, `false` → unblocked).\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Updates the call block list of the company's SIP domains according to `allowlist`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"FIO\": \"John A. Doe\",\n    \"allowlist\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update a contact by phone number",
              "request": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/contacts/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "contacts",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "380441234567",
                      "description": "Phone number (informational — the server uses `data.number` from the body; send the same value here)."
                    }
                  ]
                },
                "description": "Updates the name, note and/or block flag of the company's contact identified by its phone number — convenient when you only know the number (e.g. from a call record). Body: `{ \"data\": { \"number\": \"380441234567\", \"FIO\": \"...\", \"Comment\": \"...\", \"allowlist\": true } }`.\nImportant: the number is taken from `data.number` in the body, not from the `{id}` path segment (the path value is ignored, but must be present). Only `FIO`, `Comment` and `allowlist` can be changed. If no contact with this number exists in the company, nothing is updated and `data` is null.\nThe block list is re-applied according to `allowlist`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Updates the call block list of the company's SIP domains according to `allowlist`.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"number\": \"380441234567\",\n    \"FIO\": \"John Doe\",\n    \"Comment\": \"VIP client\",\n    \"allowlist\": false\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated contact, or `data: null` if no contact with this number exists in the company.",
                  "originalRequest": {
                    "method": "PATCH",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "380441234567",
                          "description": "Phone number (informational — the server uses `data.number` from the body; send the same value here)."
                        }
                      ]
                    },
                    "description": "Updates the name, note and/or block flag of the company's contact identified by its phone number — convenient when you only know the number (e.g. from a call record). Body: `{ \"data\": { \"number\": \"380441234567\", \"FIO\": \"...\", \"Comment\": \"...\", \"allowlist\": true } }`.\nImportant: the number is taken from `data.number` in the body, not from the `{id}` path segment (the path value is ignored, but must be present). Only `FIO`, `Comment` and `allowlist` can be changed. If no contact with this number exists in the company, nothing is updated and `data` is null.\nThe block list is re-applied according to `allowlist`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Updates the call block list of the company's SIP domains according to `allowlist`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"number\": \"380441234567\",\n    \"FIO\": \"John Doe\",\n    \"Comment\": \"VIP client\",\n    \"allowlist\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated contact, or `data: null` if no contact with this number exists in the company.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 31,\n    \"attributes\": {\n      \"number\": \"380441234567\",\n      \"FIO\": \"John Doe\",\n      \"Comment\": \"VIP client\",\n      \"allowlist\": false,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-17T12:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PATCH",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "380441234567",
                          "description": "Phone number (informational — the server uses `data.number` from the body; send the same value here)."
                        }
                      ]
                    },
                    "description": "Updates the name, note and/or block flag of the company's contact identified by its phone number — convenient when you only know the number (e.g. from a call record). Body: `{ \"data\": { \"number\": \"380441234567\", \"FIO\": \"...\", \"Comment\": \"...\", \"allowlist\": true } }`.\nImportant: the number is taken from `data.number` in the body, not from the `{id}` path segment (the path value is ignored, but must be present). Only `FIO`, `Comment` and `allowlist` can be changed. If no contact with this number exists in the company, nothing is updated and `data` is null.\nThe block list is re-applied according to `allowlist`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Updates the call block list of the company's SIP domains according to `allowlist`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"number\": \"380441234567\",\n    \"FIO\": \"John Doe\",\n    \"Comment\": \"VIP client\",\n    \"allowlist\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PATCH",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "380441234567",
                          "description": "Phone number (informational — the server uses `data.number` from the body; send the same value here)."
                        }
                      ]
                    },
                    "description": "Updates the name, note and/or block flag of the company's contact identified by its phone number — convenient when you only know the number (e.g. from a call record). Body: `{ \"data\": { \"number\": \"380441234567\", \"FIO\": \"...\", \"Comment\": \"...\", \"allowlist\": true } }`.\nImportant: the number is taken from `data.number` in the body, not from the `{id}` path segment (the path value is ignored, but must be present). Only `FIO`, `Comment` and `allowlist` can be changed. If no contact with this number exists in the company, nothing is updated and `data` is null.\nThe block list is re-applied according to `allowlist`.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Updates the call block list of the company's SIP domains according to `allowlist`.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"number\": \"380441234567\",\n    \"FIO\": \"John Doe\",\n    \"Comment\": \"VIP client\",\n    \"allowlist\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete a contact",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/contacts/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "contacts",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "31",
                      "description": "Contact id."
                    }
                  ]
                },
                "description": "Deletes one contact by id. If the number was blocked (`allowlist: true`), it is removed from the block list first.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Deletes the contact permanently; removes the number from the call block list."
              },
              "response": [
                {
                  "name": "200 Deleted contact.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "31",
                          "description": "Contact id."
                        }
                      ]
                    },
                    "description": "Deletes one contact by id. If the number was blocked (`allowlist: true`), it is removed from the block list first.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Deletes the contact permanently; removes the number from the call block list."
                  },
                  "status": "Deleted contact.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 31,\n    \"attributes\": {\n      \"number\": \"380441234567\",\n      \"FIO\": \"John Doe\",\n      \"Comment\": \"Example LLC, purchasing\",\n      \"allowlist\": false,\n      \"createdAt\": \"2026-01-15T10:00:00.000Z\",\n      \"updatedAt\": \"2026-01-15T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "31",
                          "description": "Contact id."
                        }
                      ]
                    },
                    "description": "Deletes one contact by id. If the number was blocked (`allowlist: true`), it is removed from the block list first.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Deletes the contact permanently; removes the number from the call block list."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "31",
                          "description": "Contact id."
                        }
                      ]
                    },
                    "description": "Deletes one contact by id. If the number was blocked (`allowlist: true`), it is removed from the block list first.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Deletes the contact permanently; removes the number from the call block list."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/contacts/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "contacts",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "31",
                          "description": "Contact id."
                        }
                      ]
                    },
                    "description": "Deletes one contact by id. If the number was blocked (`allowlist: true`), it is removed from the block list first.\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** Deletes the contact permanently; removes the number from the call block list."
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            }
          ]
        },
        {
          "name": "SMS",
          "description": "SMS chats and messages on the company numbers.",
          "item": [
            {
              "name": "List SMS chats",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sms/sms-chats",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sms",
                    "sms-chats"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the SMS chats of the company. A chat is a dialogue between one company number and one external number\n(`dialog_with`); it is created automatically when the first incoming or outgoing message appears.\nThe list is always restricted to the company of the authenticated user (the `company` filter is added on the server).\n\nUseful query options: `sort=last_message_time:desc`, `filters[seen][$eq]=false` (chats with unread messages),\n`filters[dialog_with][$eq]=380671234567`, `filters[receiver_phone_relation][id][$eq]=7` (chats on one company number),\n`populate[receiver_phone_relation][fields][0]=fullnumber`. Messages of a chat are better fetched via\n`GET /sms/sms-messages?filters[chat][id][$eq]={chatId}`. Default page size is 10.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of chats.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-chats",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-chats"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the SMS chats of the company. A chat is a dialogue between one company number and one external number\n(`dialog_with`); it is created automatically when the first incoming or outgoing message appears.\nThe list is always restricted to the company of the authenticated user (the `company` filter is added on the server).\n\nUseful query options: `sort=last_message_time:desc`, `filters[seen][$eq]=false` (chats with unread messages),\n`filters[dialog_with][$eq]=380671234567`, `filters[receiver_phone_relation][id][$eq]=7` (chats on one company number),\n`populate[receiver_phone_relation][fields][0]=fullnumber`. Messages of a chat are better fetched via\n`GET /sms/sms-messages?filters[chat][id][$eq]={chatId}`. Default page size is 10.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Page of chats.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 12,\n      \"attributes\": {\n        \"dialog_with\": \"380671234567\",\n        \"last_message\": \"Thank you, see you tomorrow\",\n        \"last_message_time\": \"2026-03-10T09:15:00.000Z\",\n        \"last_message_receiver\": \"380671234567\",\n        \"last_message_type\": \"outgoing\",\n        \"seen\": true,\n        \"alpha_name\": \"John Doe\",\n        \"createdAt\": \"2026-03-01T08:00:00.000Z\",\n        \"updatedAt\": \"2026-03-10T09:15:01.000Z\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 10,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-chats",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-chats"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the SMS chats of the company. A chat is a dialogue between one company number and one external number\n(`dialog_with`); it is created automatically when the first incoming or outgoing message appears.\nThe list is always restricted to the company of the authenticated user (the `company` filter is added on the server).\n\nUseful query options: `sort=last_message_time:desc`, `filters[seen][$eq]=false` (chats with unread messages),\n`filters[dialog_with][$eq]=380671234567`, `filters[receiver_phone_relation][id][$eq]=7` (chats on one company number),\n`populate[receiver_phone_relation][fields][0]=fullnumber`. Messages of a chat are better fetched via\n`GET /sms/sms-messages?filters[chat][id][$eq]={chatId}`. Default page size is 10.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-chats",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-chats"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the SMS chats of the company. A chat is a dialogue between one company number and one external number\n(`dialog_with`); it is created automatically when the first incoming or outgoing message appears.\nThe list is always restricted to the company of the authenticated user (the `company` filter is added on the server).\n\nUseful query options: `sort=last_message_time:desc`, `filters[seen][$eq]=false` (chats with unread messages),\n`filters[dialog_with][$eq]=380671234567`, `filters[receiver_phone_relation][id][$eq]=7` (chats on one company number),\n`populate[receiver_phone_relation][fields][0]=fullnumber`. Messages of a chat are better fetched via\n`GET /sms/sms-messages?filters[chat][id][$eq]={chatId}`. Default page size is 10.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get SMS chat",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sms/sms-chats/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sms",
                    "sms-chats",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "12",
                      "description": "Chat id."
                    }
                  ]
                },
                "description": "Returns one chat by id. Use `populate[messages]=*` to include the messages, or\n`populate[receiver_phone_relation][fields][0]=fullnumber` to see the company number of the dialogue.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Chat.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-chats/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-chats",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Chat id."
                        }
                      ]
                    },
                    "description": "Returns one chat by id. Use `populate[messages]=*` to include the messages, or\n`populate[receiver_phone_relation][fields][0]=fullnumber` to see the company number of the dialogue.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Chat.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 12,\n    \"attributes\": {\n      \"dialog_with\": \"380671234567\",\n      \"last_message\": \"Thank you, see you tomorrow\",\n      \"last_message_time\": \"2026-03-10T09:15:00.000Z\",\n      \"last_message_receiver\": \"380671234567\",\n      \"last_message_type\": \"outgoing\",\n      \"seen\": true,\n      \"alpha_name\": \"John Doe\",\n      \"createdAt\": \"2026-03-01T08:00:00.000Z\",\n      \"updatedAt\": \"2026-03-10T09:15:01.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-chats/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-chats",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Chat id."
                        }
                      ]
                    },
                    "description": "Returns one chat by id. Use `populate[messages]=*` to include the messages, or\n`populate[receiver_phone_relation][fields][0]=fullnumber` to see the company number of the dialogue.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-chats/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-chats",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Chat id."
                        }
                      ]
                    },
                    "description": "Returns one chat by id. Use `populate[messages]=*` to include the messages, or\n`populate[receiver_phone_relation][fields][0]=fullnumber` to see the company number of the dialogue.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-chats/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-chats",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Chat id."
                        }
                      ]
                    },
                    "description": "Returns one chat by id. Use `populate[messages]=*` to include the messages, or\n`populate[receiver_phone_relation][fields][0]=fullnumber` to see the company number of the dialogue.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Update SMS chat",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sms/sms-chats/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sms",
                    "sms-chats",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "12",
                      "description": "Chat id."
                    }
                  ]
                },
                "description": "Updates chat fields (Strapi core update, body is `{ \"data\": {...} }`). In practice only two fields make sense to change:\n`seen` (mark the whole chat as read/unread) and `alpha_name` (display name of the external party).\nOther fields (`last_message*`, `dialog_with`) are maintained automatically by incoming/outgoing messages — do not change them.\nTo mark individual messages as read use `PUT /sms/update-messages-status`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"seen\": true,\n    \"alpha_name\": \"John Doe\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated chat.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-chats/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-chats",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Chat id."
                        }
                      ]
                    },
                    "description": "Updates chat fields (Strapi core update, body is `{ \"data\": {...} }`). In practice only two fields make sense to change:\n`seen` (mark the whole chat as read/unread) and `alpha_name` (display name of the external party).\nOther fields (`last_message*`, `dialog_with`) are maintained automatically by incoming/outgoing messages — do not change them.\nTo mark individual messages as read use `PUT /sms/update-messages-status`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"seen\": true,\n    \"alpha_name\": \"John Doe\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated chat.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 12,\n    \"attributes\": {\n      \"dialog_with\": \"380671234567\",\n      \"last_message\": \"Thank you, see you tomorrow\",\n      \"last_message_time\": \"2026-03-10T09:15:00.000Z\",\n      \"last_message_receiver\": \"380671234567\",\n      \"last_message_type\": \"outgoing\",\n      \"seen\": true,\n      \"alpha_name\": \"John Doe\",\n      \"createdAt\": \"2026-03-01T08:00:00.000Z\",\n      \"updatedAt\": \"2026-03-10T09:20:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Missing `data` envelope.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-chats/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-chats",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Chat id."
                        }
                      ]
                    },
                    "description": "Updates chat fields (Strapi core update, body is `{ \"data\": {...} }`). In practice only two fields make sense to change:\n`seen` (mark the whole chat as read/unread) and `alpha_name` (display name of the external party).\nOther fields (`last_message*`, `dialog_with`) are maintained automatically by incoming/outgoing messages — do not change them.\nTo mark individual messages as read use `PUT /sms/update-messages-status`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"seen\": true,\n    \"alpha_name\": \"John Doe\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing `data` envelope.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Missing \\\"data\\\" payload in the request body\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-chats/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-chats",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Chat id."
                        }
                      ]
                    },
                    "description": "Updates chat fields (Strapi core update, body is `{ \"data\": {...} }`). In practice only two fields make sense to change:\n`seen` (mark the whole chat as read/unread) and `alpha_name` (display name of the external party).\nOther fields (`last_message*`, `dialog_with`) are maintained automatically by incoming/outgoing messages — do not change them.\nTo mark individual messages as read use `PUT /sms/update-messages-status`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"seen\": true,\n    \"alpha_name\": \"John Doe\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-chats/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-chats",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Chat id."
                        }
                      ]
                    },
                    "description": "Updates chat fields (Strapi core update, body is `{ \"data\": {...} }`). In practice only two fields make sense to change:\n`seen` (mark the whole chat as read/unread) and `alpha_name` (display name of the external party).\nOther fields (`last_message*`, `dialog_with`) are maintained automatically by incoming/outgoing messages — do not change them.\nTo mark individual messages as read use `PUT /sms/update-messages-status`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"seen\": true,\n    \"alpha_name\": \"John Doe\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-chats/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-chats",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Chat id."
                        }
                      ]
                    },
                    "description": "Updates chat fields (Strapi core update, body is `{ \"data\": {...} }`). In practice only two fields make sense to change:\n`seen` (mark the whole chat as read/unread) and `alpha_name` (display name of the external party).\nOther fields (`last_message*`, `dialog_with`) are maintained automatically by incoming/outgoing messages — do not change them.\nTo mark individual messages as read use `PUT /sms/update-messages-status`.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"seen\": true,\n    \"alpha_name\": \"John Doe\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete SMS chat",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sms/sms-chats/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sms",
                    "sms-chats",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "12",
                      "description": "Chat id."
                    }
                  ]
                },
                "description": "Permanently deletes the chat. Messages of the chat are not deleted — they remain in `GET /sms/sms-messages`\nbut lose the link to the chat; the next message with the same number will create a new chat.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Deletes the chat permanently."
              },
              "response": [
                {
                  "name": "200 Deleted chat.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-chats/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-chats",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Chat id."
                        }
                      ]
                    },
                    "description": "Permanently deletes the chat. Messages of the chat are not deleted — they remain in `GET /sms/sms-messages`\nbut lose the link to the chat; the next message with the same number will create a new chat.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Deletes the chat permanently."
                  },
                  "status": "Deleted chat.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 12,\n    \"attributes\": {\n      \"dialog_with\": \"380671234567\",\n      \"last_message\": \"Thank you, see you tomorrow\",\n      \"last_message_time\": \"2026-03-10T09:15:00.000Z\",\n      \"last_message_receiver\": \"380671234567\",\n      \"last_message_type\": \"outgoing\",\n      \"seen\": true,\n      \"alpha_name\": \"John Doe\",\n      \"createdAt\": \"2026-03-01T08:00:00.000Z\",\n      \"updatedAt\": \"2026-03-10T09:20:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-chats/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-chats",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Chat id."
                        }
                      ]
                    },
                    "description": "Permanently deletes the chat. Messages of the chat are not deleted — they remain in `GET /sms/sms-messages`\nbut lose the link to the chat; the next message with the same number will create a new chat.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Deletes the chat permanently."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-chats/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-chats",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Chat id."
                        }
                      ]
                    },
                    "description": "Permanently deletes the chat. Messages of the chat are not deleted — they remain in `GET /sms/sms-messages`\nbut lose the link to the chat; the next message with the same number will create a new chat.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Deletes the chat permanently."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-chats/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-chats",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "12",
                          "description": "Chat id."
                        }
                      ]
                    },
                    "description": "Permanently deletes the chat. Messages of the chat are not deleted — they remain in `GET /sms/sms-messages`\nbut lose the link to the chat; the next message with the same number will create a new chat.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Deletes the chat permanently."
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "List SMS messages",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sms/sms-messages",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sms",
                    "sms-messages"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns SMS messages (incoming and outgoing) of the company. The list is always restricted to the company of the\nauthenticated user (the `company` filter is added on the server).\n\nUseful query options: `filters[chat][id][$eq]=12` (messages of one chat), `filters[type][$eq]=incoming`,\n`filters[status][$eq]=error`, `filters[seen][$eq]=false`, `filters[receive_time][$gte]=2026-03-01`,\n`sort=receive_time:desc`, `populate[chat][fields][0]=dialog_with`. Default page size is 10.\nDelivery status of outgoing messages changes asynchronously (`queued` → `success` / `error`), re-read the message to see it.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of messages.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-messages",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-messages"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns SMS messages (incoming and outgoing) of the company. The list is always restricted to the company of the\nauthenticated user (the `company` filter is added on the server).\n\nUseful query options: `filters[chat][id][$eq]=12` (messages of one chat), `filters[type][$eq]=incoming`,\n`filters[status][$eq]=error`, `filters[seen][$eq]=false`, `filters[receive_time][$gte]=2026-03-01`,\n`sort=receive_time:desc`, `populate[chat][fields][0]=dialog_with`. Default page size is 10.\nDelivery status of outgoing messages changes asynchronously (`queued` → `success` / `error`), re-read the message to see it.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Page of messages.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 101,\n      \"attributes\": {\n        \"sender\": \"380441234567\",\n        \"receiver\": \"380671234567\",\n        \"receive_time\": \"2026-03-10T09:15:00.000Z\",\n        \"type\": \"outgoing\",\n        \"status\": \"success\",\n        \"seen\": true,\n        \"message\": \"Thank you, see you tomorrow\",\n        \"createdAt\": \"2026-03-10T09:15:00.000Z\",\n        \"updatedAt\": \"2026-03-10T09:15:03.000Z\"\n      }\n    },\n    {\n      \"id\": 100,\n      \"attributes\": {\n        \"sender\": \"380671234567\",\n        \"receiver\": \"380441234567\",\n        \"receive_time\": \"2026-03-10T09:10:00.000Z\",\n        \"type\": \"incoming\",\n        \"status\": \"success\",\n        \"seen\": false,\n        \"message\": \"Hello, is the office open tomorrow?\",\n        \"createdAt\": \"2026-03-10T09:10:00.000Z\",\n        \"updatedAt\": \"2026-03-10T09:10:00.000Z\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 10,\n      \"pageCount\": 1,\n      \"total\": 2\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-messages",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-messages"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns SMS messages (incoming and outgoing) of the company. The list is always restricted to the company of the\nauthenticated user (the `company` filter is added on the server).\n\nUseful query options: `filters[chat][id][$eq]=12` (messages of one chat), `filters[type][$eq]=incoming`,\n`filters[status][$eq]=error`, `filters[seen][$eq]=false`, `filters[receive_time][$gte]=2026-03-01`,\n`sort=receive_time:desc`, `populate[chat][fields][0]=dialog_with`. Default page size is 10.\nDelivery status of outgoing messages changes asynchronously (`queued` → `success` / `error`), re-read the message to see it.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-messages",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-messages"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns SMS messages (incoming and outgoing) of the company. The list is always restricted to the company of the\nauthenticated user (the `company` filter is added on the server).\n\nUseful query options: `filters[chat][id][$eq]=12` (messages of one chat), `filters[type][$eq]=incoming`,\n`filters[status][$eq]=error`, `filters[seen][$eq]=false`, `filters[receive_time][$gte]=2026-03-01`,\n`sort=receive_time:desc`, `populate[chat][fields][0]=dialog_with`. Default page size is 10.\nDelivery status of outgoing messages changes asynchronously (`queued` → `success` / `error`), re-read the message to see it.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Get SMS message",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sms/sms-messages/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sms",
                    "sms-messages",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "101",
                      "description": "Message id."
                    }
                  ]
                },
                "description": "Returns one message by id, e.g. to poll the delivery `status` of a message sent via `POST /sms/outgoing/send`.\n`populate[chat]=*` includes the chat, `populate[receiver_phone_relation][fields][0]=fullnumber` — the company number.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Message.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-messages/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-messages",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Message id."
                        }
                      ]
                    },
                    "description": "Returns one message by id, e.g. to poll the delivery `status` of a message sent via `POST /sms/outgoing/send`.\n`populate[chat]=*` includes the chat, `populate[receiver_phone_relation][fields][0]=fullnumber` — the company number.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Message.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 101,\n    \"attributes\": {\n      \"sender\": \"380441234567\",\n      \"receiver\": \"380671234567\",\n      \"receive_time\": \"2026-03-10T09:15:00.000Z\",\n      \"type\": \"outgoing\",\n      \"status\": \"success\",\n      \"seen\": true,\n      \"message\": \"Thank you, see you tomorrow\",\n      \"createdAt\": \"2026-03-10T09:15:00.000Z\",\n      \"updatedAt\": \"2026-03-10T09:15:03.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-messages/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-messages",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Message id."
                        }
                      ]
                    },
                    "description": "Returns one message by id, e.g. to poll the delivery `status` of a message sent via `POST /sms/outgoing/send`.\n`populate[chat]=*` includes the chat, `populate[receiver_phone_relation][fields][0]=fullnumber` — the company number.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-messages/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-messages",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Message id."
                        }
                      ]
                    },
                    "description": "Returns one message by id, e.g. to poll the delivery `status` of a message sent via `POST /sms/outgoing/send`.\n`populate[chat]=*` includes the chat, `populate[receiver_phone_relation][fields][0]=fullnumber` — the company number.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-messages/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-messages",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Message id."
                        }
                      ]
                    },
                    "description": "Returns one message by id, e.g. to poll the delivery `status` of a message sent via `POST /sms/outgoing/send`.\n`populate[chat]=*` includes the chat, `populate[receiver_phone_relation][fields][0]=fullnumber` — the company number.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Delete SMS message",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sms/sms-messages/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sms",
                    "sms-messages",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "101",
                      "description": "Message id."
                    }
                  ]
                },
                "description": "Permanently deletes one message from the history. Does not cancel sending (an already queued message is still delivered)\nand does not refund the charge. The `last_message*` fields of the chat are not recalculated.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Deletes the message permanently."
              },
              "response": [
                {
                  "name": "200 Deleted message.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-messages/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-messages",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Message id."
                        }
                      ]
                    },
                    "description": "Permanently deletes one message from the history. Does not cancel sending (an already queued message is still delivered)\nand does not refund the charge. The `last_message*` fields of the chat are not recalculated.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Deletes the message permanently."
                  },
                  "status": "Deleted message.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 101,\n    \"attributes\": {\n      \"sender\": \"380441234567\",\n      \"receiver\": \"380671234567\",\n      \"receive_time\": \"2026-03-10T09:15:00.000Z\",\n      \"type\": \"outgoing\",\n      \"status\": \"success\",\n      \"seen\": true,\n      \"message\": \"Thank you, see you tomorrow\",\n      \"createdAt\": \"2026-03-10T09:15:00.000Z\",\n      \"updatedAt\": \"2026-03-10T09:15:03.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-messages/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-messages",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Message id."
                        }
                      ]
                    },
                    "description": "Permanently deletes one message from the history. Does not cancel sending (an already queued message is still delivered)\nand does not refund the charge. The `last_message*` fields of the chat are not recalculated.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Deletes the message permanently."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-messages/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-messages",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Message id."
                        }
                      ]
                    },
                    "description": "Permanently deletes one message from the history. Does not cancel sending (an already queued message is still delivered)\nand does not refund the charge. The `last_message*` fields of the chat are not recalculated.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Deletes the message permanently."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/sms-messages/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "sms-messages",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "101",
                          "description": "Message id."
                        }
                      ]
                    },
                    "description": "Permanently deletes one message from the history. Does not cancel sending (an already queued message is still delivered)\nand does not refund the charge. The `last_message*` fields of the chat are not recalculated.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Deletes the message permanently."
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Company numbers that can send SMS",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sms/phones",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sms",
                    "phones"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the company numbers whose number range supports outgoing SMS (`phone_prefix.outgoing_sms = true`).\nUse the `id` of a number as the `phone` field in `POST /sms/outgoing/send`.\nFor every number the price list of its range is included: `price_by_field` items named `sms_outgoing_price` and\n`sms_incoming_price` are the per-segment prices (the currency of each price list is not returned; the one in your company\ncurrency applies). Note: if a destination-based route price exists (see `POST /sms/outgoing/send`), it takes precedence over\n`sms_outgoing_price`. Only `pagination[page]`/`pagination[pageSize]` are accepted, default page size is 10.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Numbers with SMS support.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/phones",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "phones"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the company numbers whose number range supports outgoing SMS (`phone_prefix.outgoing_sms = true`).\nUse the `id` of a number as the `phone` field in `POST /sms/outgoing/send`.\nFor every number the price list of its range is included: `price_by_field` items named `sms_outgoing_price` and\n`sms_incoming_price` are the per-segment prices (the currency of each price list is not returned; the one in your company\ncurrency applies). Note: if a destination-based route price exists (see `POST /sms/outgoing/send`), it takes precedence over\n`sms_outgoing_price`. Only `pagination[page]`/`pagination[pageSize]` are accepted, default page size is 10.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Numbers with SMS support.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 7,\n      \"attributes\": {\n        \"fullnumber\": \"380441234567\",\n        \"country_prefix\": {\n          \"data\": {\n            \"id\": 3,\n            \"attributes\": {\n              \"iso\": \"UA\"\n            }\n          }\n        },\n        \"phone_prefix\": {\n          \"data\": {\n            \"id\": 15,\n            \"attributes\": {\n              \"outgoing_sms\": true,\n              \"prices\": {\n                \"data\": [\n                  {\n                    \"id\": 40,\n                    \"attributes\": {\n                      \"price_by_field\": [\n                        {\n                          \"id\": 901,\n                          \"name\": \"sms_outgoing_price\",\n                          \"price\": 0.05\n                        },\n                        {\n                          \"id\": 902,\n                          \"name\": \"sms_incoming_price\",\n                          \"price\": 0.01\n                        }\n                      ]\n                    }\n                  }\n                ]\n              }\n            }\n          }\n        }\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 10,\n      \"pageCount\": 1,\n      \"total\": 1\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/phones",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "phones"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the company numbers whose number range supports outgoing SMS (`phone_prefix.outgoing_sms = true`).\nUse the `id` of a number as the `phone` field in `POST /sms/outgoing/send`.\nFor every number the price list of its range is included: `price_by_field` items named `sms_outgoing_price` and\n`sms_incoming_price` are the per-segment prices (the currency of each price list is not returned; the one in your company\ncurrency applies). Note: if a destination-based route price exists (see `POST /sms/outgoing/send`), it takes precedence over\n`sms_outgoing_price`. Only `pagination[page]`/`pagination[pageSize]` are accepted, default page size is 10.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/phones",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "phones"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the company numbers whose number range supports outgoing SMS (`phone_prefix.outgoing_sms = true`).\nUse the `id` of a number as the `phone` field in `POST /sms/outgoing/send`.\nFor every number the price list of its range is included: `price_by_field` items named `sms_outgoing_price` and\n`sms_incoming_price` are the per-segment prices (the currency of each price list is not returned; the one in your company\ncurrency applies). Note: if a destination-based route price exists (see `POST /sms/outgoing/send`), it takes precedence over\n`sms_outgoing_price`. Only `pagination[page]`/`pagination[pageSize]` are accepted, default page size is 10.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Send SMS",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sms/outgoing/send",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sms",
                    "outgoing",
                    "send"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Sends an SMS from a company number (`phone` — id of a number from `GET /sms/phones`) to `destination`.\n\n**Destination number.** Digits only are kept. The number is first interpreted as a national number of the sender's\ncountry (as dialled in a softphone), and only if that fails — as an international number without `+`.\nExample: from a Ukrainian number `0671234567` and `380671234567` both mean +380 67 123 4567. SMS to the United States are rejected.\n\n**Charging.** The charge is taken from the company balance immediately when the message is accepted, before delivery:\n`segments × price`, where `segments = ceil(message.length / 160)` (plain character count) and `price` is, in order of precedence:\nthe SMS route price for the destination country in the company currency (`price_local` if the destination is in the same\ncountry as the sender, otherwise `price_intl`), or, if no route exists, `sms_outgoing_price` of the sender's number range.\nThe debit appears in the payment history with the comment `Outgoing sms sms`. The charge is **not refunded** if the\nprovider later reports a delivery error.\n\n**Result.** The method returns the created message with `status: \"queued\"`; delivery goes through DIDWW asynchronously and the\nstatus becomes `success` or `error` — poll `GET /sms/sms-messages/{id}` (a push notification `smsStatus` is also sent).\nIf the balance (plus credit limit, if enabled) is lower than the charge, or no price is configured for the company currency,\nthe method still returns **200** with a message in `status: \"error\"`; nothing is sent and nothing is charged.\nThe chat with the destination number is created or updated automatically.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Sends an SMS via the provider (DIDWW) and immediately debits the company balance: ceil(length/160) segments × per-segment price (SMS route price for the destination country, otherwise sms_outgoing_price of the sender's number range), payment comment 'Outgoing sms sms'; no refund on delivery failure. Creates/updates the SMS chat and sends push notifications on status changes.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"phone\": 7,\n    \"destination\": \"380671234567\",\n    \"message\": \"Thank you, see you tomorrow\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created outgoing message. `status: queued` — accepted and charged; `status: error` — not sent (insufficient balance or no price configured), not charged.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/outgoing/send",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "outgoing",
                        "send"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Sends an SMS from a company number (`phone` — id of a number from `GET /sms/phones`) to `destination`.\n\n**Destination number.** Digits only are kept. The number is first interpreted as a national number of the sender's\ncountry (as dialled in a softphone), and only if that fails — as an international number without `+`.\nExample: from a Ukrainian number `0671234567` and `380671234567` both mean +380 67 123 4567. SMS to the United States are rejected.\n\n**Charging.** The charge is taken from the company balance immediately when the message is accepted, before delivery:\n`segments × price`, where `segments = ceil(message.length / 160)` (plain character count) and `price` is, in order of precedence:\nthe SMS route price for the destination country in the company currency (`price_local` if the destination is in the same\ncountry as the sender, otherwise `price_intl`), or, if no route exists, `sms_outgoing_price` of the sender's number range.\nThe debit appears in the payment history with the comment `Outgoing sms sms`. The charge is **not refunded** if the\nprovider later reports a delivery error.\n\n**Result.** The method returns the created message with `status: \"queued\"`; delivery goes through DIDWW asynchronously and the\nstatus becomes `success` or `error` — poll `GET /sms/sms-messages/{id}` (a push notification `smsStatus` is also sent).\nIf the balance (plus credit limit, if enabled) is lower than the charge, or no price is configured for the company currency,\nthe method still returns **200** with a message in `status: \"error\"`; nothing is sent and nothing is charged.\nThe chat with the destination number is created or updated automatically.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Sends an SMS via the provider (DIDWW) and immediately debits the company balance: ceil(length/160) segments × per-segment price (SMS route price for the destination country, otherwise sms_outgoing_price of the sender's number range), payment comment 'Outgoing sms sms'; no refund on delivery failure. Creates/updates the SMS chat and sends push notifications on status changes.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phone\": 7,\n    \"destination\": \"380671234567\",\n    \"message\": \"Thank you, see you tomorrow\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created outgoing message. `status: queued` — accepted and charged; `status: error` — not sent (insufficient balance or no price configured), not charged.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 101,\n    \"attributes\": {\n      \"sender\": \"380441234567\",\n      \"receiver\": \"380671234567\",\n      \"receive_time\": \"2026-03-10T09:15:00.000Z\",\n      \"type\": \"outgoing\",\n      \"status\": \"queued\",\n      \"seen\": true,\n      \"message\": \"Thank you, see you tomorrow\",\n      \"createdAt\": \"2026-03-10T09:15:00.000Z\",\n      \"updatedAt\": \"2026-03-10T09:15:00.000Z\",\n      \"company\": {\n        \"data\": {\n          \"id\": 1,\n          \"attributes\": {\n            \"currency\": {\n              \"data\": {\n                \"id\": 1,\n                \"attributes\": {}\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error. Messages: `data.destination is a required field`, `data.phone is a required field`, `data.message is a required field`, `data.destination must be at least 3 characters`, `Incorrect phone provided` (the number does not belong to your company), `Phone not allowed to send sms` (the range has no outgoing SMS), `Incorrect destination number`, `SMS to the United States are not supported`.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/outgoing/send",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "outgoing",
                        "send"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Sends an SMS from a company number (`phone` — id of a number from `GET /sms/phones`) to `destination`.\n\n**Destination number.** Digits only are kept. The number is first interpreted as a national number of the sender's\ncountry (as dialled in a softphone), and only if that fails — as an international number without `+`.\nExample: from a Ukrainian number `0671234567` and `380671234567` both mean +380 67 123 4567. SMS to the United States are rejected.\n\n**Charging.** The charge is taken from the company balance immediately when the message is accepted, before delivery:\n`segments × price`, where `segments = ceil(message.length / 160)` (plain character count) and `price` is, in order of precedence:\nthe SMS route price for the destination country in the company currency (`price_local` if the destination is in the same\ncountry as the sender, otherwise `price_intl`), or, if no route exists, `sms_outgoing_price` of the sender's number range.\nThe debit appears in the payment history with the comment `Outgoing sms sms`. The charge is **not refunded** if the\nprovider later reports a delivery error.\n\n**Result.** The method returns the created message with `status: \"queued\"`; delivery goes through DIDWW asynchronously and the\nstatus becomes `success` or `error` — poll `GET /sms/sms-messages/{id}` (a push notification `smsStatus` is also sent).\nIf the balance (plus credit limit, if enabled) is lower than the charge, or no price is configured for the company currency,\nthe method still returns **200** with a message in `status: \"error\"`; nothing is sent and nothing is charged.\nThe chat with the destination number is created or updated automatically.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Sends an SMS via the provider (DIDWW) and immediately debits the company balance: ceil(length/160) segments × per-segment price (SMS route price for the destination country, otherwise sms_outgoing_price of the sender's number range), payment comment 'Outgoing sms sms'; no refund on delivery failure. Creates/updates the SMS chat and sends push notifications on status changes.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phone\": 7,\n    \"destination\": \"380671234567\",\n    \"message\": \"Thank you, see you tomorrow\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Validation error. Messages: `data.destination is a required field`, `data.phone is a required field`, `data.message is a required field`, `data.destination must be at least 3 characters`, `Incorrect phone provided` (the number does not belong to your company), `Phone not allowed to send sms` (the range has no outgoing SMS), `Incorrect destination number`, `SMS to the United States are not supported`.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Incorrect phone provided\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/outgoing/send",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "outgoing",
                        "send"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Sends an SMS from a company number (`phone` — id of a number from `GET /sms/phones`) to `destination`.\n\n**Destination number.** Digits only are kept. The number is first interpreted as a national number of the sender's\ncountry (as dialled in a softphone), and only if that fails — as an international number without `+`.\nExample: from a Ukrainian number `0671234567` and `380671234567` both mean +380 67 123 4567. SMS to the United States are rejected.\n\n**Charging.** The charge is taken from the company balance immediately when the message is accepted, before delivery:\n`segments × price`, where `segments = ceil(message.length / 160)` (plain character count) and `price` is, in order of precedence:\nthe SMS route price for the destination country in the company currency (`price_local` if the destination is in the same\ncountry as the sender, otherwise `price_intl`), or, if no route exists, `sms_outgoing_price` of the sender's number range.\nThe debit appears in the payment history with the comment `Outgoing sms sms`. The charge is **not refunded** if the\nprovider later reports a delivery error.\n\n**Result.** The method returns the created message with `status: \"queued\"`; delivery goes through DIDWW asynchronously and the\nstatus becomes `success` or `error` — poll `GET /sms/sms-messages/{id}` (a push notification `smsStatus` is also sent).\nIf the balance (plus credit limit, if enabled) is lower than the charge, or no price is configured for the company currency,\nthe method still returns **200** with a message in `status: \"error\"`; nothing is sent and nothing is charged.\nThe chat with the destination number is created or updated automatically.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Sends an SMS via the provider (DIDWW) and immediately debits the company balance: ceil(length/160) segments × per-segment price (SMS route price for the destination country, otherwise sms_outgoing_price of the sender's number range), payment comment 'Outgoing sms sms'; no refund on delivery failure. Creates/updates the SMS chat and sends push notifications on status changes.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phone\": 7,\n    \"destination\": \"380671234567\",\n    \"message\": \"Thank you, see you tomorrow\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/outgoing/send",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "outgoing",
                        "send"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Sends an SMS from a company number (`phone` — id of a number from `GET /sms/phones`) to `destination`.\n\n**Destination number.** Digits only are kept. The number is first interpreted as a national number of the sender's\ncountry (as dialled in a softphone), and only if that fails — as an international number without `+`.\nExample: from a Ukrainian number `0671234567` and `380671234567` both mean +380 67 123 4567. SMS to the United States are rejected.\n\n**Charging.** The charge is taken from the company balance immediately when the message is accepted, before delivery:\n`segments × price`, where `segments = ceil(message.length / 160)` (plain character count) and `price` is, in order of precedence:\nthe SMS route price for the destination country in the company currency (`price_local` if the destination is in the same\ncountry as the sender, otherwise `price_intl`), or, if no route exists, `sms_outgoing_price` of the sender's number range.\nThe debit appears in the payment history with the comment `Outgoing sms sms`. The charge is **not refunded** if the\nprovider later reports a delivery error.\n\n**Result.** The method returns the created message with `status: \"queued\"`; delivery goes through DIDWW asynchronously and the\nstatus becomes `success` or `error` — poll `GET /sms/sms-messages/{id}` (a push notification `smsStatus` is also sent).\nIf the balance (plus credit limit, if enabled) is lower than the charge, or no price is configured for the company currency,\nthe method still returns **200** with a message in `status: \"error\"`; nothing is sent and nothing is charged.\nThe chat with the destination number is created or updated automatically.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Sends an SMS via the provider (DIDWW) and immediately debits the company balance: ceil(length/160) segments × per-segment price (SMS route price for the destination country, otherwise sms_outgoing_price of the sender's number range), payment comment 'Outgoing sms sms'; no refund on delivery failure. Creates/updates the SMS chat and sends push notifications on status changes.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"phone\": 7,\n    \"destination\": \"380671234567\",\n    \"message\": \"Thank you, see you tomorrow\"\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Mark messages as read",
              "request": {
                "method": "PUT",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/sms/update-messages-status",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "sms",
                    "update-messages-status"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Marks the listed messages of one chat as read (`seen = true`) and marks the chat itself as read.\nOnly messages that belong to the given `chat` are affected; if none of the `ids` belong to the chat, nothing changes and\n`data` is an empty array. The operation is idempotent. The reverse (mark as unread) is not supported.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"chat\": 12,\n    \"ids\": [\n      100,\n      101\n    ]\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated messages with the state of their chat.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/update-messages-status",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "update-messages-status"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Marks the listed messages of one chat as read (`seen = true`) and marks the chat itself as read.\nOnly messages that belong to the given `chat` are affected; if none of the `ids` belong to the chat, nothing changes and\n`data` is an empty array. The operation is idempotent. The reverse (mark as unread) is not supported.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"chat\": 12,\n    \"ids\": [\n      100,\n      101\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated messages with the state of their chat.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 100,\n      \"attributes\": {\n        \"seen\": true,\n        \"chat\": {\n          \"data\": {\n            \"id\": 12,\n            \"attributes\": {\n              \"seen\": true\n            }\n          }\n        }\n      }\n    },\n    {\n      \"id\": 101,\n      \"attributes\": {\n        \"seen\": true,\n        \"chat\": {\n          \"data\": {\n            \"id\": 12,\n            \"attributes\": {\n              \"seen\": true\n            }\n          }\n        }\n      }\n    }\n  ],\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/update-messages-status",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "update-messages-status"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Marks the listed messages of one chat as read (`seen = true`) and marks the chat itself as read.\nOnly messages that belong to the given `chat` are affected; if none of the `ids` belong to the chat, nothing changes and\n`data` is an empty array. The operation is idempotent. The reverse (mark as unread) is not supported.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"chat\": 12,\n    \"ids\": [\n      100,\n      101\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "PUT",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/sms/update-messages-status",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "sms",
                        "update-messages-status"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Marks the listed messages of one chat as read (`seen = true`) and marks the chat itself as read.\nOnly messages that belong to the given `chat` are affected; if none of the `ids` belong to the chat, nothing changes and\n`data` is an empty array. The operation is idempotent. The reverse (mark as unread) is not supported.\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** None",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"chat\": 12,\n    \"ids\": [\n      100,\n      101\n    ]\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "Other services",
      "item": [
        {
          "name": "eSIM",
          "description": "eSIM catalogue (countries, regions, bundles) and the company's eSIMs.",
          "item": [
            {
              "name": "eSIM countries (catalogue)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/esims",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "esims"
                  ],
                  "query": [
                    {
                      "key": "sort",
                      "value": "sort[0]=name:asc",
                      "description": "Sort in array form only: `sort[0]=name:asc`.",
                      "disabled": true
                    },
                    {
                      "key": "fields",
                      "value": "fields[0]=name&fields[1]=iso_code",
                      "description": "Fields to return, array form: `fields[0]=name&fields[1]=iso_code`.",
                      "disabled": true
                    },
                    {
                      "key": "populate",
                      "value": "populate[image][fields][0]=url&populate[esimColour]=*",
                      "description": "Relations to include, object form only: `populate[image][fields][0]=url&populate[esimColour]=*&populate[esim_regions][fields][0]=name`.",
                      "disabled": true
                    }
                  ],
                  "variable": []
                },
                "description": "Public catalogue of countries for which eSIM data bundles are sold. Returns **all** published countries at once\n(up to 1000, no pagination, `meta` is empty). The country matching the caller's IP address gets an extra flag `userCountry: true`.\n\nQuery options are accepted **only in object form**: `filters[iso_code][$eq]=AD`, `filters[name][$contains]=land`,\n`sort[0]=name:asc`, `fields[0]=name&fields[1]=iso_code`, `populate[image][fields][0]=url`, `populate[esimColour]=*`,\n`populate[esim_regions][fields][0]=name`, `populate[esim_bundles]=*`. Plain `populate=*` or `sort=name` are ignored.\nBundles of a country are better fetched via `GET /esim-bundles?filters[esim][id][$eq]={countryId}`.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 All published countries.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esims",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esims"
                      ],
                      "query": [
                        {
                          "key": "sort",
                          "value": "sort[0]=name:asc",
                          "description": "Sort in array form only: `sort[0]=name:asc`.",
                          "disabled": true
                        },
                        {
                          "key": "fields",
                          "value": "fields[0]=name&fields[1]=iso_code",
                          "description": "Fields to return, array form: `fields[0]=name&fields[1]=iso_code`.",
                          "disabled": true
                        },
                        {
                          "key": "populate",
                          "value": "populate[image][fields][0]=url&populate[esimColour]=*",
                          "description": "Relations to include, object form only: `populate[image][fields][0]=url&populate[esimColour]=*&populate[esim_regions][fields][0]=name`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Public catalogue of countries for which eSIM data bundles are sold. Returns **all** published countries at once\n(up to 1000, no pagination, `meta` is empty). The country matching the caller's IP address gets an extra flag `userCountry: true`.\n\nQuery options are accepted **only in object form**: `filters[iso_code][$eq]=AD`, `filters[name][$contains]=land`,\n`sort[0]=name:asc`, `fields[0]=name&fields[1]=iso_code`, `populate[image][fields][0]=url`, `populate[esimColour]=*`,\n`populate[esim_regions][fields][0]=name`, `populate[esim_bundles]=*`. Plain `populate=*` or `sort=name` are ignored.\nBundles of a country are better fetched via `GET /esim-bundles?filters[esim][id][$eq]={countryId}`.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "All published countries.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 4,\n      \"attributes\": {\n        \"name\": \"Andorra\",\n        \"iso_code\": \"AD\",\n        \"createdAt\": \"2026-01-10T10:00:00.000Z\",\n        \"updatedAt\": \"2026-02-01T10:00:00.000Z\",\n        \"image\": {\n          \"data\": {\n            \"id\": 501,\n            \"attributes\": {\n              \"url\": \"/uploads/Andorra_1a2b3c.jpg\"\n            }\n          }\n        },\n        \"esimColour\": {\n          \"id\": 61,\n          \"firstColour\": \"0021EA\",\n          \"secondColour\": \"FEDF00\",\n          \"thirdColour\": \"000000\"\n        },\n        \"esim_regions\": {\n          \"data\": [\n            {\n              \"id\": 4,\n              \"attributes\": {\n                \"name\": \"Europe\"\n              }\n            }\n          ]\n        }\n      }\n    },\n    {\n      \"id\": 9,\n      \"attributes\": {\n        \"name\": \"Ukraine\",\n        \"iso_code\": \"UA\",\n        \"userCountry\": true,\n        \"createdAt\": \"2026-01-10T10:00:00.000Z\",\n        \"updatedAt\": \"2026-02-01T10:00:00.000Z\",\n        \"image\": {\n          \"data\": {\n            \"id\": 502,\n            \"attributes\": {\n              \"url\": \"/uploads/Ukraine_4d5e6f.jpg\"\n            }\n          }\n        },\n        \"esimColour\": {\n          \"id\": 62,\n          \"firstColour\": \"0057B7\",\n          \"secondColour\": \"FFD700\",\n          \"thirdColour\": \"000000\"\n        },\n        \"esim_regions\": {\n          \"data\": [\n            {\n              \"id\": 4,\n              \"attributes\": {\n                \"name\": \"Europe\"\n              }\n            }\n          ]\n        }\n      }\n    }\n  ],\n  \"meta\": {}\n}"
                },
                {
                  "name": "400 Validation error or malformed request.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esims",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esims"
                      ],
                      "query": [
                        {
                          "key": "sort",
                          "value": "sort[0]=name:asc",
                          "description": "Sort in array form only: `sort[0]=name:asc`.",
                          "disabled": true
                        },
                        {
                          "key": "fields",
                          "value": "fields[0]=name&fields[1]=iso_code",
                          "description": "Fields to return, array form: `fields[0]=name&fields[1]=iso_code`.",
                          "disabled": true
                        },
                        {
                          "key": "populate",
                          "value": "populate[image][fields][0]=url&populate[esimColour]=*",
                          "description": "Relations to include, object form only: `populate[image][fields][0]=url&populate[esimColour]=*&populate[esim_regions][fields][0]=name`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Public catalogue of countries for which eSIM data bundles are sold. Returns **all** published countries at once\n(up to 1000, no pagination, `meta` is empty). The country matching the caller's IP address gets an extra flag `userCountry: true`.\n\nQuery options are accepted **only in object form**: `filters[iso_code][$eq]=AD`, `filters[name][$contains]=land`,\n`sort[0]=name:asc`, `fields[0]=name&fields[1]=iso_code`, `populate[image][fields][0]=url`, `populate[esimColour]=*`,\n`populate[esim_regions][fields][0]=name`, `populate[esim_bundles]=*`. Plain `populate=*` or `sort=name` are ignored.\nBundles of a country are better fetched via `GET /esim-bundles?filters[esim][id][$eq]={countryId}`.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Validation error or malformed request.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"email must be a valid email\",\n    \"details\": {\n      \"errors\": [\n        {\n          \"path\": [\n            \"email\"\n          ],\n          \"message\": \"email must be a valid email\",\n          \"name\": \"ValidationError\"\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esims",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esims"
                      ],
                      "query": [
                        {
                          "key": "sort",
                          "value": "sort[0]=name:asc",
                          "description": "Sort in array form only: `sort[0]=name:asc`.",
                          "disabled": true
                        },
                        {
                          "key": "fields",
                          "value": "fields[0]=name&fields[1]=iso_code",
                          "description": "Fields to return, array form: `fields[0]=name&fields[1]=iso_code`.",
                          "disabled": true
                        },
                        {
                          "key": "populate",
                          "value": "populate[image][fields][0]=url&populate[esimColour]=*",
                          "description": "Relations to include, object form only: `populate[image][fields][0]=url&populate[esimColour]=*&populate[esim_regions][fields][0]=name`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Public catalogue of countries for which eSIM data bundles are sold. Returns **all** published countries at once\n(up to 1000, no pagination, `meta` is empty). The country matching the caller's IP address gets an extra flag `userCountry: true`.\n\nQuery options are accepted **only in object form**: `filters[iso_code][$eq]=AD`, `filters[name][$contains]=land`,\n`sort[0]=name:asc`, `fields[0]=name&fields[1]=iso_code`, `populate[image][fields][0]=url`, `populate[esimColour]=*`,\n`populate[esim_regions][fields][0]=name`, `populate[esim_bundles]=*`. Plain `populate=*` or `sort=name` are ignored.\nBundles of a country are better fetched via `GET /esim-bundles?filters[esim][id][$eq]={countryId}`.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esims",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esims"
                      ],
                      "query": [
                        {
                          "key": "sort",
                          "value": "sort[0]=name:asc",
                          "description": "Sort in array form only: `sort[0]=name:asc`.",
                          "disabled": true
                        },
                        {
                          "key": "fields",
                          "value": "fields[0]=name&fields[1]=iso_code",
                          "description": "Fields to return, array form: `fields[0]=name&fields[1]=iso_code`.",
                          "disabled": true
                        },
                        {
                          "key": "populate",
                          "value": "populate[image][fields][0]=url&populate[esimColour]=*",
                          "description": "Relations to include, object form only: `populate[image][fields][0]=url&populate[esimColour]=*&populate[esim_regions][fields][0]=name`.",
                          "disabled": true
                        }
                      ],
                      "variable": []
                    },
                    "description": "Public catalogue of countries for which eSIM data bundles are sold. Returns **all** published countries at once\n(up to 1000, no pagination, `meta` is empty). The country matching the caller's IP address gets an extra flag `userCountry: true`.\n\nQuery options are accepted **only in object form**: `filters[iso_code][$eq]=AD`, `filters[name][$contains]=land`,\n`sort[0]=name:asc`, `fields[0]=name&fields[1]=iso_code`, `populate[image][fields][0]=url`, `populate[esimColour]=*`,\n`populate[esim_regions][fields][0]=name`, `populate[esim_bundles]=*`. Plain `populate=*` or `sort=name` are ignored.\nBundles of a country are better fetched via `GET /esim-bundles?filters[esim][id][$eq]={countryId}`.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "eSIM country",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/esims/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "esims",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "4",
                      "description": "Country id."
                    }
                  ]
                },
                "description": "Returns one catalogue country by id (Strapi core findOne). `populate=*` includes the flag image, colours, regions and bundles;\n`populate[esim_bundles][populate][prices][populate]=*` includes bundles with their prices.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Country.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esims/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esims",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "4",
                          "description": "Country id."
                        }
                      ]
                    },
                    "description": "Returns one catalogue country by id (Strapi core findOne). `populate=*` includes the flag image, colours, regions and bundles;\n`populate[esim_bundles][populate][prices][populate]=*` includes bundles with their prices.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Country.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 4,\n    \"attributes\": {\n      \"name\": \"Andorra\",\n      \"iso_code\": \"AD\",\n      \"createdAt\": \"2026-01-10T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T10:00:00.000Z\",\n      \"esimColour\": {\n        \"id\": 61,\n        \"firstColour\": \"0021EA\",\n        \"secondColour\": \"FEDF00\",\n        \"thirdColour\": \"000000\"\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esims/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esims",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "4",
                          "description": "Country id."
                        }
                      ]
                    },
                    "description": "Returns one catalogue country by id (Strapi core findOne). `populate=*` includes the flag image, colours, regions and bundles;\n`populate[esim_bundles][populate][prices][populate]=*` includes bundles with their prices.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "eSIM regions (catalogue)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/esim-regions",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "esim-regions"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Public catalogue of regions (Europe, Asia, Global, …) for which multi-country eSIM bundles are sold. Strapi core list:\npagination, `sort=name:asc`, `filters[isGlobal][$eq]=true`, `populate[image][fields][0]=url`, `populate[esimColour]=*`,\n`populate[esim_countries][fields][0]=name` (countries covered by the region). Bundles of a region:\n`GET /esim-bundles?filters[esim_region][id][$eq]={regionId}`. Default page size is 10.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of regions.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-regions",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-regions"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Public catalogue of regions (Europe, Asia, Global, …) for which multi-country eSIM bundles are sold. Strapi core list:\npagination, `sort=name:asc`, `filters[isGlobal][$eq]=true`, `populate[image][fields][0]=url`, `populate[esimColour]=*`,\n`populate[esim_countries][fields][0]=name` (countries covered by the region). Bundles of a region:\n`GET /esim-bundles?filters[esim_region][id][$eq]={regionId}`. Default page size is 10.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Page of regions.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 4,\n      \"attributes\": {\n        \"name\": \"Europe\",\n        \"isGlobal\": false,\n        \"createdAt\": \"2026-01-10T10:00:00.000Z\",\n        \"updatedAt\": \"2026-02-01T10:00:00.000Z\",\n        \"image\": {\n          \"data\": {\n            \"id\": 510,\n            \"attributes\": {\n              \"url\": \"/uploads/Europe_7a8b9c.jpg\"\n            }\n          }\n        },\n        \"esimColour\": {\n          \"id\": 71,\n          \"firstColour\": \"1EB53A\",\n          \"secondColour\": \"FDD835\",\n          \"thirdColour\": \"000000\"\n        },\n        \"esim_countries\": {\n          \"data\": [\n            {\n              \"id\": 4,\n              \"attributes\": {\n                \"name\": \"Andorra\"\n              }\n            },\n            {\n              \"id\": 9,\n              \"attributes\": {\n                \"name\": \"Ukraine\"\n              }\n            }\n          ]\n        }\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 10,\n      \"pageCount\": 1,\n      \"total\": 7\n    }\n  }\n}"
                },
                {
                  "name": "400 Validation error or malformed request.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-regions",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-regions"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Public catalogue of regions (Europe, Asia, Global, …) for which multi-country eSIM bundles are sold. Strapi core list:\npagination, `sort=name:asc`, `filters[isGlobal][$eq]=true`, `populate[image][fields][0]=url`, `populate[esimColour]=*`,\n`populate[esim_countries][fields][0]=name` (countries covered by the region). Bundles of a region:\n`GET /esim-bundles?filters[esim_region][id][$eq]={regionId}`. Default page size is 10.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Validation error or malformed request.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"email must be a valid email\",\n    \"details\": {\n      \"errors\": [\n        {\n          \"path\": [\n            \"email\"\n          ],\n          \"message\": \"email must be a valid email\",\n          \"name\": \"ValidationError\"\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-regions",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-regions"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Public catalogue of regions (Europe, Asia, Global, …) for which multi-country eSIM bundles are sold. Strapi core list:\npagination, `sort=name:asc`, `filters[isGlobal][$eq]=true`, `populate[image][fields][0]=url`, `populate[esimColour]=*`,\n`populate[esim_countries][fields][0]=name` (countries covered by the region). Bundles of a region:\n`GET /esim-bundles?filters[esim_region][id][$eq]={regionId}`. Default page size is 10.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-regions",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-regions"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Public catalogue of regions (Europe, Asia, Global, …) for which multi-country eSIM bundles are sold. Strapi core list:\npagination, `sort=name:asc`, `filters[isGlobal][$eq]=true`, `populate[image][fields][0]=url`, `populate[esimColour]=*`,\n`populate[esim_countries][fields][0]=name` (countries covered by the region). Bundles of a region:\n`GET /esim-bundles?filters[esim_region][id][$eq]={regionId}`. Default page size is 10.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "eSIM region",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/esim-regions/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "esim-regions",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "4",
                      "description": "Region id."
                    }
                  ]
                },
                "description": "Returns one region by id (Strapi core findOne). Use `populate` to include the image, colours, countries and bundles.\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Region.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-regions/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-regions",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "4",
                          "description": "Region id."
                        }
                      ]
                    },
                    "description": "Returns one region by id (Strapi core findOne). Use `populate` to include the image, colours, countries and bundles.\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Region.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 4,\n    \"attributes\": {\n      \"name\": \"Europe\",\n      \"isGlobal\": false,\n      \"createdAt\": \"2026-01-10T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T10:00:00.000Z\",\n      \"esimColour\": {\n        \"id\": 71,\n        \"firstColour\": \"1EB53A\",\n        \"secondColour\": \"FDD835\",\n        \"thirdColour\": \"000000\"\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-regions/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-regions",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "4",
                          "description": "Region id."
                        }
                      ]
                    },
                    "description": "Returns one region by id (Strapi core findOne). Use `populate` to include the image, colours, countries and bundles.\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "eSIM bundles (catalogue)",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/esim-bundles",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "esim-bundles"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Public catalogue of eSIM data bundles. A bundle belongs either to a country (`esim`) or to a region (`esim_region`).\nThe retail price is in `prices` → `price_by_field` item named `price`, one price list per currency\n(`populate[prices][populate]=*` to get prices with their currency). The `id` of a bundle is what you pass as `esim.id`\nwhen creating an order (see Orders).\n\nUseful filters: `filters[esim][id][$eq]=4` (bundles of a country), `filters[esim_region][id][$eq]=4`,\n`filters[isFullEsim][$eq]=false` (data-only bundles; `true` — bundles with minutes/SMS), `filters[isInfinity][$eq]=true`\n(unlimited data), `filters[days_amount][$lte]=30`, `filters[providerName][$eq]=esimgo`. `sort=usage_amount:asc`.\nOnly published bundles are returned. Default page size is 10.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Page of bundles.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-bundles",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-bundles"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Public catalogue of eSIM data bundles. A bundle belongs either to a country (`esim`) or to a region (`esim_region`).\nThe retail price is in `prices` → `price_by_field` item named `price`, one price list per currency\n(`populate[prices][populate]=*` to get prices with their currency). The `id` of a bundle is what you pass as `esim.id`\nwhen creating an order (see Orders).\n\nUseful filters: `filters[esim][id][$eq]=4` (bundles of a country), `filters[esim_region][id][$eq]=4`,\n`filters[isFullEsim][$eq]=false` (data-only bundles; `true` — bundles with minutes/SMS), `filters[isInfinity][$eq]=true`\n(unlimited data), `filters[days_amount][$lte]=30`, `filters[providerName][$eq]=esimgo`. `sort=usage_amount:asc`.\nOnly published bundles are returned. Default page size is 10.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Page of bundles.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 120,\n      \"attributes\": {\n        \"days_amount\": 7,\n        \"usage_amount\": 1,\n        \"isInfinity\": false,\n        \"isFullEsim\": false,\n        \"minutes_amount\": null,\n        \"messages_amount\": null,\n        \"providerName\": \"esimgo\",\n        \"createdAt\": \"2026-01-10T10:00:00.000Z\",\n        \"updatedAt\": \"2026-02-01T10:00:00.000Z\",\n        \"esim\": {\n          \"data\": {\n            \"id\": 4,\n            \"attributes\": {\n              \"name\": \"Andorra\",\n              \"iso_code\": \"AD\"\n            }\n          }\n        },\n        \"esim_region\": {\n          \"data\": null\n        },\n        \"provider\": [\n          {\n            \"id\": 300,\n            \"__component\": \"esim-bundle-provider.esimgo\",\n            \"bundle_name\": \"esim_1GB_7D_AD_U\"\n          }\n        ],\n        \"prices\": {\n          \"data\": [\n            {\n              \"id\": 900,\n              \"attributes\": {\n                \"description\": \"1GB/7days Andorra\",\n                \"currency\": {\n                  \"data\": {\n                    \"id\": 1,\n                    \"attributes\": {\n                      \"name_short\": \"USD\",\n                      \"name_long\": \"US Dollar\",\n                      \"symbol\": \"$\"\n                    }\n                  }\n                },\n                \"price_by_field\": [\n                  {\n                    \"id\": 9001,\n                    \"name\": \"price\",\n                    \"price\": 4.99,\n                    \"isPriceStatic\": false\n                  }\n                ]\n              }\n            },\n            {\n              \"id\": 901,\n              \"attributes\": {\n                \"description\": null,\n                \"currency\": {\n                  \"data\": {\n                    \"id\": 3,\n                    \"attributes\": {\n                      \"name_short\": \"UAH\",\n                      \"name_long\": \"Гривня\",\n                      \"symbol\": \"₴\"\n                    }\n                  }\n                },\n                \"price_by_field\": [\n                  {\n                    \"id\": 9002,\n                    \"name\": \"price\",\n                    \"price\": 219,\n                    \"isPriceStatic\": false\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      }\n    }\n  ],\n  \"meta\": {\n    \"pagination\": {\n      \"page\": 1,\n      \"pageSize\": 10,\n      \"pageCount\": 135,\n      \"total\": 1346\n    }\n  }\n}"
                },
                {
                  "name": "400 Validation error or malformed request.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-bundles",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-bundles"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Public catalogue of eSIM data bundles. A bundle belongs either to a country (`esim`) or to a region (`esim_region`).\nThe retail price is in `prices` → `price_by_field` item named `price`, one price list per currency\n(`populate[prices][populate]=*` to get prices with their currency). The `id` of a bundle is what you pass as `esim.id`\nwhen creating an order (see Orders).\n\nUseful filters: `filters[esim][id][$eq]=4` (bundles of a country), `filters[esim_region][id][$eq]=4`,\n`filters[isFullEsim][$eq]=false` (data-only bundles; `true` — bundles with minutes/SMS), `filters[isInfinity][$eq]=true`\n(unlimited data), `filters[days_amount][$lte]=30`, `filters[providerName][$eq]=esimgo`. `sort=usage_amount:asc`.\nOnly published bundles are returned. Default page size is 10.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Validation error or malformed request.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"email must be a valid email\",\n    \"details\": {\n      \"errors\": [\n        {\n          \"path\": [\n            \"email\"\n          ],\n          \"message\": \"email must be a valid email\",\n          \"name\": \"ValidationError\"\n        }\n      ]\n    }\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-bundles",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-bundles"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Public catalogue of eSIM data bundles. A bundle belongs either to a country (`esim`) or to a region (`esim_region`).\nThe retail price is in `prices` → `price_by_field` item named `price`, one price list per currency\n(`populate[prices][populate]=*` to get prices with their currency). The `id` of a bundle is what you pass as `esim.id`\nwhen creating an order (see Orders).\n\nUseful filters: `filters[esim][id][$eq]=4` (bundles of a country), `filters[esim_region][id][$eq]=4`,\n`filters[isFullEsim][$eq]=false` (data-only bundles; `true` — bundles with minutes/SMS), `filters[isInfinity][$eq]=true`\n(unlimited data), `filters[days_amount][$lte]=30`, `filters[providerName][$eq]=esimgo`. `sort=usage_amount:asc`.\nOnly published bundles are returned. Default page size is 10.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-bundles",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-bundles"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Public catalogue of eSIM data bundles. A bundle belongs either to a country (`esim`) or to a region (`esim_region`).\nThe retail price is in `prices` → `price_by_field` item named `price`, one price list per currency\n(`populate[prices][populate]=*` to get prices with their currency). The `id` of a bundle is what you pass as `esim.id`\nwhen creating an order (see Orders).\n\nUseful filters: `filters[esim][id][$eq]=4` (bundles of a country), `filters[esim_region][id][$eq]=4`,\n`filters[isFullEsim][$eq]=false` (data-only bundles; `true` — bundles with minutes/SMS), `filters[isInfinity][$eq]=true`\n(unlimited data), `filters[days_amount][$lte]=30`, `filters[providerName][$eq]=esimgo`. `sort=usage_amount:asc`.\nOnly published bundles are returned. Default page size is 10.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "eSIM bundle",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/esim-bundles/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "esim-bundles",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "120",
                      "description": "Bundle id."
                    }
                  ]
                },
                "description": "Returns one bundle by id (Strapi core findOne). `populate[prices][populate]=*&populate[esim]=*&populate[esim_region]=*&populate[provider]=*` gives prices with currency, the country/region and the provider descriptor.\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 Bundle.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-bundles/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-bundles",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "120",
                          "description": "Bundle id."
                        }
                      ]
                    },
                    "description": "Returns one bundle by id (Strapi core findOne). `populate[prices][populate]=*&populate[esim]=*&populate[esim_region]=*&populate[provider]=*` gives prices with currency, the country/region and the provider descriptor.\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Bundle.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 120,\n    \"attributes\": {\n      \"days_amount\": 7,\n      \"usage_amount\": 1,\n      \"isInfinity\": false,\n      \"isFullEsim\": false,\n      \"minutes_amount\": null,\n      \"messages_amount\": null,\n      \"providerName\": \"esimgo\",\n      \"createdAt\": \"2026-01-10T10:00:00.000Z\",\n      \"updatedAt\": \"2026-02-01T10:00:00.000Z\"\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-bundles/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-bundles",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "120",
                          "description": "Bundle id."
                        }
                      ]
                    },
                    "description": "Returns one bundle by id (Strapi core findOne). `populate[prices][populate]=*&populate[esim]=*&populate[esim_region]=*&populate[provider]=*` gives prices with currency, the country/region and the provider descriptor.\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "My eSIMs with live usage",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/esim-datas",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "esim-datas"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Returns the eSIMs purchased by the **current user** (filter by user, not by company) together with live usage of every\nbundle (packet) on them, requested from the provider on each call (so the method can take several seconds).\nBy default eSIMs whose first bundle is a \"full\" eSIM (with minutes/SMS, `isFullEsim = true`) are excluded; pass any\n`filters[...]` (e.g. `filters[first_packet][isFullEsim][$eq]=true`, `filters[iccid][$eq]=8944...`) to replace the default filter.\nNo pagination: all matching eSIMs are returned, `meta` is empty.\n\nFor each eSIM: `iccid`, `lpa_code` (activation code for QR / manual install), `appleInstallUrl` (one-tap install link for iOS),\n`packets` — bundles newest first, each with `allowed_usage_mb`, `remaining_usage_mb`, `endTime`, `remaining_days`, `status`\n(provider status, e.g. `Active`, `Not Active`, `Expired`, `Finished`, `active`, `depleted`; derived from `endTime` when the\nprovider gives none; `null` — not activated yet), `mobileOperatorsInfo` — networks per country for the latest bundle,\n`first_packet` — the bundle the eSIM was bought with, including its country/region and image.\n\neSIMs are purchased through **Orders** (`POST /orders` with `esim: { \"id\": <bundleId> }`; to top up an existing eSIM add\n`\"iccid\"`). After the order is approved the eSIM appears here.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (read-only requests to the eSIM providers)."
              },
              "response": [
                {
                  "name": "200 eSIMs of the current user.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-datas",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-datas"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the eSIMs purchased by the **current user** (filter by user, not by company) together with live usage of every\nbundle (packet) on them, requested from the provider on each call (so the method can take several seconds).\nBy default eSIMs whose first bundle is a \"full\" eSIM (with minutes/SMS, `isFullEsim = true`) are excluded; pass any\n`filters[...]` (e.g. `filters[first_packet][isFullEsim][$eq]=true`, `filters[iccid][$eq]=8944...`) to replace the default filter.\nNo pagination: all matching eSIMs are returned, `meta` is empty.\n\nFor each eSIM: `iccid`, `lpa_code` (activation code for QR / manual install), `appleInstallUrl` (one-tap install link for iOS),\n`packets` — bundles newest first, each with `allowed_usage_mb`, `remaining_usage_mb`, `endTime`, `remaining_days`, `status`\n(provider status, e.g. `Active`, `Not Active`, `Expired`, `Finished`, `active`, `depleted`; derived from `endTime` when the\nprovider gives none; `null` — not activated yet), `mobileOperatorsInfo` — networks per country for the latest bundle,\n`first_packet` — the bundle the eSIM was bought with, including its country/region and image.\n\neSIMs are purchased through **Orders** (`POST /orders` with `esim: { \"id\": <bundleId> }`; to top up an existing eSIM add\n`\"iccid\"`). After the order is approved the eSIM appears here.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (read-only requests to the eSIM providers)."
                  },
                  "status": "eSIMs of the current user.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": [\n    {\n      \"id\": 15,\n      \"attributes\": {\n        \"iccid\": \"8944538532000012345\",\n        \"lpa_code\": \"LPA:1$rsp.example.com$ABCDEF-123456-GHIJKL\",\n        \"appleInstallUrl\": \"https://esimsetup.apple.com/esim_qrcode_provisioning?carddata=LPA:1$rsp.example.com$ABCDEF-123456-GHIJKL\",\n        \"packets\": [\n          {\n            \"id\": 31,\n            \"templateId\": \"esim_1GB_7D_AD_U\",\n            \"esim_packet\": {\n              \"id\": 120,\n              \"days_amount\": 7,\n              \"usage_amount\": 1,\n              \"isInfinity\": false,\n              \"isFullEsim\": false,\n              \"providerName\": \"esimgo\",\n              \"minutes_amount\": null,\n              \"messages_amount\": null,\n              \"createdAt\": \"2026-01-10T10:00:00.000Z\",\n              \"updatedAt\": \"2026-02-01T10:00:00.000Z\"\n            },\n            \"allowed_usage_mb\": 1000,\n            \"remaining_usage_mb\": 512.5,\n            \"endTime\": \"2026-03-17T09:00:00.000Z\",\n            \"remaining_days\": 5,\n            \"status\": \"active\"\n          }\n        ],\n        \"mobileOperatorsInfo\": [\n          {\n            \"iso_code\": \"AD\",\n            \"mobileNetworks\": [\n              \"Andorra Telecom\"\n            ]\n          }\n        ],\n        \"first_packet\": {\n          \"data\": {\n            \"id\": 120,\n            \"attributes\": {\n              \"days_amount\": 7,\n              \"usage_amount\": 1,\n              \"isInfinity\": false,\n              \"isFullEsim\": false,\n              \"providerName\": \"esimgo\",\n              \"minutes_amount\": null,\n              \"messages_amount\": null,\n              \"createdAt\": \"2026-01-10T10:00:00.000Z\",\n              \"updatedAt\": \"2026-02-01T10:00:00.000Z\",\n              \"esim\": {\n                \"data\": {\n                  \"id\": 4,\n                  \"attributes\": {\n                    \"name\": \"Andorra\",\n                    \"iso_code\": \"AD\",\n                    \"createdAt\": \"2026-01-10T10:00:00.000Z\",\n                    \"updatedAt\": \"2026-02-01T10:00:00.000Z\",\n                    \"image\": {\n                      \"data\": {\n                        \"id\": 501,\n                        \"attributes\": {\n                          \"url\": \"/uploads/Andorra_1a2b3c.jpg\",\n                          \"name\": \"Andorra.jpg\",\n                          \"mime\": \"image/jpeg\",\n                          \"width\": 612,\n                          \"height\": 388\n                        }\n                      }\n                    }\n                  }\n                }\n              },\n              \"esim_region\": {\n                \"data\": null\n              }\n            }\n          }\n        }\n      }\n    }\n  ],\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-datas",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-datas"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the eSIMs purchased by the **current user** (filter by user, not by company) together with live usage of every\nbundle (packet) on them, requested from the provider on each call (so the method can take several seconds).\nBy default eSIMs whose first bundle is a \"full\" eSIM (with minutes/SMS, `isFullEsim = true`) are excluded; pass any\n`filters[...]` (e.g. `filters[first_packet][isFullEsim][$eq]=true`, `filters[iccid][$eq]=8944...`) to replace the default filter.\nNo pagination: all matching eSIMs are returned, `meta` is empty.\n\nFor each eSIM: `iccid`, `lpa_code` (activation code for QR / manual install), `appleInstallUrl` (one-tap install link for iOS),\n`packets` — bundles newest first, each with `allowed_usage_mb`, `remaining_usage_mb`, `endTime`, `remaining_days`, `status`\n(provider status, e.g. `Active`, `Not Active`, `Expired`, `Finished`, `active`, `depleted`; derived from `endTime` when the\nprovider gives none; `null` — not activated yet), `mobileOperatorsInfo` — networks per country for the latest bundle,\n`first_packet` — the bundle the eSIM was bought with, including its country/region and image.\n\neSIMs are purchased through **Orders** (`POST /orders` with `esim: { \"id\": <bundleId> }`; to top up an existing eSIM add\n`\"iccid\"`). After the order is approved the eSIM appears here.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (read-only requests to the eSIM providers)."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-datas",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-datas"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Returns the eSIMs purchased by the **current user** (filter by user, not by company) together with live usage of every\nbundle (packet) on them, requested from the provider on each call (so the method can take several seconds).\nBy default eSIMs whose first bundle is a \"full\" eSIM (with minutes/SMS, `isFullEsim = true`) are excluded; pass any\n`filters[...]` (e.g. `filters[first_packet][isFullEsim][$eq]=true`, `filters[iccid][$eq]=8944...`) to replace the default filter.\nNo pagination: all matching eSIMs are returned, `meta` is empty.\n\nFor each eSIM: `iccid`, `lpa_code` (activation code for QR / manual install), `appleInstallUrl` (one-tap install link for iOS),\n`packets` — bundles newest first, each with `allowed_usage_mb`, `remaining_usage_mb`, `endTime`, `remaining_days`, `status`\n(provider status, e.g. `Active`, `Not Active`, `Expired`, `Finished`, `active`, `depleted`; derived from `endTime` when the\nprovider gives none; `null` — not activated yet), `mobileOperatorsInfo` — networks per country for the latest bundle,\n`first_packet` — the bundle the eSIM was bought with, including its country/region and image.\n\neSIMs are purchased through **Orders** (`POST /orders` with `esim: { \"id\": <bundleId> }`; to top up an existing eSIM add\n`\"iccid\"`). After the order is approved the eSIM appears here.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (read-only requests to the eSIM providers)."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "eSIM record",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/esim-datas/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "esim-datas",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "id",
                      "value": "15",
                      "description": "eSIM record id (from `GET /esim-datas`)."
                    }
                  ]
                },
                "description": "Returns the stored record of one eSIM by its id (Strapi core findOne) — **without** live usage from the provider\n(use `GET /esim-datas` for that). `populate[esim_packets][populate]=*` includes the attached bundles,\n`populate[first_packet]=*` — the first bundle, `populate[orders][fields][0]=orderId` — the orders it was bought/topped up with.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
              },
              "response": [
                {
                  "name": "200 eSIM record.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-datas/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-datas",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "eSIM record id (from `GET /esim-datas`)."
                        }
                      ]
                    },
                    "description": "Returns the stored record of one eSIM by its id (Strapi core findOne) — **without** live usage from the provider\n(use `GET /esim-datas` for that). `populate[esim_packets][populate]=*` includes the attached bundles,\n`populate[first_packet]=*` — the first bundle, `populate[orders][fields][0]=orderId` — the orders it was bought/topped up with.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "eSIM record.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 15,\n    \"attributes\": {\n      \"iccid\": \"8944538532000012345\",\n      \"provider\": \"esimgo\",\n      \"lpa_code\": \"LPA:1$rsp.example.com$ABCDEF-123456-GHIJKL\",\n      \"appleInstallUrl\": \"https://esimsetup.apple.com/esim_qrcode_provisioning?carddata=LPA:1$rsp.example.com$ABCDEF-123456-GHIJKL\",\n      \"createdAt\": \"2026-03-10T09:00:00.000Z\",\n      \"updatedAt\": \"2026-03-10T09:00:00.000Z\",\n      \"esim_packets\": [\n        {\n          \"id\": 31,\n          \"templateId\": \"esim_1GB_7D_AD_U\",\n          \"esim_packet\": {\n            \"data\": {\n              \"id\": 120,\n              \"attributes\": {\n                \"days_amount\": 7,\n                \"usage_amount\": 1,\n                \"isInfinity\": false,\n                \"isFullEsim\": false,\n                \"providerName\": \"esimgo\"\n              }\n            }\n          }\n        }\n      ]\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-datas/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-datas",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "eSIM record id (from `GET /esim-datas`)."
                        }
                      ]
                    },
                    "description": "Returns the stored record of one eSIM by its id (Strapi core findOne) — **without** live usage from the provider\n(use `GET /esim-datas` for that). `populate[esim_packets][populate]=*` includes the attached bundles,\n`populate[first_packet]=*` — the first bundle, `populate[orders][fields][0]=orderId` — the orders it was bought/topped up with.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-datas/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-datas",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "eSIM record id (from `GET /esim-datas`)."
                        }
                      ]
                    },
                    "description": "Returns the stored record of one eSIM by its id (Strapi core findOne) — **without** live usage from the provider\n(use `GET /esim-datas` for that). `populate[esim_packets][populate]=*` includes the attached bundles,\n`populate[first_packet]=*` — the first bundle, `populate[orders][fields][0]=orderId` — the orders it was bought/topped up with.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "404 Object not found.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-datas/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-datas",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "id",
                          "value": "15",
                          "description": "eSIM record id (from `GET /esim-datas`)."
                        }
                      ]
                    },
                    "description": "Returns the stored record of one eSIM by its id (Strapi core findOne) — **without** live usage from the provider\n(use `GET /esim-datas` for that). `populate[esim_packets][populate]=*` includes the attached bundles,\n`populate[first_packet]=*` — the first bundle, `populate[orders][fields][0]=orderId` — the orders it was bought/topped up with.\n\n\n**Required role:** Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None"
                  },
                  "status": "Object not found.",
                  "code": 404,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 404,\n    \"name\": \"NotFoundError\",\n    \"message\": \"Not Found\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Mobile networks of a bundle",
              "request": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/esim-datas/getMobileOperators/:bundleId",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "esim-datas",
                    "getMobileOperators",
                    ":bundleId"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "bundleId",
                      "value": "120",
                      "description": "Catalogue bundle id (from `GET /esim-bundles`)."
                    }
                  ]
                },
                "description": "Returns the mobile networks (operators) available with the given catalogue bundle, grouped by country, as reported by the\nbundle's provider (live request, may take a few seconds). The response is a **plain JSON array** without the `data` envelope.\n`mobileNetworks` is a list of operator names; for bundles of the `esimcard` provider it is a list of objects with the\nnetwork name and 2G/3G/4G/5G flags. An empty array means the provider no longer lists the bundle or has no network data.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (read-only request to the eSIM provider)."
              },
              "response": [
                {
                  "name": "200 Networks grouped by country.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-datas/getMobileOperators/:bundleId",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-datas",
                        "getMobileOperators",
                        ":bundleId"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "bundleId",
                          "value": "120",
                          "description": "Catalogue bundle id (from `GET /esim-bundles`)."
                        }
                      ]
                    },
                    "description": "Returns the mobile networks (operators) available with the given catalogue bundle, grouped by country, as reported by the\nbundle's provider (live request, may take a few seconds). The response is a **plain JSON array** without the `data` envelope.\n`mobileNetworks` is a list of operator names; for bundles of the `esimcard` provider it is a list of objects with the\nnetwork name and 2G/3G/4G/5G flags. An empty array means the provider no longer lists the bundle or has no network data.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (read-only request to the eSIM provider)."
                  },
                  "status": "Networks grouped by country.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "[\n  {\n    \"iso_code\": \"AD\",\n    \"mobileNetworks\": [\n      \"Andorra Telecom\"\n    ]\n  },\n  {\n    \"iso_code\": \"ES\",\n    \"mobileNetworks\": [\n      \"Movistar\",\n      \"Orange\",\n      \"Vodafone\"\n    ]\n  }\n]"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-datas/getMobileOperators/:bundleId",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-datas",
                        "getMobileOperators",
                        ":bundleId"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "bundleId",
                          "value": "120",
                          "description": "Catalogue bundle id (from `GET /esim-bundles`)."
                        }
                      ]
                    },
                    "description": "Returns the mobile networks (operators) available with the given catalogue bundle, grouped by country, as reported by the\nbundle's provider (live request, may take a few seconds). The response is a **plain JSON array** without the `data` envelope.\n`mobileNetworks` is a list of operator names; for bundles of the `esimcard` provider it is a list of objects with the\nnetwork name and 2G/3G/4G/5G flags. An empty array means the provider no longer lists the bundle or has no network data.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (read-only request to the eSIM provider)."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Unknown bundle id or provider error (the provider request failed).",
                  "originalRequest": {
                    "method": "GET",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/esim-datas/getMobileOperators/:bundleId",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "esim-datas",
                        "getMobileOperators",
                        ":bundleId"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "bundleId",
                          "value": "120",
                          "description": "Catalogue bundle id (from `GET /esim-bundles`)."
                        }
                      ]
                    },
                    "description": "Returns the mobile networks (operators) available with the given catalogue bundle, grouped by country, as reported by the\nbundle's provider (live request, may take a few seconds). The response is a **plain JSON array** without the `data` envelope.\n`mobileNetworks` is a list of operator names; for bundles of the `esimcard` provider it is a list of objects with the\nnetwork name and 2G/3G/4G/5G flags. An empty array means the provider no longer lists the bundle or has no network data.\n\n\n**Required role:** Public, Employee, Company owner (approved), Supervisor, Finance\n\n**Side effects:** None (read-only request to the eSIM provider)."
                  },
                  "status": "Unknown bundle id or provider error (the provider request failed).",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\"\n  }\n}"
                }
              ]
            }
          ]
        },
        {
          "name": "Integrations",
          "description": "CRM integrations and API tokens for external systems.",
          "item": [
            {
              "name": "Connect a CRM integration",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/companies/create-integration/:serviceName",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "companies",
                    "create-integration",
                    ":serviceName"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "serviceName",
                      "value": "keycrm",
                      "description": "CRM type."
                    }
                  ]
                },
                "description": "Connects a CRM to the company. One integration per CRM type. You provide the credentials of **your** CRM\naccount (API key, domain, webhook URL — see `IntegrationsFields`), and from then on the platform pushes call\nevents to the CRM automatically:\n* `Ringing` — incoming/outgoing call is ringing (SIP 100/180/183),\n* `inCall` — call answered (200 OK),\n* `NormalHangup` — call finished normally (200 after the dialog),\n* `Hangup` — call failed / busy / not answered (486 and other codes),\n* `Refered` — call transferred (302).\n\nEach event carries: `callId`, `from`, `to` (numbers without `+`), `callDirection` (true — incoming to the\ncompany, false — outgoing), `sip` / `sipTo` (employee SIP line as `<ext>domain<company-domain>`), `code`,\n`reason`, `callSetupTime`, `callStartTime`, `callEndTime` (Unix seconds), `ivr`, `group` (if the call went\nthrough an IVR/queue) and, when the recording is ready, `callRecord.url` (a follow-up event). Which events a\nCRM receives depends on the connector: most create a call/activity on hangup and attach the recording later;\nHubSpot/Pipedrive/Uspacy also create a contact for unknown numbers.\nBody is `{ \"data\": { ...fields } }`. Response: the company with the updated `integration` list.\nFor `zohocrm` use `POST /zohocrm/generate-tokens` instead; for `onebox` create the integration with\n`crmBaseUrl`, `login`, `restapipassword` and then call `POST /onebox/generate-token`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Stores the CRM credentials and enables automatic push of call events (and later call recordings) to the CRM; may create contacts/activities in the CRM.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"webhookUrl\": \"https://openapi.keycrm.app/v1/communication/call-route/********\",\n    \"active\": true\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Company with integrations (flat object).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/create-integration/:serviceName",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "create-integration",
                        ":serviceName"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "serviceName",
                          "value": "keycrm",
                          "description": "CRM type."
                        }
                      ]
                    },
                    "description": "Connects a CRM to the company. One integration per CRM type. You provide the credentials of **your** CRM\naccount (API key, domain, webhook URL — see `IntegrationsFields`), and from then on the platform pushes call\nevents to the CRM automatically:\n* `Ringing` — incoming/outgoing call is ringing (SIP 100/180/183),\n* `inCall` — call answered (200 OK),\n* `NormalHangup` — call finished normally (200 after the dialog),\n* `Hangup` — call failed / busy / not answered (486 and other codes),\n* `Refered` — call transferred (302).\n\nEach event carries: `callId`, `from`, `to` (numbers without `+`), `callDirection` (true — incoming to the\ncompany, false — outgoing), `sip` / `sipTo` (employee SIP line as `<ext>domain<company-domain>`), `code`,\n`reason`, `callSetupTime`, `callStartTime`, `callEndTime` (Unix seconds), `ivr`, `group` (if the call went\nthrough an IVR/queue) and, when the recording is ready, `callRecord.url` (a follow-up event). Which events a\nCRM receives depends on the connector: most create a call/activity on hangup and attach the recording later;\nHubSpot/Pipedrive/Uspacy also create a contact for unknown numbers.\nBody is `{ \"data\": { ...fields } }`. Response: the company with the updated `integration` list.\nFor `zohocrm` use `POST /zohocrm/generate-tokens` instead; for `onebox` create the integration with\n`crmBaseUrl`, `login`, `restapipassword` and then call `POST /onebox/generate-token`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Stores the CRM credentials and enables automatic push of call events (and later call recordings) to the CRM; may create contacts/activities in the CRM.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"webhookUrl\": \"https://openapi.keycrm.app/v1/communication/call-route/********\",\n    \"active\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Company with integrations (flat object).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 7,\n  \"Name\": \"Example LLC\",\n  \"integration\": [\n    {\n      \"id\": 2,\n      \"__component\": \"integration.keycrm\",\n      \"serviceName\": \"keycrm\",\n      \"keycrm\": {\n        \"id\": 5,\n        \"webhookUrl\": \"https://openapi.keycrm.app/v1/communication/call-route/********\",\n        \"active\": true,\n        \"createdAt\": \"2026-10-02T10:00:00.000Z\",\n        \"updatedAt\": \"2026-10-02T10:00:00.000Z\"\n      }\n    }\n  ]\n}"
                },
                {
                  "name": "400 Integration of this type already exists.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/create-integration/:serviceName",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "create-integration",
                        ":serviceName"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "serviceName",
                          "value": "keycrm",
                          "description": "CRM type."
                        }
                      ]
                    },
                    "description": "Connects a CRM to the company. One integration per CRM type. You provide the credentials of **your** CRM\naccount (API key, domain, webhook URL — see `IntegrationsFields`), and from then on the platform pushes call\nevents to the CRM automatically:\n* `Ringing` — incoming/outgoing call is ringing (SIP 100/180/183),\n* `inCall` — call answered (200 OK),\n* `NormalHangup` — call finished normally (200 after the dialog),\n* `Hangup` — call failed / busy / not answered (486 and other codes),\n* `Refered` — call transferred (302).\n\nEach event carries: `callId`, `from`, `to` (numbers without `+`), `callDirection` (true — incoming to the\ncompany, false — outgoing), `sip` / `sipTo` (employee SIP line as `<ext>domain<company-domain>`), `code`,\n`reason`, `callSetupTime`, `callStartTime`, `callEndTime` (Unix seconds), `ivr`, `group` (if the call went\nthrough an IVR/queue) and, when the recording is ready, `callRecord.url` (a follow-up event). Which events a\nCRM receives depends on the connector: most create a call/activity on hangup and attach the recording later;\nHubSpot/Pipedrive/Uspacy also create a contact for unknown numbers.\nBody is `{ \"data\": { ...fields } }`. Response: the company with the updated `integration` list.\nFor `zohocrm` use `POST /zohocrm/generate-tokens` instead; for `onebox` create the integration with\n`crmBaseUrl`, `login`, `restapipassword` and then call `POST /onebox/generate-token`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Stores the CRM credentials and enables automatic push of call events (and later call recordings) to the CRM; may create contacts/activities in the CRM.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"webhookUrl\": \"https://openapi.keycrm.app/v1/communication/call-route/********\",\n    \"active\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Integration of this type already exists.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Already Exists!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/create-integration/:serviceName",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "create-integration",
                        ":serviceName"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "serviceName",
                          "value": "keycrm",
                          "description": "CRM type."
                        }
                      ]
                    },
                    "description": "Connects a CRM to the company. One integration per CRM type. You provide the credentials of **your** CRM\naccount (API key, domain, webhook URL — see `IntegrationsFields`), and from then on the platform pushes call\nevents to the CRM automatically:\n* `Ringing` — incoming/outgoing call is ringing (SIP 100/180/183),\n* `inCall` — call answered (200 OK),\n* `NormalHangup` — call finished normally (200 after the dialog),\n* `Hangup` — call failed / busy / not answered (486 and other codes),\n* `Refered` — call transferred (302).\n\nEach event carries: `callId`, `from`, `to` (numbers without `+`), `callDirection` (true — incoming to the\ncompany, false — outgoing), `sip` / `sipTo` (employee SIP line as `<ext>domain<company-domain>`), `code`,\n`reason`, `callSetupTime`, `callStartTime`, `callEndTime` (Unix seconds), `ivr`, `group` (if the call went\nthrough an IVR/queue) and, when the recording is ready, `callRecord.url` (a follow-up event). Which events a\nCRM receives depends on the connector: most create a call/activity on hangup and attach the recording later;\nHubSpot/Pipedrive/Uspacy also create a contact for unknown numbers.\nBody is `{ \"data\": { ...fields } }`. Response: the company with the updated `integration` list.\nFor `zohocrm` use `POST /zohocrm/generate-tokens` instead; for `onebox` create the integration with\n`crmBaseUrl`, `login`, `restapipassword` and then call `POST /onebox/generate-token`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Stores the CRM credentials and enables automatic push of call events (and later call recordings) to the CRM; may create contacts/activities in the CRM.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"webhookUrl\": \"https://openapi.keycrm.app/v1/communication/call-route/********\",\n    \"active\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/create-integration/:serviceName",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "create-integration",
                        ":serviceName"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "serviceName",
                          "value": "keycrm",
                          "description": "CRM type."
                        }
                      ]
                    },
                    "description": "Connects a CRM to the company. One integration per CRM type. You provide the credentials of **your** CRM\naccount (API key, domain, webhook URL — see `IntegrationsFields`), and from then on the platform pushes call\nevents to the CRM automatically:\n* `Ringing` — incoming/outgoing call is ringing (SIP 100/180/183),\n* `inCall` — call answered (200 OK),\n* `NormalHangup` — call finished normally (200 after the dialog),\n* `Hangup` — call failed / busy / not answered (486 and other codes),\n* `Refered` — call transferred (302).\n\nEach event carries: `callId`, `from`, `to` (numbers without `+`), `callDirection` (true — incoming to the\ncompany, false — outgoing), `sip` / `sipTo` (employee SIP line as `<ext>domain<company-domain>`), `code`,\n`reason`, `callSetupTime`, `callStartTime`, `callEndTime` (Unix seconds), `ivr`, `group` (if the call went\nthrough an IVR/queue) and, when the recording is ready, `callRecord.url` (a follow-up event). Which events a\nCRM receives depends on the connector: most create a call/activity on hangup and attach the recording later;\nHubSpot/Pipedrive/Uspacy also create a contact for unknown numbers.\nBody is `{ \"data\": { ...fields } }`. Response: the company with the updated `integration` list.\nFor `zohocrm` use `POST /zohocrm/generate-tokens` instead; for `onebox` create the integration with\n`crmBaseUrl`, `login`, `restapipassword` and then call `POST /onebox/generate-token`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Stores the CRM credentials and enables automatic push of call events (and later call recordings) to the CRM; may create contacts/activities in the CRM.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"webhookUrl\": \"https://openapi.keycrm.app/v1/communication/call-route/********\",\n    \"active\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "500 Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/create-integration/:serviceName",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "create-integration",
                        ":serviceName"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "serviceName",
                          "value": "keycrm",
                          "description": "CRM type."
                        }
                      ]
                    },
                    "description": "Connects a CRM to the company. One integration per CRM type. You provide the credentials of **your** CRM\naccount (API key, domain, webhook URL — see `IntegrationsFields`), and from then on the platform pushes call\nevents to the CRM automatically:\n* `Ringing` — incoming/outgoing call is ringing (SIP 100/180/183),\n* `inCall` — call answered (200 OK),\n* `NormalHangup` — call finished normally (200 after the dialog),\n* `Hangup` — call failed / busy / not answered (486 and other codes),\n* `Refered` — call transferred (302).\n\nEach event carries: `callId`, `from`, `to` (numbers without `+`), `callDirection` (true — incoming to the\ncompany, false — outgoing), `sip` / `sipTo` (employee SIP line as `<ext>domain<company-domain>`), `code`,\n`reason`, `callSetupTime`, `callStartTime`, `callEndTime` (Unix seconds), `ivr`, `group` (if the call went\nthrough an IVR/queue) and, when the recording is ready, `callRecord.url` (a follow-up event). Which events a\nCRM receives depends on the connector: most create a call/activity on hangup and attach the recording later;\nHubSpot/Pipedrive/Uspacy also create a contact for unknown numbers.\nBody is `{ \"data\": { ...fields } }`. Response: the company with the updated `integration` list.\nFor `zohocrm` use `POST /zohocrm/generate-tokens` instead; for `onebox` create the integration with\n`crmBaseUrl`, `login`, `restapipassword` and then call `POST /onebox/generate-token`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Stores the CRM credentials and enables automatic push of call events (and later call recordings) to the CRM; may create contacts/activities in the CRM.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"webhookUrl\": \"https://openapi.keycrm.app/v1/communication/call-route/********\",\n    \"active\": true\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Internal error. Retry later; if it repeats, contact support with the request time and path.",
                  "code": 500,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 500,\n    \"name\": \"InternalServerError\",\n    \"message\": \"Internal Server Error\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Edit a CRM integration",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/companies/edit-integration/:serviceName/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "companies",
                    "edit-integration",
                    ":serviceName",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "serviceName",
                      "value": "keycrm",
                      "description": "CRM type."
                    },
                    {
                      "key": "id",
                      "value": "5",
                      "description": "Integration record id."
                    }
                  ]
                },
                "description": "Updates the credentials or the `active` flag of an existing integration. `id` is the integration record id\n(`integration[].<serviceName>.id` in `GET /companies/my`), not the component id. `active: false` pauses the\npush of call events without deleting the credentials. Body is `{ \"data\": { ...fields } }`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Changes stored CRM credentials; pausing/resuming call event push.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"data\": {\n    \"active\": false\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Updated integration record (flat object).",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/edit-integration/:serviceName/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "edit-integration",
                        ":serviceName",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "serviceName",
                          "value": "keycrm",
                          "description": "CRM type."
                        },
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Integration record id."
                        }
                      ]
                    },
                    "description": "Updates the credentials or the `active` flag of an existing integration. `id` is the integration record id\n(`integration[].<serviceName>.id` in `GET /companies/my`), not the component id. `active: false` pauses the\npush of call events without deleting the credentials. Body is `{ \"data\": { ...fields } }`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Changes stored CRM credentials; pausing/resuming call event push.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"active\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Updated integration record (flat object).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 5,\n  \"webhookUrl\": \"https://openapi.keycrm.app/v1/communication/call-route/********\",\n  \"active\": false,\n  \"createdAt\": \"2026-10-02T10:00:00.000Z\",\n  \"updatedAt\": \"2026-10-02T10:05:00.000Z\"\n}"
                },
                {
                  "name": "400 The company has no integration of this type.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/edit-integration/:serviceName/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "edit-integration",
                        ":serviceName",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "serviceName",
                          "value": "keycrm",
                          "description": "CRM type."
                        },
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Integration record id."
                        }
                      ]
                    },
                    "description": "Updates the credentials or the `active` flag of an existing integration. `id` is the integration record id\n(`integration[].<serviceName>.id` in `GET /companies/my`), not the component id. `active: false` pauses the\npush of call events without deleting the credentials. Body is `{ \"data\": { ...fields } }`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Changes stored CRM credentials; pausing/resuming call event push.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"active\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The company has no integration of this type.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Integration Not Found!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/edit-integration/:serviceName/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "edit-integration",
                        ":serviceName",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "serviceName",
                          "value": "keycrm",
                          "description": "CRM type."
                        },
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Integration record id."
                        }
                      ]
                    },
                    "description": "Updates the credentials or the `active` flag of an existing integration. `id` is the integration record id\n(`integration[].<serviceName>.id` in `GET /companies/my`), not the component id. `active: false` pauses the\npush of call events without deleting the credentials. Body is `{ \"data\": { ...fields } }`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Changes stored CRM credentials; pausing/resuming call event push.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"active\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/edit-integration/:serviceName/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "edit-integration",
                        ":serviceName",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "serviceName",
                          "value": "keycrm",
                          "description": "CRM type."
                        },
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Integration record id."
                        }
                      ]
                    },
                    "description": "Updates the credentials or the `active` flag of an existing integration. `id` is the integration record id\n(`integration[].<serviceName>.id` in `GET /companies/my`), not the component id. `active: false` pauses the\npush of call events without deleting the credentials. Body is `{ \"data\": { ...fields } }`.\n\n\n**Required role:** Company owner (approved), Supervisor\n\n**Side effects:** Changes stored CRM credentials; pausing/resuming call event push.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"data\": {\n    \"active\": false\n  }\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Disconnect a CRM integration",
              "request": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/companies/delete-integration/:serviceName/:id",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "companies",
                    "delete-integration",
                    ":serviceName",
                    ":id"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "key": "serviceName",
                      "value": "keycrm",
                      "description": "CRM type."
                    },
                    {
                      "key": "id",
                      "value": "5",
                      "description": "Integration record id."
                    }
                  ]
                },
                "description": "Deletes the integration record (credentials) and removes it from the company. Call events stop being pushed. `id` is the integration record id as in edit.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the stored CRM credentials; stops call event push."
              },
              "response": [
                {
                  "name": "200 Company with the remaining integrations (flat object).",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/delete-integration/:serviceName/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "delete-integration",
                        ":serviceName",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "serviceName",
                          "value": "keycrm",
                          "description": "CRM type."
                        },
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Integration record id."
                        }
                      ]
                    },
                    "description": "Deletes the integration record (credentials) and removes it from the company. Call events stop being pushed. `id` is the integration record id as in edit.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the stored CRM credentials; stops call event push."
                  },
                  "status": "Company with the remaining integrations (flat object).",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"id\": 7,\n  \"Name\": \"Example LLC\",\n  \"integration\": []\n}"
                },
                {
                  "name": "400 The company has no integration of this type.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/delete-integration/:serviceName/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "delete-integration",
                        ":serviceName",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "serviceName",
                          "value": "keycrm",
                          "description": "CRM type."
                        },
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Integration record id."
                        }
                      ]
                    },
                    "description": "Deletes the integration record (credentials) and removes it from the company. Call events stop being pushed. `id` is the integration record id as in edit.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the stored CRM credentials; stops call event push."
                  },
                  "status": "The company has no integration of this type.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Integration Not Found!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/delete-integration/:serviceName/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "delete-integration",
                        ":serviceName",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "serviceName",
                          "value": "keycrm",
                          "description": "CRM type."
                        },
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Integration record id."
                        }
                      ]
                    },
                    "description": "Deletes the integration record (credentials) and removes it from the company. Call events stop being pushed. `id` is the integration record id as in edit.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the stored CRM credentials; stops call event push."
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "DELETE",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/companies/delete-integration/:serviceName/:id",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "companies",
                        "delete-integration",
                        ":serviceName",
                        ":id"
                      ],
                      "query": [],
                      "variable": [
                        {
                          "key": "serviceName",
                          "value": "keycrm",
                          "description": "CRM type."
                        },
                        {
                          "key": "id",
                          "value": "5",
                          "description": "Integration record id."
                        }
                      ]
                    },
                    "description": "Deletes the integration record (credentials) and removes it from the company. Call events stop being pushed. `id` is the integration record id as in edit.\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Permanently deletes the stored CRM credentials; stops call event push."
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "OneBox: obtain API token",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/onebox/generate-token",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "onebox",
                    "generate-token"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Exchanges the OneBox login and REST API password for an API token at `<crmBaseUrl>/api/v2/token/get/` and\nstores the token in the company's existing `onebox` integration. Create the integration first\n(`POST /companies/create-integration/onebox`). Body is flat (no `data` wrapper).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Calls your OneBox instance and stores the received token in the integration.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"login\": \"owner@example.com\",\n  \"restapipassword\": \"********\",\n  \"crmBaseUrl\": \"https://example.1b.app\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Token obtained and stored.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/onebox/generate-token",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "onebox",
                        "generate-token"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Exchanges the OneBox login and REST API password for an API token at `<crmBaseUrl>/api/v2/token/get/` and\nstores the token in the company's existing `onebox` integration. Create the integration first\n(`POST /companies/create-integration/onebox`). Body is flat (no `data` wrapper).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Calls your OneBox instance and stores the received token in the integration.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"login\": \"owner@example.com\",\n  \"restapipassword\": \"********\",\n  \"crmBaseUrl\": \"https://example.1b.app\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Token obtained and stored.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "true"
                },
                {
                  "name": "400 OneBox rejected the credentials or the integration does not exist.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/onebox/generate-token",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "onebox",
                        "generate-token"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Exchanges the OneBox login and REST API password for an API token at `<crmBaseUrl>/api/v2/token/get/` and\nstores the token in the company's existing `onebox` integration. Create the integration first\n(`POST /companies/create-integration/onebox`). Body is flat (no `data` wrapper).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Calls your OneBox instance and stores the received token in the integration.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"login\": \"owner@example.com\",\n  \"restapipassword\": \"********\",\n  \"crmBaseUrl\": \"https://example.1b.app\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "OneBox rejected the credentials or the integration does not exist.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ApplicationError\",\n    \"message\": \"error Onebox create token\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/onebox/generate-token",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "onebox",
                        "generate-token"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Exchanges the OneBox login and REST API password for an API token at `<crmBaseUrl>/api/v2/token/get/` and\nstores the token in the company's existing `onebox` integration. Create the integration first\n(`POST /companies/create-integration/onebox`). Body is flat (no `data` wrapper).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Calls your OneBox instance and stores the received token in the integration.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"login\": \"owner@example.com\",\n  \"restapipassword\": \"********\",\n  \"crmBaseUrl\": \"https://example.1b.app\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/onebox/generate-token",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "onebox",
                        "generate-token"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Exchanges the OneBox login and REST API password for an API token at `<crmBaseUrl>/api/v2/token/get/` and\nstores the token in the company's existing `onebox` integration. Create the integration first\n(`POST /companies/create-integration/onebox`). Body is flat (no `data` wrapper).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Calls your OneBox instance and stores the received token in the integration.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"login\": \"owner@example.com\",\n  \"restapipassword\": \"********\",\n  \"crmBaseUrl\": \"https://example.1b.app\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Zoho CRM: connect via OAuth code",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/zohocrm/generate-tokens",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "zohocrm",
                    "generate-tokens"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Completes the Zoho OAuth flow: exchanges the authorization `code` (received on the platform's redirect URI\nafter the user grants access) for access/refresh tokens and creates the `zohocrm` integration of the company.\nTokens are refreshed automatically afterwards. The response body is empty; errors from Zoho are not returned\nto the client (only logged) — verify the result via `GET /companies/my` (`integration[].serviceName = \"zohocrm\"`).\nBody is flat (no `data` wrapper).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Calls Zoho OAuth, stores access/refresh tokens and creates the zohocrm integration (enables call event push).",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"code\": \"1000.abc123********\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "400 Integration already exists.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/zohocrm/generate-tokens",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "zohocrm",
                        "generate-tokens"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Completes the Zoho OAuth flow: exchanges the authorization `code` (received on the platform's redirect URI\nafter the user grants access) for access/refresh tokens and creates the `zohocrm` integration of the company.\nTokens are refreshed automatically afterwards. The response body is empty; errors from Zoho are not returned\nto the client (only logged) — verify the result via `GET /companies/my` (`integration[].serviceName = \"zohocrm\"`).\nBody is flat (no `data` wrapper).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Calls Zoho OAuth, stores access/refresh tokens and creates the zohocrm integration (enables call event push).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"code\": \"1000.abc123********\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Integration already exists.",
                  "code": 400,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 400,\n    \"name\": \"ValidationError\",\n    \"message\": \"Already Exists!\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/zohocrm/generate-tokens",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "zohocrm",
                        "generate-tokens"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Completes the Zoho OAuth flow: exchanges the authorization `code` (received on the platform's redirect URI\nafter the user grants access) for access/refresh tokens and creates the `zohocrm` integration of the company.\nTokens are refreshed automatically afterwards. The response body is empty; errors from Zoho are not returned\nto the client (only logged) — verify the result via `GET /companies/my` (`integration[].serviceName = \"zohocrm\"`).\nBody is flat (no `data` wrapper).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Calls Zoho OAuth, stores access/refresh tokens and creates the zohocrm integration (enables call event push).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"code\": \"1000.abc123********\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/zohocrm/generate-tokens",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "zohocrm",
                        "generate-tokens"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Completes the Zoho OAuth flow: exchanges the authorization `code` (received on the platform's redirect URI\nafter the user grants access) for access/refresh tokens and creates the `zohocrm` integration of the company.\nTokens are refreshed automatically afterwards. The response body is empty; errors from Zoho are not returned\nto the client (only logged) — verify the result via `GET /companies/my` (`integration[].serviceName = \"zohocrm\"`).\nBody is flat (no `data` wrapper).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Calls Zoho OAuth, stores access/refresh tokens and creates the zohocrm integration (enables call event push).",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"code\": \"1000.abc123********\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            },
            {
              "name": "Create an API token for an external system",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Authorization",
                    "value": "Bearer {{token}}"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/crm-token/create-token",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "crm-token",
                    "create-token"
                  ],
                  "query": [],
                  "variable": []
                },
                "description": "Creates a read-only API token for external systems (CRM, BI). The token is valid for **7 days** and grants\nonly: `GET /companies/my`, `GET /statistics/myStat` (call statistics) and `GET /companies/getEmployees`.\nPass it as `Authorization: Bearer <accessKey>`. The `accessKey` is returned only once — store it.\n**Note:** this permission is currently not granted to any client role; it must be enabled by the platform\nadministrator for your role before use (otherwise 403).\nBody is flat (no `data` wrapper).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates an API token (7-day lifespan) bound to the company.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"tokenName\": \"Bitrix sync\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "response": [
                {
                  "name": "200 Created token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/crm-token/create-token",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "crm-token",
                        "create-token"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a read-only API token for external systems (CRM, BI). The token is valid for **7 days** and grants\nonly: `GET /companies/my`, `GET /statistics/myStat` (call statistics) and `GET /companies/getEmployees`.\nPass it as `Authorization: Bearer <accessKey>`. The `accessKey` is returned only once — store it.\n**Note:** this permission is currently not granted to any client role; it must be enabled by the platform\nadministrator for your role before use (otherwise 403).\nBody is flat (no `data` wrapper).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates an API token (7-day lifespan) bound to the company.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"tokenName\": \"Bitrix sync\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Created token.",
                  "code": 200,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": {\n    \"id\": 3,\n    \"attributes\": {\n      \"createdAt\": \"2026-10-02T10:00:00.000Z\",\n      \"updatedAt\": \"2026-10-02T10:00:00.000Z\",\n      \"apiToken\": {\n        \"id\": 11,\n        \"name\": \"Bitrix sync crm\",\n        \"description\": \"api token to get access to crm\",\n        \"type\": \"custom\",\n        \"accessKey\": \"********\",\n        \"lifespan\": 604800000,\n        \"expiresAt\": \"2026-10-09T10:00:00.000Z\"\n      }\n    }\n  },\n  \"meta\": {}\n}"
                },
                {
                  "name": "401 Missing or invalid token.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/crm-token/create-token",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "crm-token",
                        "create-token"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a read-only API token for external systems (CRM, BI). The token is valid for **7 days** and grants\nonly: `GET /companies/my`, `GET /statistics/myStat` (call statistics) and `GET /companies/getEmployees`.\nPass it as `Authorization: Bearer <accessKey>`. The `accessKey` is returned only once — store it.\n**Note:** this permission is currently not granted to any client role; it must be enabled by the platform\nadministrator for your role before use (otherwise 403).\nBody is flat (no `data` wrapper).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates an API token (7-day lifespan) bound to the company.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"tokenName\": \"Bitrix sync\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "Missing or invalid token.",
                  "code": 401,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 401,\n    \"name\": \"UnauthorizedError\",\n    \"message\": \"Missing or invalid credentials\",\n    \"details\": {}\n  }\n}"
                },
                {
                  "name": "403 The role has no permission for this method, or the object belongs to another company.",
                  "originalRequest": {
                    "method": "POST",
                    "header": [
                      {
                        "key": "Accept",
                        "value": "application/json"
                      },
                      {
                        "key": "Authorization",
                        "value": "Bearer {{token}}"
                      },
                      {
                        "key": "Content-Type",
                        "value": "application/json"
                      }
                    ],
                    "url": {
                      "raw": "{{baseUrl}}/crm-token/create-token",
                      "host": [
                        "{{baseUrl}}"
                      ],
                      "path": [
                        "crm-token",
                        "create-token"
                      ],
                      "query": [],
                      "variable": []
                    },
                    "description": "Creates a read-only API token for external systems (CRM, BI). The token is valid for **7 days** and grants\nonly: `GET /companies/my`, `GET /statistics/myStat` (call statistics) and `GET /companies/getEmployees`.\nPass it as `Authorization: Bearer <accessKey>`. The `accessKey` is returned only once — store it.\n**Note:** this permission is currently not granted to any client role; it must be enabled by the platform\nadministrator for your role before use (otherwise 403).\nBody is flat (no `data` wrapper).\n\n\n**Required role:** Company owner (approved)\n\n**Side effects:** Creates an API token (7-day lifespan) bound to the company.",
                    "body": {
                      "mode": "raw",
                      "raw": "{\n  \"tokenName\": \"Bitrix sync\"\n}",
                      "options": {
                        "raw": {
                          "language": "json"
                        }
                      }
                    }
                  },
                  "status": "The role has no permission for this method, or the object belongs to another company.",
                  "code": 403,
                  "_postman_previewlanguage": "json",
                  "header": [
                    {
                      "key": "Content-Type",
                      "value": "application/json"
                    }
                  ],
                  "body": "{\n  \"data\": null,\n  \"error\": {\n    \"status\": 403,\n    \"name\": \"ForbiddenError\",\n    \"message\": \"Forbidden\",\n    \"details\": {}\n  }\n}"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}