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'