openapi: 3.0.3 info: title: 'MobileSimPortal API v1' description: 'Stable v1 API reference for MobileSimPortal accounts, one-time mobile rentals, long-term mobile rentals, mobile proxies, and one-time number rates.' version: 1.0.0 servers: - url: 'https://mobilesimportal.com' tags: - name: Authentication description: 'Create and revoke bearer tokens for the current account.' - name: Account description: 'Read account information and current reference data used by rental requests.' - name: 'One-Time Mobile Rentals' description: 'Request one-time mobile numbers, check status and messages, and manage eligible reuse, rejection, and reply actions.' - name: 'Long-Term Mobile Rentals' description: 'Purchase and manage 30-day mobile-number rentals, including renewal settings, eligible number changes, messages, and replies.' - name: 'Mobile Proxies' description: 'Purchase and manage customer-owned mobile proxies, including plans, locations, credentials, and supported controls.' - name: 'One-Time Rates' description: 'List current customer pricing and availability for one-time mobile rentals.' components: securitySchemes: default: type: http scheme: bearer description: 'Create a 24-hour token with POST /api/create-token, then send it as Authorization: Bearer <token>. Store tokens securely. POST /api/invalidate-token invalidates only the bearer token used for that request. State-changing purchase and control endpoints require a unique Idempotency-Key header. LTR purchases and LTR SMS replies require UUID keys. Reuse the same key only for the exact same request; cached 202 responses do not become completed responses. Poll the status URL instead. A 409 response means the key is already in progress, was used with different input, or has an uncertain outcome that must be reviewed before retrying.' security: - default: [] paths: /api/create-token: post: summary: 'Create an API token' operationId: createAnAPIToken description: '' parameters: [] responses: "201": description: 'New 24-hour bearer token.' content: application/json: schema: type: object properties: success: type: boolean token: type: string required: - success - token examples: variant_1: summary: 'New 24-hour bearer token.' value: success: true token: '' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "400": description: 'Request is not eligible in its current state.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Request is not eligible in its current state.' value: success: false message: 'Bad request.' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'Authentication failed.' "422": description: 'Validation failed; errors is a map of field names to message arrays.' content: application/json: schema: type: object properties: message: type: string errors: type: object additionalProperties: type: array items: type: string required: - message - errors examples: variant_1: summary: 'Validation failed; errors is a map of field names to message arrays.' value: message: 'The given data was invalid.' errors: field: - 'The field is invalid.' tags: - Authentication requestBody: required: true content: application/json: schema: type: object properties: login: type: string description: 'Must be at least 3 characters. Must not be greater than 255 characters.' example: micxflzmhtjl nullable: false password: type: string description: 'Must be at least 6 characters. Must not be greater than 255 characters.' example: '&A~#l9?/1xjX' nullable: false required: - login - password security: [] /api/invalidate-token: post: summary: 'Revoke the current API token' operationId: revokeTheCurrentAPIToken description: '' parameters: [] responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Successful response.' value: success: true message: 'The current token has been invalidated.' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "400": description: 'Request is not eligible in its current state.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Request is not eligible in its current state.' value: success: false message: 'Bad request.' tags: - Authentication /api/profile-info: get: summary: 'Get account profile' operationId: getAccountProfile description: '' parameters: [] responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean balance: type: number 'swap credits': type: number 'personal data': type: object properties: email: type: string skype: type: string nullable: true telephone: type: string nullable: true signup: type: string nullable: true required: - email - skype - telephone - signup required: - success - balance - 'swap credits' - 'personal data' examples: variant_1: summary: 'Successful response.' value: success: true balance: 25.5 'swap credits': 1.5 'personal data': email: customer@example.com skype: null telephone: null signup: '13 Oct 2026 12:00' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' tags: - Account x-required-ability: 'account:read' /api/services: get: summary: 'List one-time rental services' operationId: listOneTimeRentalServices description: '' parameters: [] responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean data: type: array items: type: object properties: service: type: string price: anyOf: - type: number - type: string description: 'Numeric price, or legacy display string with remaining bulk entitlement.' available: anyOf: - type: integer - type: boolean - type: string required: - service - price - available required: - success - data examples: variant_1: summary: 'Successful response.' value: success: true data: - service: Unknown price: 0.5 available: 1 "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' tags: - Account x-required-ability: 'rentals:read' /api/states: get: summary: 'List supported U.S. states' operationId: listSupportedUSStates description: '' parameters: [] responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean data: type: array items: type: string required: - success - data examples: variant_1: summary: 'Successful response.' value: success: true data: - AL - NY "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' tags: - Account x-required-ability: 'rentals:read' /api/one-time-rent/one-time-rent-pins: post: summary: 'List one-time rental history' operationId: listOneTimeRentalHistory description: '' parameters: [] responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean data: type: array items: type: object properties: request: type: integer time: type: string service: type: string mdn: type: string sms_pin: type: string nullable: true sms_content: type: string nullable: true status: type: string billed: type: number required: - request - time - service - mdn - sms_pin - sms_content - status - billed required: - success - data examples: variant_1: summary: 'Successful response.' value: success: true data: - request: 11111111 time: '10/13/2026 12:00 PM' service: Unknown mdn: '16095550123' sms_pin: '123456' sms_content: 'Synthetic example message.' status: Success billed: 0.5 "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' tags: - 'One-Time Mobile Rentals' requestBody: required: false content: application/json: schema: type: object properties: status: type: number description: 'new: 0, success: 1, no pin: 2, reject: 5, expired: 6' example: 1 nullable: false service: type: string description: '' example: Unknown nullable: false mdn: type: number description: '' example: 12345678901 nullable: false offset: type: number description: '' example: 1 nullable: false limit: type: number description: '' example: 1 nullable: false x-required-ability: 'rentals:read' /api/one-time-rent/request: post: summary: 'Request a one-time mobile number' operationId: requestAOneTimeMobileNumber description: '' parameters: - in: header name: Idempotency-Key description: 'Required unique key. Replay only the exact same request; never use a new key after an unresolved outcome.' example: unique-request-001 schema: type: string minLength: 1 maxLength: 128 pattern: '^[A-Za-z0-9._:-]+$' required: true responses: "201": description: 'Number assigned. Accepted; poll priority-request-mdn for number assignment.' content: application/json: schema: anyOf: - type: object properties: success: type: boolean mdn: type: string request: type: integer required: - success - mdn - request - type: object properties: success: type: boolean status: type: string request: type: integer required: - success - status - request examples: variant_1: summary: 'Number assigned.' value: success: true mdn: '+1 (609) 555-0123' request: 11111111 variant_2: summary: 'Accepted; poll priority-request-mdn for number assignment.' value: success: true status: 'Awaiting MDN' request: 11111111 headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "409": description: 'Key conflict or unresolved outcome; do not retry with a new key.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Key conflict or unresolved outcome; do not retry with a new key.' value: success: false message: 'This operation is already in progress or has an unknown outcome. Contact support before retrying.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "422": description: 'Missing/invalid key or business-rule rejection.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Missing/invalid key or business-rule rejection.' value: success: false message: 'A valid Idempotency-Key header is required for this operation.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "402": description: 'Insufficient available credit.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Insufficient available credit.' value: success: false message: 'Please add balance to your account to use this service.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "503": description: 'Service unavailable; a mutation may still have an unresolved outcome. Do not retry blindly.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Service unavailable; a mutation may still have an unresolved outcome. Do not retry blindly.' value: success: false message: 'Service is unavailable.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "400": description: 'Legacy validation returns a direct field-to-messages map.' content: application/json: schema: type: object properties: service: type: array items: type: string required: - service examples: variant_1: summary: 'Legacy validation returns a direct field-to-messages map.' value: service: - 'The selected service is invalid.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' tags: - 'One-Time Mobile Rentals' requestBody: required: true content: application/json: schema: type: object properties: service: type: string description: "The service in response of Account/List services." example: Unknown nullable: false state: type: string description: "Optional two-letter state from Account/List states." example: AL nullable: false minLength: 2 maxLength: 2 markup: description: "Please input a desired markup to get your MDN request prioritized.\n Users who set higher markup will get their request fulfilled in the first place.\n Recommended markup: 10%." example: '10' nullable: false anyOf: - type: number minimum: 0 - type: string description: 'Numeric string representing a nonnegative value.' required: - service x-required-ability: 'rentals:write' /api/one-time-rent/priority-request-mdn: post: summary: 'Get a priority request number' operationId: getAPriorityRequestNumber description: '' parameters: [] responses: "200": description: 'Number assignment pending. Number assigned.' content: application/json: schema: anyOf: - type: object properties: success: type: boolean message: type: string required: - success - message - type: object properties: success: type: boolean mdn: type: string required: - success - mdn examples: variant_1: summary: 'Number assignment pending.' value: success: true message: 'Awaiting MDN' variant_2: summary: 'Number assigned.' value: success: true mdn: '+1 (609) 555-0123' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "400": description: 'Request is not eligible in its current state.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Request is not eligible in its current state.' value: success: false message: 'Bad request.' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' tags: - 'One-Time Mobile Rentals' requestBody: required: true content: application/json: schema: type: object properties: request: type: number description: "The request parameter in response of Request an MDN." example: 11111111 nullable: false required: - request x-required-ability: 'rentals:read' /api/one-time-rent/status: post: summary: 'Get request status' operationId: getRequestStatus description: '' parameters: [] responses: "200": description: 'Status payload in data; legacy opaque payload, not a fixed resource schema.' content: application/json: schema: type: object properties: success: type: boolean data: description: 'Legacy opaque JSON payload. Clients must not assume a fixed object or array shape.' required: - success - data examples: variant_1: summary: 'Status payload in data; legacy opaque payload, not a fixed resource schema.' value: success: true data: [] "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "400": description: 'Request is not eligible in its current state.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Request is not eligible in its current state.' value: success: false message: 'Bad request.' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' "503": description: 'Service unavailable; a mutation may still have an unresolved outcome. Do not retry blindly.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Service unavailable; a mutation may still have an unresolved outcome. Do not retry blindly.' value: success: false message: 'Service is unavailable.' "500": description: 'Request failed; mutation outcomes may be unresolved.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Request failed; mutation outcomes may be unresolved.' value: success: false message: 'Server error.' tags: - 'One-Time Mobile Rentals' requestBody: required: true content: application/json: schema: type: object properties: request: type: number description: "The request parameter in response of Request an MDN." example: 11111111 nullable: false required: - request x-required-ability: 'rentals:read' /api/one-time-rent/message: post: summary: 'Read a request message' operationId: readARequestMessage description: '' parameters: [] responses: "200": description: 'Message received. No message yet. Legacy not-found response; inspect success as well as HTTP status.' content: application/json: schema: anyOf: - type: object properties: success: type: boolean request: type: integer pin: type: string nullable: true message: type: string required: - success - request - pin - message - type: object properties: success: type: boolean message: type: string required: - success - message - type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Message received.' value: success: true request: 11111111 pin: '123456' message: 'Synthetic example message.' variant_2: summary: 'No message yet.' value: success: true message: 'A temporary mobile phone number will only remain active for about 15 minutes' variant_3: summary: 'Legacy not-found response; inspect success as well as HTTP status.' value: success: false message: 'Request not found.' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' tags: - 'One-Time Mobile Rentals' requestBody: required: true content: application/json: schema: type: object properties: request: type: number description: "The request parameter in response of Request an MDN." example: 11111111 nullable: false service: type: string description: "The service request parameter in Request an MDN." example: Unknown nullable: false mdn: oneOf: - type: string - type: integer description: 'Number from the request response; digits-only or formatted number accepted.' required: - request - mdn x-required-ability: 'rentals:read' /api/one-time-rent/reject: post: summary: 'Reject a request' operationId: rejectARequest description: '' parameters: - in: header name: Idempotency-Key description: 'Required unique key. Replay only the exact same request; never use a new key after an unresolved outcome.' example: unique-request-001 schema: type: string minLength: 1 maxLength: 128 pattern: '^[A-Za-z0-9._:-]+$' required: true responses: "200": description: 'Rejected; data is the legacy opaque acknowledgement.' content: application/json: schema: type: object properties: success: type: boolean data: description: 'Legacy opaque JSON payload. Clients must not assume a fixed object or array shape.' required: - success - data examples: variant_1: summary: 'Rejected; data is the legacy opaque acknowledgement.' value: success: true data: [] headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "400": description: 'Request is not eligible in its current state.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Request is not eligible in its current state.' value: success: false message: 'Bad request.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "409": description: 'Key conflict or unresolved outcome; do not retry with a new key.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Key conflict or unresolved outcome; do not retry with a new key.' value: success: false message: 'This operation is already in progress or has an unknown outcome. Contact support before retrying.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "422": description: 'Missing/invalid key or business-rule rejection.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Missing/invalid key or business-rule rejection.' value: success: false message: 'A valid Idempotency-Key header is required for this operation.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "503": description: 'Service unavailable; a mutation may still have an unresolved outcome. Do not retry blindly.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Service unavailable; a mutation may still have an unresolved outcome. Do not retry blindly.' value: success: false message: 'Service is unavailable.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "500": description: 'Request failed; mutation outcomes may be unresolved.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Request failed; mutation outcomes may be unresolved.' value: success: false message: 'Server error.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' tags: - 'One-Time Mobile Rentals' requestBody: required: true content: application/json: schema: type: object properties: request: type: number description: "The request parameter in response of Request an MDN." example: 11111111 nullable: false required: - request x-required-ability: 'rentals:write' /api/one-time-rent/reuse: post: summary: 'Reuse a one-time number' operationId: reuseAOneTimeNumber description: '' parameters: - in: header name: Idempotency-Key description: 'Required unique key. Replay only the exact same request; never use a new key after an unresolved outcome.' example: unique-request-001 schema: type: string minLength: 1 maxLength: 128 pattern: '^[A-Za-z0-9._:-]+$' required: true responses: "200": description: 'Reused number assigned.' content: application/json: schema: type: object properties: success: type: boolean mdn: type: string request: type: integer required: - success - mdn - request examples: variant_1: summary: 'Reused number assigned.' value: success: true mdn: '+1 (609) 555-0123' request: 11111111 headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "201": description: 'Accepted; waiting for number assignment.' content: application/json: schema: type: object properties: success: type: boolean status: type: string request: type: integer required: - success - status - request examples: variant_1: summary: 'Accepted; waiting for number assignment.' value: success: true status: 'Awaiting MDN' request: 11111111 headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "400": description: 'Request is not eligible in its current state.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Request is not eligible in its current state.' value: success: false message: 'Bad request.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "409": description: 'Key conflict or unresolved outcome; do not retry with a new key.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Key conflict or unresolved outcome; do not retry with a new key.' value: success: false message: 'This operation is already in progress or has an unknown outcome. Contact support before retrying.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "422": description: 'Missing/invalid key or business-rule rejection.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Missing/invalid key or business-rule rejection.' value: success: false message: 'A valid Idempotency-Key header is required for this operation.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "402": description: 'Insufficient available credit.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Insufficient available credit.' value: success: false message: 'Please add balance to your account to use this service.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "503": description: 'Service unavailable; a mutation may still have an unresolved outcome. Do not retry blindly.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Service unavailable; a mutation may still have an unresolved outcome. Do not retry blindly.' value: success: false message: 'Service is unavailable.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' tags: - 'One-Time Mobile Rentals' requestBody: required: true content: application/json: schema: type: object properties: request: type: number description: "The request parameter in response of Request an MDN." example: 11111111 nullable: false service: type: string description: "The service request parameter in Request an MDN." example: Unknown nullable: false required: - request x-required-ability: 'rentals:write' /api/one-time-rent/reply: post: summary: 'Reply to a one-time rental message' operationId: replyToAOneTimeRentalMessage description: '' parameters: - in: header name: Idempotency-Key description: 'Required unique key. Replay only the exact same request; never use a new key after an unresolved outcome.' example: unique-request-001 schema: type: string minLength: 1 maxLength: 128 pattern: '^[A-Za-z0-9._:-]+$' required: true responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Successful response.' value: success: true message: 'Reply has been sent.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "400": description: 'Request is not eligible in its current state.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Request is not eligible in its current state.' value: success: false message: 'Bad request.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "409": description: 'Key conflict or unresolved outcome; do not retry with a new key.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Key conflict or unresolved outcome; do not retry with a new key.' value: success: false message: 'This operation is already in progress or has an unknown outcome. Contact support before retrying.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "422": description: 'Missing/invalid key or business-rule rejection.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Missing/invalid key or business-rule rejection.' value: success: false message: 'A valid Idempotency-Key header is required for this operation.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "402": description: 'Insufficient available credit.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Insufficient available credit.' value: success: false message: 'Please add balance to your account to use this service.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "503": description: 'Service unavailable; a mutation may still have an unresolved outcome. Do not retry blindly.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Service unavailable; a mutation may still have an unresolved outcome. Do not retry blindly.' value: success: false message: 'Service is unavailable.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' tags: - 'One-Time Mobile Rentals' requestBody: required: true content: application/json: schema: type: object properties: request: type: number description: "The request parameter in response of Request an MDN." example: 11111111 nullable: false message: type: string description: '' example: 'Text the reply message ...' nullable: false required: - request - message x-required-ability: 'rentals:write' '/api/long-term-rentals/{rental}/esim-qr': post: summary: 'Retrieve an existing eSIM activation QR' operationId: retrieveAnExistingESIMActivationQR description: 'Requires a bearer token with rentals:read and account password confirmation. Customers and resellers on any portal may retrieve their own eligible active eSIM rental when QR retrieval is enabled. Returns base64 PNG data, not a public activation URL. Does not purchase, issue, replace, or reactivate an eSIM. Limited to five requests per minute, shared with the UI. No Idempotency-Key is required for this read-only retrieval.' parameters: [] responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean data: type: object properties: rental_id: type: integer nullable: true mime_type: type: string image_base64: type: string required: - rental_id - mime_type - image_base64 required: - success - data examples: variant_1: summary: 'Successful response.' value: success: true data: rental_id: 1234 mime_type: image/png image_base64: '' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' "404": description: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' value: message: 'Not Found' "422": description: 'Validation failed; errors is a map of field names to message arrays. Password confirmation failed.' content: application/json: schema: anyOf: - type: object properties: message: type: string errors: type: object additionalProperties: type: array items: type: string required: - message - errors - type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Validation failed; errors is a map of field names to message arrays.' value: message: 'The given data was invalid.' errors: field: - 'The field is invalid.' variant_2: summary: 'Password confirmation failed.' value: success: false message: 'Your password is incorrect.' "502": description: 'QR retrieval failed.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'QR retrieval failed.' value: success: false message: 'The eSIM QR code could not be retrieved.' tags: - 'Long-Term Mobile Rentals' requestBody: required: true content: application/json: schema: type: object properties: password: type: string description: 'Current account password for confirmation. Send only in the HTTPS JSON body; never in the URL or logs.' example: '' nullable: false required: - password x-required-ability: 'rentals:read' parameters: - in: path name: rental description: 'Owned active long-term rental ID.' example: 1234 required: true schema: type: integer '/api/long-term-rentals/purchase-requests/{purchaseRequest}': get: summary: 'Get a long-term rental purchase request' operationId: getALongTermRentalPurchaseRequest description: 'Read-only provisioning status. Use purchase_request_id from the 202 response (the original UUID Idempotency-Key). Poll this GET, not the purchase POST. A missing or non-owned request returns 404. Pending or unknown outcomes must not be retried with a new key.' parameters: [] responses: "200": description: 'Pending purchase request. Completed purchase request. Failed purchase request. Unknown purchase request.' content: application/json: schema: anyOf: - type: object properties: success: type: boolean data: type: object properties: purchase_request_id: type: string format: uuid status: type: string enum: - pending - completed - failed - unknown rental_id: type: integer nullable: true message: type: string created_at: type: string format: date-time updated_at: type: string format: date-time required: - purchase_request_id - status - rental_id - message - created_at - updated_at required: - success - data - type: object properties: success: type: boolean data: type: object properties: purchase_request_id: type: string format: uuid status: type: string enum: - pending - completed - failed - unknown rental_id: type: integer nullable: true message: type: string created_at: type: string format: date-time updated_at: type: string format: date-time required: - purchase_request_id - status - rental_id - message - created_at - updated_at required: - success - data - type: object properties: success: type: boolean data: type: object properties: purchase_request_id: type: string format: uuid status: type: string enum: - pending - completed - failed - unknown rental_id: type: integer nullable: true message: type: string created_at: type: string format: date-time updated_at: type: string format: date-time required: - purchase_request_id - status - rental_id - message - created_at - updated_at required: - success - data - type: object properties: success: type: boolean data: type: object properties: purchase_request_id: type: string format: uuid status: type: string enum: - pending - completed - failed - unknown rental_id: type: integer nullable: true message: type: string created_at: type: string format: date-time updated_at: type: string format: date-time required: - purchase_request_id - status - rental_id - message - created_at - updated_at required: - success - data examples: variant_1: summary: 'Pending purchase request.' value: success: true data: purchase_request_id: 123e4567-e89b-42d3-a456-426614174000 status: pending rental_id: null message: 'Your rental is being activated.' created_at: '2026-10-13T12:00:00-04:00' updated_at: '2026-10-13T12:01:00-04:00' variant_2: summary: 'Completed purchase request.' value: success: true data: purchase_request_id: 123e4567-e89b-42d3-a456-426614174000 status: completed rental_id: 1234 message: 'Your rental is ready.' created_at: '2026-10-13T12:00:00-04:00' updated_at: '2026-10-13T12:01:00-04:00' variant_3: summary: 'Failed purchase request.' value: success: true data: purchase_request_id: 123e4567-e89b-42d3-a456-426614174000 status: failed rental_id: null message: 'The purchase failed. Contact support before submitting another purchase.' created_at: '2026-10-13T12:00:00-04:00' updated_at: '2026-10-13T12:01:00-04:00' variant_4: summary: 'Unknown purchase request.' value: success: true data: purchase_request_id: 123e4567-e89b-42d3-a456-426614174000 status: unknown rental_id: null message: 'The purchase outcome is not yet confirmed. Do not submit another purchase; contact support if this persists.' created_at: '2026-10-13T12:00:00-04:00' updated_at: '2026-10-13T12:01:00-04:00' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' "404": description: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' value: message: 'Not Found' tags: - 'Long-Term Mobile Rentals' x-required-ability: 'rentals:read' parameters: - in: path name: purchaseRequest description: 'Purchase request UUID; not a rental ID.' example: 123e4567-e89b-42d3-a456-426614174000 required: true schema: type: string /api/long-term-rentals/products: get: summary: 'List available long-term rental products' operationId: listAvailableLongTermRentalProducts description: '' parameters: [] responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean data: type: array items: type: object properties: type: type: string name: type: string term_days: type: integer price: type: number requires: type: array items: type: string location_modes: type: array items: type: string states: type: array items: type: string required: - type - name - term_days - price - requires - location_modes - states required: - success - data examples: variant_1: summary: 'Successful response.' value: success: true data: - type: unlimited name: Unlimited term_days: 30 price: 12.5 requires: [] location_modes: - any - state - zip states: - AL - AK - AZ - AR - CA - CO - CT - DE - DC - FL - GA - HI - ID - IL - IN - IA - KS - KY - LA - ME - MD - MA - MI - MN - MS - MO - MT - NE - NV - NH - NJ - NM - NY - NC - ND - OH - OK - OR - PA - RI - SC - SD - TN - TX - UT - VT - VA - WA - WV - WI - WY "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' tags: - 'Long-Term Mobile Rentals' x-required-ability: 'rentals:read' /api/long-term-rentals: get: summary: 'List long-term rentals' operationId: listLongTermRentals description: '' parameters: - in: query name: status description: 'Filter by active, expired, or rejected.' example: active required: false schema: type: string enum: - active - expired - rejected - in: query name: page description: 'Page number.' example: 1 required: false schema: type: integer minimum: 1 default: 1 - in: query name: per_page description: 'Results per page (1-100).' example: 25 required: false schema: type: integer minimum: 1 default: 25 maximum: 100 responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean data: type: array items: type: object properties: id: type: integer number: type: string product_type: type: string service: type: string status: type: string auto_renew: type: boolean price: type: number purchased_at: type: string format: date-time nullable: true expires_at: type: string format: date-time nullable: true messages_count: type: integer required: - id - number - product_type - service - status - auto_renew - price - purchased_at - expires_at - messages_count meta: type: object properties: current_page: type: integer per_page: type: integer last_page: type: integer total: type: integer required: - current_page - per_page - last_page - total required: - success - data - meta examples: variant_1: summary: 'Successful response.' value: success: true data: - id: 1234 number: '16095550123' product_type: unlimited service: Unlimited status: active auto_renew: false price: 12.5 purchased_at: '2026-10-13T12:00:00-04:00' expires_at: '2026-11-12T12:00:00-05:00' messages_count: 2 meta: current_page: 1 per_page: 25 last_page: 1 total: 1 "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' "422": description: 'Validation failed; errors is a map of field names to message arrays.' content: application/json: schema: type: object properties: message: type: string errors: type: object additionalProperties: type: array items: type: string required: - message - errors examples: variant_1: summary: 'Validation failed; errors is a map of field names to message arrays.' value: message: 'The given data was invalid.' errors: field: - 'The field is invalid.' tags: - 'Long-Term Mobile Rentals' x-required-ability: 'rentals:read' post: summary: 'Purchase a long-term rental' operationId: purchaseALongTermRental description: 'Requires a unique Idempotency-Key header. Choose any US location (default), a state, or an explicit ZIP code. Location is a preference, not a guaranteed area code.' parameters: - in: header name: Idempotency-Key description: 'Required UUID. Replay only the exact same request; replay is not a status poll.' example: 123e4567-e89b-42d3-a456-426614174000 schema: type: string minLength: 1 maxLength: 128 pattern: '^[A-Za-z0-9._:-]+$' format: uuid required: true responses: "202": description: 'Accepted, not activated. Poll status_url. Acceptance unconfirmed; do not submit another purchase.' content: application/json: schema: anyOf: - type: object properties: success: type: boolean pending: type: boolean purchase_request_id: type: string format: uuid status_url: type: string message: type: string balance: type: number required: - success - pending - purchase_request_id - status_url - message - balance - type: object properties: success: type: boolean pending: type: boolean purchase_request_id: type: string format: uuid status_url: type: string message: type: string balance: type: number required: - success - pending - purchase_request_id - status_url - message - balance examples: variant_1: summary: 'Accepted, not activated. Poll status_url.' value: success: true pending: true purchase_request_id: 123e4567-e89b-42d3-a456-426614174000 status_url: /api/long-term-rentals/purchase-requests/123e4567-e89b-42d3-a456-426614174000 message: 'Your Unlimited SMS mobile number is being provisioned. It will appear here after activation completes.' balance: 75.5 variant_2: summary: 'Acceptance unconfirmed; do not submit another purchase.' value: success: true pending: true purchase_request_id: 123e4567-e89b-42d3-a456-426614174000 status_url: /api/long-term-rentals/purchase-requests/123e4567-e89b-42d3-a456-426614174000 message: 'The request was not confirmed in time. The activation is being reconciled and your balance remains reserved.' balance: 75.5 headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "409": description: 'Key conflict or unresolved outcome; do not retry with a new key.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Key conflict or unresolved outcome; do not retry with a new key.' value: success: false message: 'This operation is already in progress or has an unknown outcome. Contact support before retrying.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "422": description: 'Missing/invalid key or business-rule rejection. Validation failed; errors is a map of field names to message arrays.' content: application/json: schema: anyOf: - type: object properties: success: type: boolean message: type: string required: - success - message - type: object properties: message: type: string errors: type: object additionalProperties: type: array items: type: string required: - message - errors examples: variant_1: summary: 'Missing/invalid key or business-rule rejection.' value: success: false message: 'A valid Idempotency-Key header is required for this operation.' variant_2: summary: 'Validation failed; errors is a map of field names to message arrays.' value: message: 'The given data was invalid.' errors: field: - 'The field is invalid.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "402": description: 'Insufficient available credit.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Insufficient available credit.' value: success: false message: 'Please add balance to your account to use this service.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' tags: - 'Long-Term Mobile Rentals' requestBody: required: true content: application/json: schema: type: object properties: product_type: type: string description: 'unlimited (the only available long-term product).' example: unlimited nullable: false enum: - unlimited location_mode: type: string description: 'any (default), state, or zip. Omit to infer from zipcode or state.' example: state nullable: false enum: - any - state - zip state: type: string description: 'Two-letter US state or DC code. Required for state mode.' example: NY nullable: false minLength: 2 maxLength: 2 enum: - AL - AK - AZ - AR - CA - CO - CT - DE - DC - FL - GA - HI - ID - IL - IN - IA - KS - KY - LA - ME - MD - MA - MI - MN - MS - MO - MT - NE - NV - NH - NJ - NM - NY - NC - ND - OH - OK - OR - PA - RI - SC - SD - TN - TX - UT - VT - VA - WA - WV - WI - WY zipcode: type: string description: 'Five-digit ZIP for zip mode. Existing ZIP-only requests remain supported.' example: null nullable: false pattern: '^[0-9]{5}$' required: - product_type description: 'Omit location inputs for any US location. State mode requires state and prohibits zipcode; ZIP mode requires a five-digit zipcode and prohibits state. Without location_mode, nonempty zipcode infers zip, otherwise nonempty state infers state, otherwise any. State is trimmed/uppercased. Location is a preference, not an area-code guarantee.' x-required-ability: 'rentals:write' '/api/long-term-rentals/{rental}': get: summary: 'Get a long-term rental' operationId: getALongTermRental description: '' parameters: [] responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean data: type: object properties: id: type: integer number: type: string product_type: type: string service: type: string status: type: string auto_renew: type: boolean price: type: number purchased_at: type: string format: date-time nullable: true expires_at: type: string format: date-time nullable: true messages_count: type: integer capabilities: type: object properties: messages: type: boolean reply: type: boolean renew: type: boolean auto_renew: type: boolean number_change: type: boolean required: - messages - reply - renew - auto_renew - number_change required: - id - number - product_type - service - status - auto_renew - price - purchased_at - expires_at - messages_count - capabilities required: - success - data examples: variant_1: summary: 'Successful response.' value: success: true data: id: 1234 number: '16095550123' product_type: unlimited service: Unlimited status: active auto_renew: false price: 12.5 purchased_at: '2026-10-13T12:00:00-04:00' expires_at: '2026-11-12T12:00:00-05:00' messages_count: 2 capabilities: messages: true reply: false renew: true auto_renew: true number_change: false "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' "404": description: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' value: message: 'Not Found' tags: - 'Long-Term Mobile Rentals' x-required-ability: 'rentals:read' parameters: - in: path name: rental description: 'Rental ID.' example: 1234 required: true schema: type: integer '/api/long-term-rentals/{rental}/renew': post: summary: 'Renew a long-term rental' operationId: renewALongTermRental description: '' parameters: - in: header name: Idempotency-Key description: 'Required unique key. Replay only the exact same request; never use a new key after an unresolved outcome.' example: unique-request-001 schema: type: string minLength: 1 maxLength: 128 pattern: '^[A-Za-z0-9._:-]+$' required: true responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean replayed: type: boolean message: type: string expires: type: string balance: type: number required: - success - replayed - message - expires - balance examples: variant_1: summary: 'Successful response.' value: success: true replayed: false message: 'Rental renewed for another term.' expires: '11/12/2026 12:00 PM' balance: 50.5 headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "404": description: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' value: message: 'Not Found' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "409": description: 'Key conflict or unresolved outcome; do not retry with a new key.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Key conflict or unresolved outcome; do not retry with a new key.' value: success: false message: 'This operation is already in progress or has an unknown outcome. Contact support before retrying.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "422": description: 'Missing/invalid key or business-rule rejection.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Missing/invalid key or business-rule rejection.' value: success: false message: 'A valid Idempotency-Key header is required for this operation.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "402": description: 'Insufficient available credit.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Insufficient available credit.' value: success: false message: 'Please add balance to your account to use this service.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' tags: - 'Long-Term Mobile Rentals' x-required-ability: 'rentals:write' parameters: - in: path name: rental description: 'Rental ID.' example: 1234 required: true schema: type: integer '/api/long-term-rentals/{rental}/auto-renew': post: summary: 'Set automatic renewal' operationId: setAutomaticRenewal description: '' parameters: - in: header name: Idempotency-Key description: 'Required unique key. Replay only the exact same request; never use a new key after an unresolved outcome.' example: unique-request-001 schema: type: string minLength: 1 maxLength: 128 pattern: '^[A-Za-z0-9._:-]+$' required: true responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean data: type: object properties: id: type: integer number: type: string product_type: type: string service: type: string status: type: string auto_renew: type: boolean price: type: number purchased_at: type: string format: date-time nullable: true expires_at: type: string format: date-time nullable: true messages_count: type: integer required: - id - number - product_type - service - status - auto_renew - price - purchased_at - expires_at - messages_count required: - success - data examples: variant_1: summary: 'Successful response.' value: success: true data: id: 1234 number: '16095550123' product_type: unlimited service: Unlimited status: active auto_renew: false price: 12.5 purchased_at: '2026-10-13T12:00:00-04:00' expires_at: '2026-11-12T12:00:00-05:00' messages_count: 2 headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "404": description: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' value: message: 'Not Found' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "409": description: 'Key conflict or unresolved outcome; do not retry with a new key.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Key conflict or unresolved outcome; do not retry with a new key.' value: success: false message: 'This operation is already in progress or has an unknown outcome. Contact support before retrying.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "422": description: 'Missing/invalid key or business-rule rejection. Validation failed; errors is a map of field names to message arrays.' content: application/json: schema: anyOf: - type: object properties: success: type: boolean message: type: string required: - success - message - type: object properties: message: type: string errors: type: object additionalProperties: type: array items: type: string required: - message - errors examples: variant_1: summary: 'Missing/invalid key or business-rule rejection.' value: success: false message: 'A valid Idempotency-Key header is required for this operation.' variant_2: summary: 'Validation failed; errors is a map of field names to message arrays.' value: message: 'The given data was invalid.' errors: field: - 'The field is invalid.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' tags: - 'Long-Term Mobile Rentals' requestBody: required: true content: application/json: schema: type: object properties: enabled: type: boolean description: 'Whether this rental should renew automatically.' example: true nullable: false required: - enabled x-required-ability: 'rentals:write' parameters: - in: path name: rental description: 'Rental ID.' example: 1234 required: true schema: type: integer '/api/long-term-rentals/{rental}/number-change': post: summary: 'Request an Unlimited number change' operationId: requestAnUnlimitedNumberChange description: 'Available only when the current Unlimited rental is eligible and number changes are enabled. Requires a unique Idempotency-Key header.' parameters: - in: header name: Idempotency-Key description: 'Required unique key. Replay only the exact same request; never use a new key after an unresolved outcome.' example: unique-request-001 schema: type: string minLength: 1 maxLength: 128 pattern: '^[A-Za-z0-9._:-]+$' required: true responses: "202": description: 'Accepted; read the rental until its number changes. Contact support if unresolved.' content: application/json: schema: type: object properties: success: type: boolean pending: type: boolean message: type: string required: - success - pending - message examples: variant_1: summary: 'Accepted; read the rental until its number changes. Contact support if unresolved.' value: success: true pending: true message: 'Number change submitted. The new number will appear after confirmation.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "404": description: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' value: message: 'Not Found' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "409": description: 'Key conflict or unresolved outcome; do not retry with a new key.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Key conflict or unresolved outcome; do not retry with a new key.' value: success: false message: 'This operation is already in progress or has an unknown outcome. Contact support before retrying.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "422": description: 'Missing/invalid key or business-rule rejection.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Missing/invalid key or business-rule rejection.' value: success: false message: 'A valid Idempotency-Key header is required for this operation.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' tags: - 'Long-Term Mobile Rentals' x-required-ability: 'rentals:write' parameters: - in: path name: rental description: 'Rental ID.' example: 1234 required: true schema: type: integer '/api/long-term-rentals/{rental}/messages': get: summary: 'List long-term rental messages' operationId: listLongTermRentalMessages description: '' parameters: - in: query name: page description: 'Page number.' example: 1 required: false schema: type: integer minimum: 1 default: 1 - in: query name: per_page description: 'Results per page (1-100).' example: 25 required: false schema: type: integer minimum: 1 default: 25 maximum: 100 responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean data: type: array items: type: object properties: id: type: integer direction: type: string from: type: string message: type: string pin: type: string nullable: true received_at: type: string format: date-time nullable: true reply_available: type: boolean required: - id - direction - from - message - pin - received_at - reply_available meta: type: object properties: current_page: type: integer per_page: type: integer last_page: type: integer total: type: integer required: - current_page - per_page - last_page - total required: - success - data - meta examples: variant_1: summary: 'Successful response.' value: success: true data: - id: 5678 direction: inbound from: '16095550999' message: 'Synthetic example message.' pin: '123456' received_at: '2026-10-13T12:00:00-04:00' reply_available: false meta: current_page: 1 per_page: 25 last_page: 1 total: 1 "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' "404": description: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' value: message: 'Not Found' "422": description: 'Validation failed; errors is a map of field names to message arrays.' content: application/json: schema: type: object properties: message: type: string errors: type: object additionalProperties: type: array items: type: string required: - message - errors examples: variant_1: summary: 'Validation failed; errors is a map of field names to message arrays.' value: message: 'The given data was invalid.' errors: field: - 'The field is invalid.' tags: - 'Long-Term Mobile Rentals' x-required-ability: 'rentals:read' parameters: - in: path name: rental description: 'Rental ID.' example: 1234 required: true schema: type: integer '/api/long-term-rentals/{rental}/messages/{message}/reply': post: summary: 'Reply to a long-term rental message' operationId: replyToALongTermRentalMessage description: 'Requires a unique Idempotency-Key header and an eligible rental with outbound messaging enabled.' parameters: - in: header name: Idempotency-Key description: 'Required UUID. Replay only the exact same request; replay is not a status poll.' example: 123e4567-e89b-42d3-a456-426614174000 schema: type: string minLength: 1 maxLength: 128 pattern: '^[A-Za-z0-9._:-]+$' format: uuid required: true responses: "200": description: 'SMS accepted.' content: application/json: schema: type: object properties: success: type: boolean sent: type: boolean pending: type: boolean duplicate: type: boolean required: - success - sent - pending - duplicate examples: variant_1: summary: 'SMS accepted.' value: success: true sent: true pending: false duplicate: false headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "202": description: 'Earlier SMS request unresolved; do not send with a new key.' content: application/json: schema: type: object properties: success: type: boolean sent: type: boolean pending: type: boolean duplicate: type: boolean required: - success - sent - pending - duplicate examples: variant_1: summary: 'Earlier SMS request unresolved; do not send with a new key.' value: success: true sent: false pending: true duplicate: true headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "404": description: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' value: message: 'Not Found' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "409": description: 'Key conflict or unresolved outcome; do not retry with a new key.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Key conflict or unresolved outcome; do not retry with a new key.' value: success: false message: 'This operation is already in progress or has an unknown outcome. Contact support before retrying.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "422": description: 'Missing/invalid key or business-rule rejection. Validation failed; errors is a map of field names to message arrays.' content: application/json: schema: anyOf: - type: object properties: success: type: boolean message: type: string required: - success - message - type: object properties: message: type: string errors: type: object additionalProperties: type: array items: type: string required: - message - errors examples: variant_1: summary: 'Missing/invalid key or business-rule rejection.' value: success: false message: 'A valid Idempotency-Key header is required for this operation.' variant_2: summary: 'Validation failed; errors is a map of field names to message arrays.' value: message: 'The given data was invalid.' errors: field: - 'The field is invalid.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' tags: - 'Long-Term Mobile Rentals' requestBody: required: true content: application/json: schema: type: object properties: text: type: string description: 'Nonblank after trimming, maximum 160 UTF-8 bytes (not characters).' example: 'Your verification code was received.' nullable: false required: - text x-required-ability: 'rentals:write' parameters: - in: path name: rental description: 'Rental ID.' example: 1234 required: true schema: type: integer - in: path name: message description: 'Inbound message ID.' example: 5678 required: true schema: type: integer /api/mobile-proxies/plans: get: summary: 'List mobile proxy plans' operationId: listMobileProxyPlans description: '' parameters: [] responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean data: type: array items: type: object properties: id: type: string name: type: string term_minutes: type: integer nullable: true price: type: number nullable: true purchase_available: type: boolean renewal_policy: type: string required: - id - name - term_minutes - price - purchase_available - renewal_policy required: - success - data examples: variant_1: summary: 'Successful response.' value: success: true data: - id: day name: 24-Hour term_minutes: 1440 price: 20.5 purchase_available: true renewal_policy: manual "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' "503": description: 'Service unavailable; a mutation may still have an unresolved outcome. Do not retry blindly.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Service unavailable; a mutation may still have an unresolved outcome. Do not retry blindly.' value: success: false message: 'Service is unavailable.' tags: - 'Mobile Proxies' x-required-ability: 'proxies:read' /api/mobile-proxies/locations: get: summary: 'List current U.S. proxy locations' operationId: listCurrentUSProxyLocations description: '' parameters: [] responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean data: type: array items: type: object properties: id: type: string label: type: string required: - id - label required: - success - data examples: variant_1: summary: 'Successful response.' value: success: true data: - id: new_york_1 label: 'New York, NY' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' "503": description: 'Service unavailable; a mutation may still have an unresolved outcome. Do not retry blindly.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Service unavailable; a mutation may still have an unresolved outcome. Do not retry blindly.' value: success: false message: 'Service is unavailable.' tags: - 'Mobile Proxies' x-required-ability: 'proxies:read' /api/mobile-proxies: get: summary: 'List mobile proxy orders' operationId: listMobileProxyOrders description: '' parameters: - in: query name: status description: 'Filter by active or expired.' example: active required: false schema: type: string enum: - active - expired - in: query name: page description: 'Page number.' example: 1 required: false schema: type: integer minimum: 1 default: 1 - in: query name: per_page description: 'Results per page (1-100).' example: 25 required: false schema: type: integer minimum: 1 default: 25 maximum: 100 responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean data: type: array items: type: object properties: id: type: integer plan: type: string renewal_status: type: string status: type: string price: type: number nullable: true term_minutes: type: integer nullable: true started_at: type: string format: date-time expires_at: type: string format: date-time nullable: true location: type: string nullable: true rotation: type: string nullable: true rotation_mode: type: string nullable: true required: - id - plan - renewal_status - status - price - term_minutes - started_at - expires_at - location - rotation - rotation_mode meta: type: object properties: current_page: type: integer per_page: type: integer last_page: type: integer total: type: integer required: - current_page - per_page - last_page - total required: - success - data - meta examples: variant_1: summary: 'Successful response.' value: success: true data: - id: 4321 plan: day renewal_status: idle status: active price: 20.5 term_minutes: 1440 started_at: '2026-10-13T12:00:00-04:00' expires_at: '2026-10-14T12:00:00-04:00' location: 'New York, NY' rotation: 10m rotation_mode: same_city meta: current_page: 1 per_page: 25 last_page: 1 total: 1 "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' "422": description: 'Validation failed; errors is a map of field names to message arrays.' content: application/json: schema: type: object properties: message: type: string errors: type: object additionalProperties: type: array items: type: string required: - message - errors examples: variant_1: summary: 'Validation failed; errors is a map of field names to message arrays.' value: message: 'The given data was invalid.' errors: field: - 'The field is invalid.' tags: - 'Mobile Proxies' x-required-ability: 'proxies:read' post: summary: 'Purchase a mobile proxy' operationId: purchaseAMobileProxy description: 'Requires a unique Idempotency-Key header. Checkout remains fail-closed when availability, customer credit, or account eligibility cannot be verified.' parameters: - in: header name: Idempotency-Key description: 'Required unique key. Replay only the exact same request; never use a new key after an unresolved outcome.' example: unique-request-001 schema: type: string minLength: 1 maxLength: 128 pattern: '^[A-Za-z0-9._:-]+$' required: true responses: "201": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean data: type: object properties: id: type: integer plan: type: string renewal_status: type: string status: type: string price: type: number nullable: true term_minutes: type: integer nullable: true started_at: type: string format: date-time expires_at: type: string format: date-time nullable: true location: type: string nullable: true rotation: type: string nullable: true rotation_mode: type: string nullable: true connection: type: object properties: host: type: string nullable: true http_port: type: integer nullable: true socks5_port: type: integer nullable: true username: type: string nullable: true password: type: string nullable: true required: - host - http_port - socks5_port - username - password nullable: true allowlist: type: object properties: protocol: type: string nullable: true addresses: type: array items: type: string required: - protocol - addresses renewal: type: object properties: available: anyOf: - type: integer - type: boolean - type: string status: type: string price: type: number nullable: true term_minutes: type: integer nullable: true policy: type: string required: - available - status - price - term_minutes - policy capabilities: type: object properties: renew: type: boolean rotate: type: boolean relocate: type: boolean schedule_rotation: type: boolean allowlist: type: boolean required: - renew - rotate - relocate - schedule_rotation - allowlist required: - id - plan - renewal_status - status - price - term_minutes - started_at - expires_at - location - rotation - rotation_mode - connection - allowlist - renewal - capabilities required: - success - data examples: variant_1: summary: 'Successful response.' value: success: true data: id: 4321 plan: day renewal_status: idle status: active price: 20.5 term_minutes: 1440 started_at: '2026-10-13T12:00:00-04:00' expires_at: '2026-10-14T12:00:00-04:00' location: 'New York, NY' rotation: 10m rotation_mode: same_city connection: host: proxy.example.invalid http_port: 8080 socks5_port: 1080 username: '' password: '' allowlist: protocol: socks5 addresses: - 203.0.113.10 renewal: available: true status: available price: 20.5 term_minutes: 1440 policy: manual capabilities: renew: true rotate: true relocate: true schedule_rotation: true allowlist: true headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "409": description: 'Key conflict or unresolved outcome; do not retry with a new key.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Key conflict or unresolved outcome; do not retry with a new key.' value: success: false message: 'This operation is already in progress or has an unknown outcome. Contact support before retrying.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "422": description: 'Missing/invalid key or business-rule rejection. Validation failed; errors is a map of field names to message arrays.' content: application/json: schema: anyOf: - type: object properties: success: type: boolean message: type: string required: - success - message - type: object properties: message: type: string errors: type: object additionalProperties: type: array items: type: string required: - message - errors examples: variant_1: summary: 'Missing/invalid key or business-rule rejection.' value: success: false message: 'A valid Idempotency-Key header is required for this operation.' variant_2: summary: 'Validation failed; errors is a map of field names to message arrays.' value: message: 'The given data was invalid.' errors: field: - 'The field is invalid.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "402": description: 'Insufficient available credit.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Insufficient available credit.' value: success: false message: 'Please add balance to your account to use this service.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' tags: - 'Mobile Proxies' requestBody: required: true content: application/json: schema: type: object properties: plan: type: string description: 'Plan ID from the plans endpoint.' example: day nullable: false maxLength: 32 location: type: string description: 'Optional location ID from the locations endpoint.' example: new_york_1 nullable: false maxLength: 96 required: - plan x-required-ability: 'proxies:write' '/api/mobile-proxies/{proxy}': get: summary: 'Get a mobile proxy' operationId: getAMobileProxy description: '' parameters: [] responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean data: type: object properties: id: type: integer plan: type: string renewal_status: type: string status: type: string price: type: number nullable: true term_minutes: type: integer nullable: true started_at: type: string format: date-time expires_at: type: string format: date-time nullable: true location: type: string nullable: true rotation: type: string nullable: true rotation_mode: type: string nullable: true connection: type: object properties: host: type: string nullable: true http_port: type: integer nullable: true socks5_port: type: integer nullable: true username: type: string nullable: true password: type: string nullable: true required: - host - http_port - socks5_port - username - password nullable: true allowlist: type: object properties: protocol: type: string nullable: true addresses: type: array items: type: string required: - protocol - addresses renewal: type: object properties: available: anyOf: - type: integer - type: boolean - type: string status: type: string price: type: number nullable: true term_minutes: type: integer nullable: true policy: type: string required: - available - status - price - term_minutes - policy capabilities: type: object properties: renew: type: boolean rotate: type: boolean relocate: type: boolean schedule_rotation: type: boolean allowlist: type: boolean required: - renew - rotate - relocate - schedule_rotation - allowlist required: - id - plan - renewal_status - status - price - term_minutes - started_at - expires_at - location - rotation - rotation_mode - connection - allowlist - renewal - capabilities required: - success - data examples: variant_1: summary: 'Successful response.' value: success: true data: id: 4321 plan: day renewal_status: idle status: active price: 20.5 term_minutes: 1440 started_at: '2026-10-13T12:00:00-04:00' expires_at: '2026-10-14T12:00:00-04:00' location: 'New York, NY' rotation: 10m rotation_mode: same_city connection: host: proxy.example.invalid http_port: 8080 socks5_port: 1080 username: '' password: '' allowlist: protocol: socks5 addresses: - 203.0.113.10 renewal: available: true status: available price: 20.5 term_minutes: 1440 policy: manual capabilities: renew: true rotate: true relocate: true schedule_rotation: true allowlist: true "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' "404": description: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' value: message: 'Not Found' tags: - 'Mobile Proxies' x-required-ability: 'proxies:read' parameters: - in: path name: proxy description: 'Mobile proxy order ID.' example: 4321 required: true schema: type: integer '/api/mobile-proxies/{proxy}/renew': post: summary: 'Renew a mobile proxy' operationId: renewAMobileProxy description: 'Extends the existing active proxy for its current plan. Requires Idempotency-Key and max_price. On an uncertain outcome, credit stays reserved and no second renewal is sent. Auto-renew and expired-proxy recovery are not supported.' parameters: - in: header name: Idempotency-Key description: 'Required unique key. Replay only the exact same request; never use a new key after an unresolved outcome.' example: unique-request-001 schema: type: string minLength: 1 maxLength: 128 pattern: '^[A-Za-z0-9._:-]+$' required: true responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean message: type: string data: type: object properties: id: type: integer plan: type: string renewal_status: type: string status: type: string price: type: number nullable: true term_minutes: type: integer nullable: true started_at: type: string format: date-time expires_at: type: string format: date-time nullable: true location: type: string nullable: true rotation: type: string nullable: true rotation_mode: type: string nullable: true connection: type: object properties: host: type: string nullable: true http_port: type: integer nullable: true socks5_port: type: integer nullable: true username: type: string nullable: true password: type: string nullable: true required: - host - http_port - socks5_port - username - password nullable: true allowlist: type: object properties: protocol: type: string nullable: true addresses: type: array items: type: string required: - protocol - addresses renewal: type: object properties: available: anyOf: - type: integer - type: boolean - type: string status: type: string price: type: number nullable: true term_minutes: type: integer nullable: true policy: type: string required: - available - status - price - term_minutes - policy capabilities: type: object properties: renew: type: boolean rotate: type: boolean relocate: type: boolean schedule_rotation: type: boolean allowlist: type: boolean required: - renew - rotate - relocate - schedule_rotation - allowlist required: - id - plan - renewal_status - status - price - term_minutes - started_at - expires_at - location - rotation - rotation_mode - connection - allowlist - renewal - capabilities required: - success - message - data examples: variant_1: summary: 'Successful response.' value: success: true message: 'Mobile proxy renewed.' data: id: 4321 plan: day renewal_status: idle status: active price: 20.5 term_minutes: 1440 started_at: '2026-10-13T12:00:00-04:00' expires_at: '2026-10-14T12:00:00-04:00' location: 'New York, NY' rotation: 10m rotation_mode: same_city connection: host: proxy.example.invalid http_port: 8080 socks5_port: 1080 username: '' password: '' allowlist: protocol: socks5 addresses: - 203.0.113.10 renewal: available: true status: available price: 20.5 term_minutes: 1440 policy: manual capabilities: renew: true rotate: true relocate: true schedule_rotation: true allowlist: true headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "404": description: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' value: message: 'Not Found' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "409": description: 'Key conflict or unresolved outcome; do not retry with a new key.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Key conflict or unresolved outcome; do not retry with a new key.' value: success: false message: 'This operation is already in progress or has an unknown outcome. Contact support before retrying.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "422": description: 'Missing/invalid key or business-rule rejection. Validation failed; errors is a map of field names to message arrays.' content: application/json: schema: anyOf: - type: object properties: success: type: boolean message: type: string required: - success - message - type: object properties: message: type: string errors: type: object additionalProperties: type: array items: type: string required: - message - errors examples: variant_1: summary: 'Missing/invalid key or business-rule rejection.' value: success: false message: 'A valid Idempotency-Key header is required for this operation.' variant_2: summary: 'Validation failed; errors is a map of field names to message arrays.' value: message: 'The given data was invalid.' errors: field: - 'The field is invalid.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "402": description: 'Insufficient available credit.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Insufficient available credit.' value: success: false message: 'Please add balance to your account to use this service.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' tags: - 'Mobile Proxies' requestBody: required: true content: application/json: schema: type: object properties: max_price: type: number description: 'Maximum charge accepted in account credits; obtain the current quote from GET /api/mobile-proxies/{proxy}.' example: 20.0 nullable: false minimum: 0 maximum: 1000000 required: - max_price x-required-ability: 'proxies:write' parameters: - in: path name: proxy description: 'Existing mobile proxy order ID.' example: 4321 required: true schema: type: integer '/api/mobile-proxies/{proxy}/rotate': post: summary: 'Rotate a mobile proxy IP' operationId: rotateAMobileProxyIP description: 'Requires a unique Idempotency-Key header.' parameters: - in: header name: Idempotency-Key description: 'Required unique key. Replay only the exact same request; never use a new key after an unresolved outcome.' example: unique-request-001 schema: type: string minLength: 1 maxLength: 128 pattern: '^[A-Za-z0-9._:-]+$' required: true responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean message: type: string data: type: object properties: id: type: integer plan: type: string renewal_status: type: string status: type: string price: type: number nullable: true term_minutes: type: integer nullable: true started_at: type: string format: date-time expires_at: type: string format: date-time nullable: true location: type: string nullable: true rotation: type: string nullable: true rotation_mode: type: string nullable: true connection: type: object properties: host: type: string nullable: true http_port: type: integer nullable: true socks5_port: type: integer nullable: true username: type: string nullable: true password: type: string nullable: true required: - host - http_port - socks5_port - username - password nullable: true allowlist: type: object properties: protocol: type: string nullable: true addresses: type: array items: type: string required: - protocol - addresses renewal: type: object properties: available: anyOf: - type: integer - type: boolean - type: string status: type: string price: type: number nullable: true term_minutes: type: integer nullable: true policy: type: string required: - available - status - price - term_minutes - policy capabilities: type: object properties: renew: type: boolean rotate: type: boolean relocate: type: boolean schedule_rotation: type: boolean allowlist: type: boolean required: - renew - rotate - relocate - schedule_rotation - allowlist required: - id - plan - renewal_status - status - price - term_minutes - started_at - expires_at - location - rotation - rotation_mode - connection - allowlist - renewal - capabilities required: - success - message - data examples: variant_1: summary: 'Successful response.' value: success: true message: 'Proxy IP change requested.' data: id: 4321 plan: day renewal_status: idle status: active price: 20.5 term_minutes: 1440 started_at: '2026-10-13T12:00:00-04:00' expires_at: '2026-10-14T12:00:00-04:00' location: 'New York, NY' rotation: 10m rotation_mode: same_city connection: host: proxy.example.invalid http_port: 8080 socks5_port: 1080 username: '' password: '' allowlist: protocol: socks5 addresses: - 203.0.113.10 renewal: available: true status: available price: 20.5 term_minutes: 1440 policy: manual capabilities: renew: true rotate: true relocate: true schedule_rotation: true allowlist: true headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "404": description: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' value: message: 'Not Found' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "409": description: 'Key conflict or unresolved outcome; do not retry with a new key.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Key conflict or unresolved outcome; do not retry with a new key.' value: success: false message: 'This operation is already in progress or has an unknown outcome. Contact support before retrying.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "422": description: 'Missing/invalid key or business-rule rejection.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Missing/invalid key or business-rule rejection.' value: success: false message: 'A valid Idempotency-Key header is required for this operation.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' tags: - 'Mobile Proxies' x-required-ability: 'proxies:write' parameters: - in: path name: proxy description: 'Active mobile proxy order ID.' example: 4321 required: true schema: type: integer '/api/mobile-proxies/{proxy}/location': post: summary: 'Change a mobile proxy location' operationId: changeAMobileProxyLocation description: 'Requires a unique Idempotency-Key header.' parameters: - in: header name: Idempotency-Key description: 'Required unique key. Replay only the exact same request; never use a new key after an unresolved outcome.' example: unique-request-001 schema: type: string minLength: 1 maxLength: 128 pattern: '^[A-Za-z0-9._:-]+$' required: true responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean message: type: string data: type: object properties: id: type: integer plan: type: string renewal_status: type: string status: type: string price: type: number nullable: true term_minutes: type: integer nullable: true started_at: type: string format: date-time expires_at: type: string format: date-time nullable: true location: type: string nullable: true rotation: type: string nullable: true rotation_mode: type: string nullable: true connection: type: object properties: host: type: string nullable: true http_port: type: integer nullable: true socks5_port: type: integer nullable: true username: type: string nullable: true password: type: string nullable: true required: - host - http_port - socks5_port - username - password nullable: true allowlist: type: object properties: protocol: type: string nullable: true addresses: type: array items: type: string required: - protocol - addresses renewal: type: object properties: available: anyOf: - type: integer - type: boolean - type: string status: type: string price: type: number nullable: true term_minutes: type: integer nullable: true policy: type: string required: - available - status - price - term_minutes - policy capabilities: type: object properties: renew: type: boolean rotate: type: boolean relocate: type: boolean schedule_rotation: type: boolean allowlist: type: boolean required: - renew - rotate - relocate - schedule_rotation - allowlist required: - id - plan - renewal_status - status - price - term_minutes - started_at - expires_at - location - rotation - rotation_mode - connection - allowlist - renewal - capabilities required: - success - message - data examples: variant_1: summary: 'Successful response.' value: success: true message: 'Proxy location updated.' data: id: 4321 plan: day renewal_status: idle status: active price: 20.5 term_minutes: 1440 started_at: '2026-10-13T12:00:00-04:00' expires_at: '2026-10-14T12:00:00-04:00' location: 'New York, NY' rotation: 10m rotation_mode: same_city connection: host: proxy.example.invalid http_port: 8080 socks5_port: 1080 username: '' password: '' allowlist: protocol: socks5 addresses: - 203.0.113.10 renewal: available: true status: available price: 20.5 term_minutes: 1440 policy: manual capabilities: renew: true rotate: true relocate: true schedule_rotation: true allowlist: true headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "404": description: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' value: message: 'Not Found' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "409": description: 'Key conflict or unresolved outcome; do not retry with a new key.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Key conflict or unresolved outcome; do not retry with a new key.' value: success: false message: 'This operation is already in progress or has an unknown outcome. Contact support before retrying.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "422": description: 'Missing/invalid key or business-rule rejection. Validation failed; errors is a map of field names to message arrays.' content: application/json: schema: anyOf: - type: object properties: success: type: boolean message: type: string required: - success - message - type: object properties: message: type: string errors: type: object additionalProperties: type: array items: type: string required: - message - errors examples: variant_1: summary: 'Missing/invalid key or business-rule rejection.' value: success: false message: 'A valid Idempotency-Key header is required for this operation.' variant_2: summary: 'Validation failed; errors is a map of field names to message arrays.' value: message: 'The given data was invalid.' errors: field: - 'The field is invalid.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' tags: - 'Mobile Proxies' requestBody: required: true content: application/json: schema: type: object properties: location: type: string description: 'Location ID or random.' example: new_york_1 nullable: false maxLength: 96 required: - location x-required-ability: 'proxies:write' parameters: - in: path name: proxy description: 'Active mobile proxy order ID.' example: 4321 required: true schema: type: integer '/api/mobile-proxies/{proxy}/rotation': post: summary: 'Set a mobile proxy rotation schedule' operationId: setAMobileProxyRotationSchedule description: 'Requires a unique Idempotency-Key header.' parameters: - in: header name: Idempotency-Key description: 'Required unique key. Replay only the exact same request; never use a new key after an unresolved outcome.' example: unique-request-001 schema: type: string minLength: 1 maxLength: 128 pattern: '^[A-Za-z0-9._:-]+$' required: true responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean message: type: string data: type: object properties: id: type: integer plan: type: string renewal_status: type: string status: type: string price: type: number nullable: true term_minutes: type: integer nullable: true started_at: type: string format: date-time expires_at: type: string format: date-time nullable: true location: type: string nullable: true rotation: type: string nullable: true rotation_mode: type: string nullable: true connection: type: object properties: host: type: string nullable: true http_port: type: integer nullable: true socks5_port: type: integer nullable: true username: type: string nullable: true password: type: string nullable: true required: - host - http_port - socks5_port - username - password nullable: true allowlist: type: object properties: protocol: type: string nullable: true addresses: type: array items: type: string required: - protocol - addresses renewal: type: object properties: available: anyOf: - type: integer - type: boolean - type: string status: type: string price: type: number nullable: true term_minutes: type: integer nullable: true policy: type: string required: - available - status - price - term_minutes - policy capabilities: type: object properties: renew: type: boolean rotate: type: boolean relocate: type: boolean schedule_rotation: type: boolean allowlist: type: boolean required: - renew - rotate - relocate - schedule_rotation - allowlist required: - id - plan - renewal_status - status - price - term_minutes - started_at - expires_at - location - rotation - rotation_mode - connection - allowlist - renewal - capabilities required: - success - message - data examples: variant_1: summary: 'Successful response.' value: success: true message: 'Proxy rotation schedule updated.' data: id: 4321 plan: day renewal_status: idle status: active price: 20.5 term_minutes: 1440 started_at: '2026-10-13T12:00:00-04:00' expires_at: '2026-10-14T12:00:00-04:00' location: 'New York, NY' rotation: 10m rotation_mode: same_city connection: host: proxy.example.invalid http_port: 8080 socks5_port: 1080 username: '' password: '' allowlist: protocol: socks5 addresses: - 203.0.113.10 renewal: available: true status: available price: 20.5 term_minutes: 1440 policy: manual capabilities: renew: true rotate: true relocate: true schedule_rotation: true allowlist: true headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "404": description: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' value: message: 'Not Found' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "409": description: 'Key conflict or unresolved outcome; do not retry with a new key.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Key conflict or unresolved outcome; do not retry with a new key.' value: success: false message: 'This operation is already in progress or has an unknown outcome. Contact support before retrying.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "422": description: 'Missing/invalid key or business-rule rejection. Validation failed; errors is a map of field names to message arrays.' content: application/json: schema: anyOf: - type: object properties: success: type: boolean message: type: string required: - success - message - type: object properties: message: type: string errors: type: object additionalProperties: type: array items: type: string required: - message - errors examples: variant_1: summary: 'Missing/invalid key or business-rule rejection.' value: success: false message: 'A valid Idempotency-Key header is required for this operation.' variant_2: summary: 'Validation failed; errors is a map of field names to message arrays.' value: message: 'The given data was invalid.' errors: field: - 'The field is invalid.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' tags: - 'Mobile Proxies' requestBody: required: true content: application/json: schema: type: object properties: rotation: type: string description: 'off, 3m, 5m, 10m, 30m, 1h, 6h, 12h, or 1d.' example: 10m nullable: false enum: - 'off' - 3m - 5m - 10m - 30m - 1h - 6h - 12h - 1d mode: type: string description: 'same_city, same_city_carriers, or full_pool.' example: same_city nullable: false enum: - same_city - same_city_carriers - full_pool required: - rotation - mode x-required-ability: 'proxies:write' parameters: - in: path name: proxy description: 'Active mobile proxy order ID.' example: 4321 required: true schema: type: integer '/api/mobile-proxies/{proxy}/allowlist': post: summary: 'Replace or disable a mobile proxy IPv4 allowlist' operationId: replaceOrDisableAMobileProxyIPv4Allowlist description: 'Requires a unique Idempotency-Key header.' parameters: - in: header name: Idempotency-Key description: 'Required unique key. Replay only the exact same request; never use a new key after an unresolved outcome.' example: unique-request-001 schema: type: string minLength: 1 maxLength: 128 pattern: '^[A-Za-z0-9._:-]+$' required: true responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean message: type: string data: type: object properties: id: type: integer plan: type: string renewal_status: type: string status: type: string price: type: number nullable: true term_minutes: type: integer nullable: true started_at: type: string format: date-time expires_at: type: string format: date-time nullable: true location: type: string nullable: true rotation: type: string nullable: true rotation_mode: type: string nullable: true connection: type: object properties: host: type: string nullable: true http_port: type: integer nullable: true socks5_port: type: integer nullable: true username: type: string nullable: true password: type: string nullable: true required: - host - http_port - socks5_port - username - password nullable: true allowlist: type: object properties: protocol: type: string nullable: true addresses: type: array items: type: string required: - protocol - addresses renewal: type: object properties: available: anyOf: - type: integer - type: boolean - type: string status: type: string price: type: number nullable: true term_minutes: type: integer nullable: true policy: type: string required: - available - status - price - term_minutes - policy capabilities: type: object properties: renew: type: boolean rotate: type: boolean relocate: type: boolean schedule_rotation: type: boolean allowlist: type: boolean required: - renew - rotate - relocate - schedule_rotation - allowlist required: - id - plan - renewal_status - status - price - term_minutes - started_at - expires_at - location - rotation - rotation_mode - connection - allowlist - renewal - capabilities required: - success - message - data examples: variant_1: summary: 'Successful response.' value: success: true message: 'Proxy IPv4 allowlist replaced.' data: id: 4321 plan: day renewal_status: idle status: active price: 20.5 term_minutes: 1440 started_at: '2026-10-13T12:00:00-04:00' expires_at: '2026-10-14T12:00:00-04:00' location: 'New York, NY' rotation: 10m rotation_mode: same_city connection: host: proxy.example.invalid http_port: 8080 socks5_port: 1080 username: '' password: '' allowlist: protocol: socks5 addresses: - 203.0.113.10 renewal: available: true status: available price: 20.5 term_minutes: 1440 policy: manual capabilities: renew: true rotate: true relocate: true schedule_rotation: true allowlist: true headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "404": description: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Resource does not exist, is not owned by this account, or is ineligible for this action.' value: message: 'Not Found' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "409": description: 'Key conflict or unresolved outcome; do not retry with a new key.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Key conflict or unresolved outcome; do not retry with a new key.' value: success: false message: 'This operation is already in progress or has an unknown outcome. Contact support before retrying.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' "422": description: 'Missing/invalid key or business-rule rejection. Validation failed; errors is a map of field names to message arrays.' content: application/json: schema: anyOf: - type: object properties: success: type: boolean message: type: string required: - success - message - type: object properties: message: type: string errors: type: object additionalProperties: type: array items: type: string required: - message - errors examples: variant_1: summary: 'Missing/invalid key or business-rule rejection.' value: success: false message: 'A valid Idempotency-Key header is required for this operation.' variant_2: summary: 'Validation failed; errors is a map of field names to message arrays.' value: message: 'The given data was invalid.' errors: field: - 'The field is invalid.' headers: Idempotent-Replayed: description: 'Present with true when replaying the stored response. A stored 202 remains 202.' schema: type: string enum: - 'true' tags: - 'Mobile Proxies' requestBody: required: true content: application/json: schema: type: object properties: addresses: type: array description: 'Up to 16 IPv4 addresses. Use an empty array to disable the allowlist.' example: - 203.0.113.10 items: type: string format: ipv4 maxItems: 16 protocol: type: string description: 'http or socks5.' example: socks5 nullable: false enum: - http - socks5 required: - addresses - protocol x-required-ability: 'proxies:write' parameters: - in: path name: proxy description: 'Active mobile proxy order ID.' example: 4321 required: true schema: type: integer /api/rates/mobiles_rentals: post: summary: 'One-time Number Rates' operationId: oneTimeNumberRates description: '' parameters: [] responses: "200": description: 'Successful response.' content: application/json: schema: type: object properties: success: type: boolean data: type: array items: type: object properties: service: type: string price: type: string description: 'Legacy USD amount prefixed with $.' available: anyOf: - type: integer - type: boolean - type: string required: - service - price - available required: - success - data examples: variant_1: summary: 'Successful response.' value: success: true data: - service: Unknown price: $0.5 available: 1 "429": description: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' content: application/json: schema: type: object properties: message: type: string required: - message examples: variant_1: summary: 'Rate limited. Respect Retry-After. Shared API limit: 240/minute; token issuance: 10/minute per login/IP; QR: 5/minute per account.' value: message: 'Too Many Attempts.' headers: Retry-After: description: 'Seconds to wait before retrying.' schema: type: integer "401": description: 'Bearer token missing, invalid or expired.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Bearer token missing, invalid or expired.' value: success: false message: Unauthorized. "403": description: 'Account, role, portal or token ability does not permit this operation.' content: application/json: schema: type: object properties: success: type: boolean message: type: string required: - success - message examples: variant_1: summary: 'Account, role, portal or token ability does not permit this operation.' value: success: false message: 'This token does not have the required ability.' tags: - 'One-Time Rates' x-required-ability: 'rentals:read'