IPMusk Orders API
The Orders API from IPMusk — 3 operation(s) for orders.
The Orders API from IPMusk — 3 operation(s) for orders.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/ipmusk-com:ipmusk-com-orders-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: IPMusk Customer Orders API
version: 1.0.0
description: 'Read the catalogue, get residential and static proxy credentials, check usage and orders, and handle support tickets. Authenticate with an API key from the dashboard (Settings > API keys) sent as `Authorization: Bearer `; each key carries the scopes read, connect and/or support. Rate limits per key and minute: read 60, connect 20, support 30 (429 rate_limited, with a Retry-After header in seconds). JSON responses are `{ data, request_id }`; errors are `{ error: { code, message, field_errors? }, request_id }`. Money is amount_minor (minor units) with an ISO 4217 currency.'
servers:
- url: https://ipmusk.com
tags:
- name: Orders
paths:
/api/v1/orders:
get:
operationId: orders_list
summary: List orders
description: The account's orders, newest first. Pass next_cursor back as cursor for the next page.
security:
- bearerAuth: []
x-ipmusk-scope: read
parameters:
- name: cursor
in: query
required: false
schema:
type: string
minLength: 1
maxLength: 256
- name: limit
in: query
required: false
schema:
default: 20
type: integer
minimum: 1
maximum: 100
- name: product_id
in: query
required: false
schema:
type: string
enum:
- rotating_residential
- static_isp
responses:
'200':
description: List orders
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
items:
type: array
items:
type: object
properties:
id:
type: string
minLength: 1
maxLength: 128
product_id:
type: string
enum:
- rotating_residential
- static_isp
amount_minor:
type: integer
minimum: 0
maximum: 9007199254740991
currency:
type: string
pattern: ^[A-Z]{3}$
payment_status:
type: string
enum:
- not_started
- pending
- paid
- failed
- refund_pending
- refunded
- disputed
fulfillment_status:
type: string
enum:
- draft
- queued
- provisioning
- allocating
- available
- failed
- result_unknown
- manual_review
checkout_lifecycle:
default: open
type: string
enum:
- open
- cancel_requested
- cancelled
- expired
checkout_expires_at:
default: null
anyOf:
- type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
- type: 'null'
checkout_close_reason:
default: null
anyOf:
- type: string
enum:
- customer
- timeout
- type: 'null'
created_at:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_at:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
required:
- id
- product_id
- amount_minor
- currency
- payment_status
- fulfillment_status
- checkout_lifecycle
- checkout_expires_at
- checkout_close_reason
- created_at
- updated_at
additionalProperties: false
next_cursor:
anyOf:
- type: string
- type: 'null'
required:
- items
additionalProperties: false
request_id:
type: string
minLength: 8
maxLength: 128
required:
- data
- request_id
additionalProperties: false
default:
$ref: '#/components/responses/Error'
tags:
- Orders
post:
operationId: order_create
summary: Order and get a payment link
description: Creates an unpaid order and returns the provider's payment link (checkout_url) for the customer to open and pay themselves; nothing is charged by this call. Show the price (POST /quotes) and get the customer's confirmation first. rotating_residential takes a plan_id and is one-time only (subscriptions are started in the dashboard); static_isp takes allocations [{ plan_id, quantity }] and resource_days (30 or 90). Poll GET /orders/{orderId} for payment and delivery. The Idempotency-Key header makes a retry return the same order and link. 422 checkout_unavailable when ordering is switched off.
security:
- bearerAuth: []
x-ipmusk-scope: order
parameters:
- name: Idempotency-Key
in: header
required: true
description: 'A unique value per logical request (8-128 of A-Z a-z 0-9 . _ : -). Retrying with the same value returns the first result.'
schema:
type: string
minLength: 8
maxLength: 128
pattern: ^[A-Za-z0-9._:-]+$
requestBody:
required: true
content:
application/json:
schema:
oneOf:
- type: object
properties:
product:
type: string
const: rotating_residential
plan_id:
type: string
minLength: 1
maxLength: 128
description: A residential plan_id from GET /plans.
promo_code:
type: string
minLength: 1
maxLength: 64
description: Optional promo code, checked exactly as at the dashboard checkout.
provider:
type: string
enum:
- stripe
- paypal
- infini
description: 'Payment provider for the link. Default: the first one this deployment offers.'
required:
- product
- plan_id
additionalProperties: false
- type: object
properties:
product:
type: string
const: static_isp
allocations:
minItems: 1
maxItems: 100
type: array
items:
type: object
properties:
plan_id:
type: string
minLength: 1
maxLength: 128
description: A static plan_id from GET /plans.
quantity:
type: integer
minimum: 1
maximum: 100
required:
- plan_id
- quantity
additionalProperties: false
description: One entry per location; at most 100 IPs in total.
resource_days:
anyOf:
- type: number
const: 30
- type: number
const: 90
description: 'Term in days: 30 or 90.'
promo_code:
type: string
minLength: 1
maxLength: 64
description: Optional promo code, checked exactly as at the dashboard checkout.
provider:
type: string
enum:
- stripe
- paypal
- infini
description: 'Payment provider for the link. Default: the first one this deployment offers.'
required:
- product
- allocations
- resource_days
additionalProperties: false
responses:
'201':
description: Order and get a payment link
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
order_id:
type: string
minLength: 1
maxLength: 128
amount_minor:
type: integer
minimum: 0
maximum: 9007199254740991
currency:
type: string
pattern: ^[A-Z]{3}$
provider:
type: string
enum:
- stripe
- paypal
- infini
- payssion
checkout_url:
type: string
format: uri
expires_at:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
required:
- order_id
- amount_minor
- currency
- provider
- checkout_url
- expires_at
additionalProperties: false
request_id:
type: string
minLength: 8
maxLength: 128
required:
- data
- request_id
additionalProperties: false
default:
$ref: '#/components/responses/Error'
tags:
- Orders
/api/v1/orders/{orderId}:
get:
operationId: orders_get
summary: One order
description: Payment and delivery status of one order. 404 when it is not this account's.
security:
- bearerAuth: []
x-ipmusk-scope: read
parameters:
- name: orderId
in: path
required: true
schema:
type: string
minLength: 1
maxLength: 128
responses:
'200':
description: One order
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
id:
type: string
minLength: 1
maxLength: 128
product_id:
type: string
enum:
- rotating_residential
- static_isp
amount_minor:
type: integer
minimum: 0
maximum: 9007199254740991
currency:
type: string
pattern: ^[A-Z]{3}$
payment_status:
type: string
enum:
- not_started
- pending
- paid
- failed
- refund_pending
- refunded
- disputed
fulfillment_status:
type: string
enum:
- draft
- queued
- provisioning
- allocating
- available
- failed
- result_unknown
- manual_review
checkout_lifecycle:
default: open
type: string
enum:
- open
- cancel_requested
- cancelled
- expired
checkout_expires_at:
default: null
anyOf:
- type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
- type: 'null'
checkout_close_reason:
default: null
anyOf:
- type: string
enum:
- customer
- timeout
- type: 'null'
created_at:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_at:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
required:
- id
- product_id
- amount_minor
- currency
- payment_status
- fulfillment_status
- checkout_lifecycle
- checkout_expires_at
- checkout_close_reason
- created_at
- updated_at
additionalProperties: false
request_id:
type: string
minLength: 8
maxLength: 128
required:
- data
- request_id
additionalProperties: false
default:
$ref: '#/components/responses/Error'
tags:
- Orders
/api/v1/orders/{orderId}/checkout:
post:
operationId: order_checkout
summary: A payment link for an unpaid order
description: Returns the open payment link of an unpaid one-time order, or opens a new one when the last expired. 409 invalid_state_transition when the order is paid, closed or past its payment window; 404 when it is not this account's. Needs the Idempotency-Key header.
security:
- bearerAuth: []
x-ipmusk-scope: order
parameters:
- name: orderId
in: path
required: true
schema:
type: string
minLength: 1
maxLength: 128
- name: Idempotency-Key
in: header
required: true
description: 'A unique value per logical request (8-128 of A-Z a-z 0-9 . _ : -). Retrying with the same value returns the first result.'
schema:
type: string
minLength: 8
maxLength: 128
pattern: ^[A-Za-z0-9._:-]+$
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
provider:
type: string
enum:
- stripe
- paypal
- infini
description: 'Payment provider for the link. Default: the first one this deployment offers.'
additionalProperties: false
responses:
'200':
description: A payment link for an unpaid order
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
order_id:
type: string
minLength: 1
maxLength: 128
amount_minor:
type: integer
minimum: 0
maximum: 9007199254740991
currency:
type: string
pattern: ^[A-Z]{3}$
provider:
type: string
enum:
- stripe
- paypal
- infini
- payssion
checkout_url:
type: string
format: uri
expires_at:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
required:
- order_id
- amount_minor
- currency
- provider
- checkout_url
- expires_at
additionalProperties: false
request_id:
type: string
minLength: 8
maxLength: 128
required:
- data
- request_id
additionalProperties: false
default:
$ref: '#/components/responses/Error'
tags:
- Orders
components:
responses:
Error:
description: 'Any failure: 400 validation_error, 401 authentication_required, 403 forbidden / capability_unavailable, 404 not_found, 409 invalid_state_transition / idempotency_conflict, 422 product_unavailable, 429 rate_limited, 500 internal_error.'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
schemas:
ErrorEnvelope:
type: object
properties:
error:
type: object
properties:
code:
type: string
enum:
- validation_error
- authentication_required
- region_blocked
- forbidden
- not_found
- idempotency_conflict
- invalid_state_transition
- checkout_unavailable
- product_unavailable
- capability_unavailable
- rate_limited
- challenge_required
- upstream_unavailable
- internal_error
message:
type: string
minLength: 1
maxLength: 500
field_errors:
type: object
propertyNames:
type: string
additionalProperties:
type: array
items:
type: string
minLength: 1
maxLength: 300
required:
- code
- message
additionalProperties: false
request_id:
type: string
minLength: 8
maxLength: 128
required:
- error
- request_id
additionalProperties: false
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: An IPMusk API key (ipm_live_…).