Switch API reference
Switch: suppliers
Suppliers and providers you buy from: accounts, trunks, admission and diagnostics.
66 operationsBase URL https://packetexchange.io/api/v1Postman collection
BrowseSwitch: suppliers
List providers with their trunks
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Every provider on your switch, each with its trunks (secrets redacted) and endpoint counts, plus trunks not yet assigned to a provider.
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
accountsrequireddata.accounts | object[] | - |
idrequireddata.accounts[].id | string (uuid) | - |
namerequireddata.accounts[].name | string | - |
accountCoderequireddata.accounts[].accountCode | string | null | - |
legalNamerequireddata.accounts[].legalName | string | null | - |
tradingNamerequireddata.accounts[].tradingName | string | null | - |
providerTyperequireddata.accounts[].providerType | string | null | -One of carrier, aggregator, mno, mvno, sip_provider |
countryrequireddata.accounts[].country | string | null | - |
servicesrequireddata.accounts[].services | string[] | null | - |
portalEmailrequireddata.accounts[].portalEmail | string | null | - |
currencyrequireddata.accounts[].currency | string | - |
statusrequireddata.accounts[].status | string | -One of draft, pending_approval, testing, active, suspended, terminated |
statusNoterequireddata.accounts[].statusNote | string | null | - |
statusChangedAtrequireddata.accounts[].statusChangedAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
routablerequireddata.accounts[].routable | boolean | Whether this provider admits new calls at all, given its status |
contractStartrequireddata.accounts[].contractStart | string | null | YYYY-MM-DD |
contractEndrequireddata.accounts[].contractEnd | string | null | - |
autoRenewrequireddata.accounts[].autoRenew | boolean | - |
rateNoticeDaysrequireddata.accounts[].rateNoticeDays | integer | null | - |
disputeDaysrequireddata.accounts[].disputeDays | integer | null | - |
billingModerequireddata.accounts[].billingMode | string | -One of prepaid, postpaid |
creditLimitrequireddata.accounts[].creditLimit | string | null | Decimal string with 2 decimal places, e.g. "5000.00" |
balancerequireddata.accounts[].balance | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
paymentTermsDaysrequireddata.accounts[].paymentTermsDays | integer | null | - |
invoiceCyclerequireddata.accounts[].invoiceCycle | string | null | - |
createdAtrequireddata.accounts[].createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata.accounts[].updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
trunksrequireddata.accounts[].trunks | object[] | - |
idrequireddata.accounts[].trunks[].id | string (uuid) | - |
supplierIdrequireddata.accounts[].trunks[].supplierId | string (uuid) | null | The owning provider; null = ungrouped |
labelrequireddata.accounts[].trunks[].label | string | - |
sourcerequireddata.accounts[].trunks[].source | string | "external" for a carrier you entered; "marketplace" for a trunk promoted from a marketplace purchase |
statusrequireddata.accounts[].trunks[].status | string | -One of active, disabled, draft, testing, draining, fault |
sipHostrequireddata.accounts[].trunks[].sipHost | string | null | Null on a marketplace trunk: the seller address is never disclosed |
sipPortrequireddata.accounts[].trunks[].sipPort | integer | null | - |
transportrequireddata.accounts[].trunks[].transport | string | null | -One of udp, tcp, tls |
techPrefixrequireddata.accounts[].trunks[].techPrefix | string | null | - |
sipAuthUsernamerequireddata.accounts[].trunks[].sipAuthUsername | string | null | - |
sipAuthPasswordSetrequireddata.accounts[].trunks[].sipAuthPasswordSet | boolean | Whether a SIP password is stored. The value is only readable via GET /switch/suppliers/{id}/credentials |
smppPasswordSetrequireddata.accounts[].trunks[].smppPasswordSet | boolean | - |
mediaModerequireddata.accounts[].trunks[].mediaMode | string | -One of proxy, direct |
defaultRatePerUnitrequireddata.accounts[].trunks[].defaultRatePerUnit | money | null | Cost per minute used when no deck row matches USD as a decimal string with exactly 6 places, e.g. "0.012500". |
billingIncrementrequireddata.accounts[].trunks[].billingIncrement | string | null | - |
currencyrequireddata.accounts[].trunks[].currency | string | null | - |
capacityrequireddata.accounts[].trunks[].capacity | integer | null | Max concurrent channels |
maxCpsrequireddata.accounts[].trunks[].maxCps | integer | null | - |
settlementModerequireddata.accounts[].trunks[].settlementMode | string | -One of ap, prepaid |
balancerequireddata.accounts[].trunks[].balance | money | Prepaid credit remaining with this supplier (prepaid settlement) USD as a decimal string with exactly 6 places, e.g. "0.012500". |
smsDeliveryMethodrequireddata.accounts[].trunks[].smsDeliveryMethod | string | null | -One of http, smpp |
reachablerequireddata.accounts[].trunks[].reachable | boolean | null | - |
reachCheckedAtrequireddata.accounts[].trunks[].reachCheckedAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
createdAtrequireddata.accounts[].trunks[].createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata.accounts[].trunks[].updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
endpointCountrequireddata.accounts[].trunks[].endpointCount | integer | - |
endpointsEnabledrequireddata.accounts[].trunks[].endpointsEnabled | integer | - |
trunkCountrequireddata.accounts[].trunkCount | integer | - |
activeTrunksrequireddata.accounts[].activeTrunks | integer | - |
totalCapacityrequireddata.accounts[].totalCapacity | integer | - |
ungroupedrequireddata.ungrouped | object[] | - |
idrequireddata.ungrouped[].id | string (uuid) | - |
supplierIdrequireddata.ungrouped[].supplierId | string (uuid) | null | The owning provider; null = ungrouped |
labelrequireddata.ungrouped[].label | string | - |
sourcerequireddata.ungrouped[].source | string | "external" for a carrier you entered; "marketplace" for a trunk promoted from a marketplace purchase |
statusrequireddata.ungrouped[].status | string | -One of active, disabled, draft, testing, draining, fault |
sipHostrequireddata.ungrouped[].sipHost | string | null | Null on a marketplace trunk: the seller address is never disclosed |
sipPortrequireddata.ungrouped[].sipPort | integer | null | - |
transportrequireddata.ungrouped[].transport | string | null | -One of udp, tcp, tls |
techPrefixrequireddata.ungrouped[].techPrefix | string | null | - |
sipAuthUsernamerequireddata.ungrouped[].sipAuthUsername | string | null | - |
sipAuthPasswordSetrequireddata.ungrouped[].sipAuthPasswordSet | boolean | Whether a SIP password is stored. The value is only readable via GET /switch/suppliers/{id}/credentials |
smppPasswordSetrequireddata.ungrouped[].smppPasswordSet | boolean | - |
mediaModerequireddata.ungrouped[].mediaMode | string | -One of proxy, direct |
defaultRatePerUnitrequireddata.ungrouped[].defaultRatePerUnit | money | null | Cost per minute used when no deck row matches USD as a decimal string with exactly 6 places, e.g. "0.012500". |
billingIncrementrequireddata.ungrouped[].billingIncrement | string | null | - |
currencyrequireddata.ungrouped[].currency | string | null | - |
capacityrequireddata.ungrouped[].capacity | integer | null | Max concurrent channels |
maxCpsrequireddata.ungrouped[].maxCps | integer | null | - |
settlementModerequireddata.ungrouped[].settlementMode | string | -One of ap, prepaid |
balancerequireddata.ungrouped[].balance | money | Prepaid credit remaining with this supplier (prepaid settlement) USD as a decimal string with exactly 6 places, e.g. "0.012500". |
smsDeliveryMethodrequireddata.ungrouped[].smsDeliveryMethod | string | null | -One of http, smpp |
reachablerequireddata.ungrouped[].reachable | boolean | null | - |
reachCheckedAtrequireddata.ungrouped[].reachCheckedAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
createdAtrequireddata.ungrouped[].createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata.ungrouped[].updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
endpointCountrequireddata.ungrouped[].endpointCount | integer | - |
endpointsEnabledrequireddata.ungrouped[].endpointsEnabled | integer | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Create a provider
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
A provider is the carrier or company that owns one or more supplier trunks.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Request body (application/json)
| Field | Type | Description |
|---|---|---|
namerequired | string | -max 160 chars |
accountCode | string | null | -max 40 chars |
legalName | string | null | -max 200 chars |
tradingName | string | null | -max 200 chars |
providerType | string | null | -One of carrier, aggregator, mno, mvno, sip_provider |
registrationNumber | string | null | -max 80 chars |
taxId | string | null | -max 80 chars |
vatId | string | null | -max 80 chars |
address | string | null | -max 600 chars |
country | string | null | -max 2 chars |
accountManager | string | null | -max 160 chars |
tags | string[] | null | - |
services | string[] | null | -One of termination, origination, did, sms |
portalEmail | string (email) | null | -max 255 chars |
notes | string | null | -max 4000 chars |
currency | string | null | -max 3 chars |
status | string | Accepted on create only; later changes go through POST /{id}/statusOne of draft, pending_approval, testing, active, suspended, terminated |
contractStart | string | null | -max 10 chars |
contractEnd | string | null | -max 10 chars |
autoRenew | boolean | - |
rateNoticeDays | number | string | null | - |
disputeDays | number | string | null | - |
billingMode | string | null | -One of prepaid, postpaid |
creditLimit | number | string | null | - |
paymentTermsDays | number | string | null | - |
invoiceCycle | string | null | -One of weekly, biweekly, monthly |
billingTimezone | string | null | -max 64 chars |
Response 201
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
idrequireddata.id | string (uuid) | - |
namerequireddata.name | string | - |
accountCoderequireddata.accountCode | string | null | - |
legalNamerequireddata.legalName | string | null | - |
tradingNamerequireddata.tradingName | string | null | - |
providerTyperequireddata.providerType | string | null | -One of carrier, aggregator, mno, mvno, sip_provider |
countryrequireddata.country | string | null | - |
servicesrequireddata.services | string[] | null | - |
portalEmailrequireddata.portalEmail | string | null | - |
currencyrequireddata.currency | string | - |
statusrequireddata.status | string | -One of draft, pending_approval, testing, active, suspended, terminated |
statusNoterequireddata.statusNote | string | null | - |
statusChangedAtrequireddata.statusChangedAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
routablerequireddata.routable | boolean | Whether this provider admits new calls at all, given its status |
contractStartrequireddata.contractStart | string | null | YYYY-MM-DD |
contractEndrequireddata.contractEnd | string | null | - |
autoRenewrequireddata.autoRenew | boolean | - |
rateNoticeDaysrequireddata.rateNoticeDays | integer | null | - |
disputeDaysrequireddata.disputeDays | integer | null | - |
billingModerequireddata.billingMode | string | -One of prepaid, postpaid |
creditLimitrequireddata.creditLimit | string | null | Decimal string with 2 decimal places, e.g. "5000.00" |
balancerequireddata.balance | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
paymentTermsDaysrequireddata.paymentTermsDays | integer | null | - |
invoiceCyclerequireddata.invoiceCycle | string | null | - |
createdAtrequireddata.createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata.updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get a provider with its trunks, endpoints and contacts
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
idrequireddata.id | string (uuid) | - |
namerequireddata.name | string | - |
accountCoderequireddata.accountCode | string | null | - |
legalNamerequireddata.legalName | string | null | - |
tradingNamerequireddata.tradingName | string | null | - |
providerTyperequireddata.providerType | string | null | -One of carrier, aggregator, mno, mvno, sip_provider |
countryrequireddata.country | string | null | - |
servicesrequireddata.services | string[] | null | - |
portalEmailrequireddata.portalEmail | string | null | - |
currencyrequireddata.currency | string | - |
statusrequireddata.status | string | -One of draft, pending_approval, testing, active, suspended, terminated |
statusNoterequireddata.statusNote | string | null | - |
statusChangedAtrequireddata.statusChangedAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
routablerequireddata.routable | boolean | Whether this provider admits new calls at all, given its status |
contractStartrequireddata.contractStart | string | null | YYYY-MM-DD |
contractEndrequireddata.contractEnd | string | null | - |
autoRenewrequireddata.autoRenew | boolean | - |
rateNoticeDaysrequireddata.rateNoticeDays | integer | null | - |
disputeDaysrequireddata.disputeDays | integer | null | - |
billingModerequireddata.billingMode | string | -One of prepaid, postpaid |
creditLimitrequireddata.creditLimit | string | null | Decimal string with 2 decimal places, e.g. "5000.00" |
balancerequireddata.balance | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
paymentTermsDaysrequireddata.paymentTermsDays | integer | null | - |
invoiceCyclerequireddata.invoiceCycle | string | null | - |
createdAtrequireddata.createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata.updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
contactsrequireddata.contacts | object[] | - |
idrequireddata.contacts[].id | string (uuid) | - |
supplierIdrequireddata.contacts[].supplierId | string (uuid) | - |
rolerequireddata.contacts[].role | string | -One of noc, rates, billing, finance, fraud, account, emergency |
namerequireddata.contacts[].name | string | null | - |
emailrequireddata.contacts[].email | string | null | - |
phonerequireddata.contacts[].phone | string | null | - |
timezonerequireddata.contacts[].timezone | string | null | - |
notifyrequireddata.contacts[].notify | boolean | - |
notesrequireddata.contacts[].notes | string | null | - |
createdAtrequireddata.contacts[].createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata.contacts[].updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
trunksrequireddata.trunks | object[] | - |
idrequireddata.trunks[].id | string (uuid) | - |
supplierIdrequireddata.trunks[].supplierId | string (uuid) | null | The owning provider; null = ungrouped |
labelrequireddata.trunks[].label | string | - |
sourcerequireddata.trunks[].source | string | "external" for a carrier you entered; "marketplace" for a trunk promoted from a marketplace purchase |
statusrequireddata.trunks[].status | string | -One of active, disabled, draft, testing, draining, fault |
sipHostrequireddata.trunks[].sipHost | string | null | Null on a marketplace trunk: the seller address is never disclosed |
sipPortrequireddata.trunks[].sipPort | integer | null | - |
transportrequireddata.trunks[].transport | string | null | -One of udp, tcp, tls |
techPrefixrequireddata.trunks[].techPrefix | string | null | - |
sipAuthUsernamerequireddata.trunks[].sipAuthUsername | string | null | - |
sipAuthPasswordSetrequireddata.trunks[].sipAuthPasswordSet | boolean | Whether a SIP password is stored. The value is only readable via GET /switch/suppliers/{id}/credentials |
smppPasswordSetrequireddata.trunks[].smppPasswordSet | boolean | - |
mediaModerequireddata.trunks[].mediaMode | string | -One of proxy, direct |
defaultRatePerUnitrequireddata.trunks[].defaultRatePerUnit | money | null | Cost per minute used when no deck row matches USD as a decimal string with exactly 6 places, e.g. "0.012500". |
billingIncrementrequireddata.trunks[].billingIncrement | string | null | - |
currencyrequireddata.trunks[].currency | string | null | - |
capacityrequireddata.trunks[].capacity | integer | null | Max concurrent channels |
maxCpsrequireddata.trunks[].maxCps | integer | null | - |
settlementModerequireddata.trunks[].settlementMode | string | -One of ap, prepaid |
balancerequireddata.trunks[].balance | money | Prepaid credit remaining with this supplier (prepaid settlement) USD as a decimal string with exactly 6 places, e.g. "0.012500". |
smsDeliveryMethodrequireddata.trunks[].smsDeliveryMethod | string | null | -One of http, smpp |
reachablerequireddata.trunks[].reachable | boolean | null | - |
reachCheckedAtrequireddata.trunks[].reachCheckedAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
createdAtrequireddata.trunks[].createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata.trunks[].updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
endpointsrequireddata.trunks[].endpoints | object[] | - |
idrequireddata.trunks[].endpoints[].id | string (uuid) | - |
vendorTrunkIdrequireddata.trunks[].endpoints[].vendorTrunkId | string (uuid) | - |
rolerequireddata.trunks[].endpoints[].role | string | -One of primary, backup |
hostrequireddata.trunks[].endpoints[].host | string | null | Null on a marketplace trunk |
portrequireddata.trunks[].endpoints[].port | integer | null | - |
transportrequireddata.trunks[].endpoints[].transport | string | -One of udp, tcp, tls |
priorityrequireddata.trunks[].endpoints[].priority | integer | - |
weightPctrequireddata.trunks[].endpoints[].weightPct | integer | null | - |
enabledrequireddata.trunks[].endpoints[].enabled | boolean | - |
optionsIntervalSecondsrequireddata.trunks[].endpoints[].optionsIntervalSeconds | integer | null | - |
failureThresholdrequireddata.trunks[].endpoints[].failureThreshold | integer | - |
recoveryThresholdrequireddata.trunks[].endpoints[].recoveryThreshold | integer | - |
autoDisablerequireddata.trunks[].endpoints[].autoDisable | boolean | - |
reachablerequireddata.trunks[].endpoints[].reachable | boolean | null | - |
reachLatencyMsrequireddata.trunks[].endpoints[].reachLatencyMs | integer | null | - |
reachCheckedAtrequireddata.trunks[].endpoints[].reachCheckedAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
healthDisabledAtrequireddata.trunks[].endpoints[].healthDisabledAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
healthrequireddata.trunks[].endpoints[].health | object | Derived health state (what routing believes), with its counters and thresholds |
flapdata.trunks[].endpoints[].flap | object | null | - |
createdAtrequireddata.trunks[].endpoints[].createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata.trunks[].endpoints[].updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Update a provider
PATCH/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Partial update; status is changed through POST /{id}/status instead. Send X-If-Unchanged-Since: <updatedAt you loaded> to be refused with 409 STALE_WRITE if someone else saved in between.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
name | string | -max 160 chars |
accountCode | string | null | -max 40 chars |
legalName | string | null | -max 200 chars |
tradingName | string | null | -max 200 chars |
providerType | string | null | -One of carrier, aggregator, mno, mvno, sip_provider |
registrationNumber | string | null | -max 80 chars |
taxId | string | null | -max 80 chars |
vatId | string | null | -max 80 chars |
address | string | null | -max 600 chars |
country | string | null | -max 2 chars |
accountManager | string | null | -max 160 chars |
tags | string[] | null | - |
services | string[] | null | -One of termination, origination, did, sms |
portalEmail | string (email) | null | -max 255 chars |
notes | string | null | -max 4000 chars |
currency | string | null | -max 3 chars |
status | string | Accepted on create only; later changes go through POST /{id}/statusOne of draft, pending_approval, testing, active, suspended, terminated |
contractStart | string | null | -max 10 chars |
contractEnd | string | null | -max 10 chars |
autoRenew | boolean | - |
rateNoticeDays | number | string | null | - |
disputeDays | number | string | null | - |
billingMode | string | null | -One of prepaid, postpaid |
creditLimit | number | string | null | - |
paymentTermsDays | number | string | null | - |
invoiceCycle | string | null | -One of weekly, biweekly, monthly |
billingTimezone | string | null | -max 64 chars |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SwitchProvider, shown earlier on this page. |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Delete a provider
DELETE/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Its trunks are NOT deleted: they are detached (ungrouped) with their routing intact.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
deletedrequireddata.deleted | boolean | -One of true |
detachedTrunksrequireddata.detachedTrunks | integer | - |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Change a provider lifecycle status
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Stops or resumes traffic on every trunk of the provider. The response says whether traffic changed and how many active trunks were affected.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
statusrequired | string | -One of draft, pending_approval, testing, active, suspended, terminated |
note | string | null | -max 1000 chars |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
idrequireddata.id | string (uuid) | - |
namerequireddata.name | string | - |
accountCoderequireddata.accountCode | string | null | - |
legalNamerequireddata.legalName | string | null | - |
tradingNamerequireddata.tradingName | string | null | - |
providerTyperequireddata.providerType | string | null | -One of carrier, aggregator, mno, mvno, sip_provider |
countryrequireddata.country | string | null | - |
servicesrequireddata.services | string[] | null | - |
portalEmailrequireddata.portalEmail | string | null | - |
currencyrequireddata.currency | string | - |
statusrequireddata.status | string | -One of draft, pending_approval, testing, active, suspended, terminated |
statusNoterequireddata.statusNote | string | null | - |
statusChangedAtrequireddata.statusChangedAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
routablerequireddata.routable | boolean | Whether this provider admits new calls at all, given its status |
contractStartrequireddata.contractStart | string | null | YYYY-MM-DD |
contractEndrequireddata.contractEnd | string | null | - |
autoRenewrequireddata.autoRenew | boolean | - |
rateNoticeDaysrequireddata.rateNoticeDays | integer | null | - |
disputeDaysrequireddata.disputeDays | integer | null | - |
billingModerequireddata.billingMode | string | -One of prepaid, postpaid |
creditLimitrequireddata.creditLimit | string | null | Decimal string with 2 decimal places, e.g. "5000.00" |
balancerequireddata.balance | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
paymentTermsDaysrequireddata.paymentTermsDays | integer | null | - |
invoiceCyclerequireddata.invoiceCycle | string | null | - |
createdAtrequireddata.createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata.updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
trafficChangerequireddata.trafficChange | string | -One of none, resumed, stopped |
affectedTrunksrequireddata.affectedTrunks | integer | - |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
List a provider contacts
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | Same fields as SwitchProviderContact, shown earlier on this page. |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Add a provider contact
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
One contact per role (NOC, rates, billing, finance, fraud, account, emergency).
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
rolerequired | string | -One of noc, rates, billing, finance, fraud, account, emergency |
name | string | null | -max 160 chars |
email | string | null | -max 255 chars |
phone | string | null | -max 40 chars |
timezone | string | null | -max 64 chars |
notify | boolean | - |
notes | string | null | -max 1000 chars |
Response 201
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SwitchProviderContact, shown earlier on this page. |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Update a provider contact
PATCH/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
contactIdrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
role | string | -One of noc, rates, billing, finance, fraud, account, emergency |
name | string | null | -max 160 chars |
email | string | null | -max 255 chars |
phone | string | null | -max 40 chars |
timezone | string | null | -max 64 chars |
notify | boolean | - |
notes | string | null | -max 1000 chars |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SwitchProviderContact, shown earlier on this page. |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Delete a provider contact
DELETE/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
contactIdrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
deletedrequireddata.deleted | boolean | -One of true |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
List providers with their trunks
GET/
Deprecated
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Every provider on your switch, each with its trunks (secrets redacted) and endpoint counts, plus trunks not yet assigned to a provider. Deprecated alias of the same operation under /switch/providers.
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SwitchProviderList, shown earlier on this page. |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Create a provider
POST/
Deprecated
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
A provider is the carrier or company that owns one or more supplier trunks. Deprecated alias of the same operation under /switch/providers.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Request body (application/json)
| Field | Type | Description |
|---|---|---|
namerequired | string | -max 160 chars |
accountCode | string | null | -max 40 chars |
legalName | string | null | -max 200 chars |
tradingName | string | null | -max 200 chars |
providerType | string | null | -One of carrier, aggregator, mno, mvno, sip_provider |
registrationNumber | string | null | -max 80 chars |
taxId | string | null | -max 80 chars |
vatId | string | null | -max 80 chars |
address | string | null | -max 600 chars |
country | string | null | -max 2 chars |
accountManager | string | null | -max 160 chars |
tags | string[] | null | - |
services | string[] | null | -One of termination, origination, did, sms |
portalEmail | string (email) | null | -max 255 chars |
notes | string | null | -max 4000 chars |
currency | string | null | -max 3 chars |
status | string | Accepted on create only; later changes go through POST /{id}/statusOne of draft, pending_approval, testing, active, suspended, terminated |
contractStart | string | null | -max 10 chars |
contractEnd | string | null | -max 10 chars |
autoRenew | boolean | - |
rateNoticeDays | number | string | null | - |
disputeDays | number | string | null | - |
billingMode | string | null | -One of prepaid, postpaid |
creditLimit | number | string | null | - |
paymentTermsDays | number | string | null | - |
invoiceCycle | string | null | -One of weekly, biweekly, monthly |
billingTimezone | string | null | -max 64 chars |
Response 201
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SwitchProvider, shown earlier on this page. |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get a provider with its trunks, endpoints and contacts
GET/
Deprecated
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Deprecated alias of the same operation under /switch/providers.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SwitchProviderDetail, shown earlier on this page. |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Update a provider
PATCH/
Deprecated
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Partial update; status is changed through POST /{id}/status instead. Send X-If-Unchanged-Since: <updatedAt you loaded> to be refused with 409 STALE_WRITE if someone else saved in between. Deprecated alias of the same operation under /switch/providers.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
name | string | -max 160 chars |
accountCode | string | null | -max 40 chars |
legalName | string | null | -max 200 chars |
tradingName | string | null | -max 200 chars |
providerType | string | null | -One of carrier, aggregator, mno, mvno, sip_provider |
registrationNumber | string | null | -max 80 chars |
taxId | string | null | -max 80 chars |
vatId | string | null | -max 80 chars |
address | string | null | -max 600 chars |
country | string | null | -max 2 chars |
accountManager | string | null | -max 160 chars |
tags | string[] | null | - |
services | string[] | null | -One of termination, origination, did, sms |
portalEmail | string (email) | null | -max 255 chars |
notes | string | null | -max 4000 chars |
currency | string | null | -max 3 chars |
status | string | Accepted on create only; later changes go through POST /{id}/statusOne of draft, pending_approval, testing, active, suspended, terminated |
contractStart | string | null | -max 10 chars |
contractEnd | string | null | -max 10 chars |
autoRenew | boolean | - |
rateNoticeDays | number | string | null | - |
disputeDays | number | string | null | - |
billingMode | string | null | -One of prepaid, postpaid |
creditLimit | number | string | null | - |
paymentTermsDays | number | string | null | - |
invoiceCycle | string | null | -One of weekly, biweekly, monthly |
billingTimezone | string | null | -max 64 chars |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SwitchProvider, shown earlier on this page. |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Delete a provider
DELETE/
Deprecated
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Its trunks are NOT deleted: they are detached (ungrouped) with their routing intact. Deprecated alias of the same operation under /switch/providers.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
deletedrequireddata.deleted | boolean | -One of true |
detachedTrunksrequireddata.detachedTrunks | integer | - |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Change a provider lifecycle status
POST/
Deprecated
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Stops or resumes traffic on every trunk of the provider. The response says whether traffic changed and how many active trunks were affected. Deprecated alias of the same operation under /switch/providers.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
statusrequired | string | -One of draft, pending_approval, testing, active, suspended, terminated |
note | string | null | -max 1000 chars |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
idrequireddata.id | string (uuid) | - |
namerequireddata.name | string | - |
accountCoderequireddata.accountCode | string | null | - |
legalNamerequireddata.legalName | string | null | - |
tradingNamerequireddata.tradingName | string | null | - |
providerTyperequireddata.providerType | string | null | -One of carrier, aggregator, mno, mvno, sip_provider |
countryrequireddata.country | string | null | - |
servicesrequireddata.services | string[] | null | - |
portalEmailrequireddata.portalEmail | string | null | - |
currencyrequireddata.currency | string | - |
statusrequireddata.status | string | -One of draft, pending_approval, testing, active, suspended, terminated |
statusNoterequireddata.statusNote | string | null | - |
statusChangedAtrequireddata.statusChangedAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
routablerequireddata.routable | boolean | Whether this provider admits new calls at all, given its status |
contractStartrequireddata.contractStart | string | null | YYYY-MM-DD |
contractEndrequireddata.contractEnd | string | null | - |
autoRenewrequireddata.autoRenew | boolean | - |
rateNoticeDaysrequireddata.rateNoticeDays | integer | null | - |
disputeDaysrequireddata.disputeDays | integer | null | - |
billingModerequireddata.billingMode | string | -One of prepaid, postpaid |
creditLimitrequireddata.creditLimit | string | null | Decimal string with 2 decimal places, e.g. "5000.00" |
balancerequireddata.balance | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
paymentTermsDaysrequireddata.paymentTermsDays | integer | null | - |
invoiceCyclerequireddata.invoiceCycle | string | null | - |
createdAtrequireddata.createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata.updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
trafficChangerequireddata.trafficChange | string | -One of none, resumed, stopped |
affectedTrunksrequireddata.affectedTrunks | integer | - |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
List a provider contacts
GET/
Deprecated
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Deprecated alias of the same operation under /switch/providers.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | Same fields as SwitchProviderContact, shown earlier on this page. |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Add a provider contact
POST/
Deprecated
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
One contact per role (NOC, rates, billing, finance, fraud, account, emergency). Deprecated alias of the same operation under /switch/providers.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
rolerequired | string | -One of noc, rates, billing, finance, fraud, account, emergency |
name | string | null | -max 160 chars |
email | string | null | -max 255 chars |
phone | string | null | -max 40 chars |
timezone | string | null | -max 64 chars |
notify | boolean | - |
notes | string | null | -max 1000 chars |
Response 201
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SwitchProviderContact, shown earlier on this page. |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Update a provider contact
PATCH/
Deprecated
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Deprecated alias of the same operation under /switch/providers.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
contactIdrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
role | string | -One of noc, rates, billing, finance, fraud, account, emergency |
name | string | null | -max 160 chars |
email | string | null | -max 255 chars |
phone | string | null | -max 40 chars |
timezone | string | null | -max 64 chars |
notify | boolean | - |
notes | string | null | -max 1000 chars |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SwitchProviderContact, shown earlier on this page. |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Delete a provider contact
DELETE/
Deprecated
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Deprecated alias of the same operation under /switch/providers.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
contactIdrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
deletedrequireddata.deleted | boolean | -One of true |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Get call totals for a provider across its trunks
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Calls, answer rate, minutes and cost over a window, overall and per trunk. cost and minutes are JSON numbers here (report figures, not ledger amounts).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
from | query | string | ISO start of the window |
to | query | string | ISO end of the window |
limit | query | string | - |
offset | query | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
windowrequireddata.window | object | - |
fromrequireddata.window.from | string | - |
torequireddata.window.to | string | - |
summaryrequireddata.summary | object | - |
callsrequireddata.summary.calls | number | - |
answeredrequireddata.summary.answered | number | - |
asrrequireddata.summary.asr | number | null | - |
minutesrequireddata.summary.minutes | number | - |
costrequireddata.summary.cost | number | - |
acdrequireddata.summary.acd | number | null | - |
avgPddMsrequireddata.summary.avgPddMs | number | null | - |
byTrunkrequireddata.byTrunk | object[] | - |
trunkIdrequireddata.byTrunk[].trunkId | string (uuid) | null | - |
labelrequireddata.byTrunk[].label | string | - |
callsrequireddata.byTrunk[].calls | number | - |
answeredrequireddata.byTrunk[].answered | number | - |
asrrequireddata.byTrunk[].asr | number | null | - |
minutesrequireddata.byTrunk[].minutes | number | - |
costrequireddata.byTrunk[].cost | number | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
List a provider payables and unbilled cost
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
The provider billing terms, its payable documents, and cost carried since the last one that has not been raised yet (a JSON number).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
currencyrequireddata.currency | string | - |
billingModerequireddata.billingMode | string | - |
creditLimitrequireddata.creditLimit | string | null | Decimal string with 2 decimal places, e.g. "5000.00" |
paymentTermsDaysrequireddata.paymentTermsDays | integer | null | - |
invoiceCyclerequireddata.invoiceCycle | string | null | - |
invoicesrequireddata.invoices | object[] | - |
unbilledrequireddata.unbilled | object | - |
sincerequireddata.unbilled.since | string | null | - |
callsrequireddata.unbilled.calls | number | - |
minutesrequireddata.unbilled.minutes | number | - |
costrequireddata.unbilled.cost | number | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
List what is wrong with a provider right now
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Derived on every read, never stored: unroutable status, trunks in fault or draining, expiring credentials, expired trunks.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
alertsrequireddata.alerts | object[] | - |
severityrequireddata.alerts[].severity | string | -One of critical, warning, info |
coderequireddata.alerts[].code | string | - |
messagerequireddata.alerts[].message | string | - |
trunkIddata.alerts[].trunkId | string (uuid) | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get the change history for a provider and its trunks
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
limit | query | string | Max entries (default 100) |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
entriesrequireddata.entries | object[] | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
List billing disputes with a provider
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | - |
idrequireddata[].id | string (uuid) | - |
supplierIdrequireddata[].supplierId | string (uuid) | - |
periodStartrequireddata[].periodStart | string (date-time) | null | ISO-8601 timestamp (UTC) |
periodEndrequireddata[].periodEnd | string (date-time) | null | ISO-8601 timestamp (UTC) |
ourAmountrequireddata[].ourAmount | string | null | Decimal string with 2 decimal places, e.g. "5000.00" |
theirAmountrequireddata[].theirAmount | string | null | Decimal string with 2 decimal places, e.g. "5000.00" |
currencyrequireddata[].currency | string | - |
statusrequireddata[].status | string | -One of open, submitted, accepted, rejected, settled, withdrawn |
reasonrequireddata[].reason | string | null | - |
resolutionrequireddata[].resolution | string | null | - |
invoiceRefrequireddata[].invoiceRef | string | null | - |
openedAtrequireddata[].openedAt | string (date-time) | ISO-8601 timestamp (UTC) |
respondByrequireddata[].respondBy | string (date-time) | null | ISO-8601 timestamp (UTC) |
closedAtrequireddata[].closedAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
daysLeftdata[].daysLeft | integer | null | Days left to respond (list only); negative = the window has passed |
createdAtrequireddata[].createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata[].updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Open a billing dispute with a provider
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
periodStart | string | null | -max 40 chars |
periodEnd | string | null | -max 40 chars |
ourAmount | number | string | null | - |
theirAmount | number | string | null | - |
currency | string | null | -max 3 chars |
reason | string | null | -max 4000 chars |
resolution | string | null | -max 4000 chars |
invoiceRef | string | null | -max 120 chars |
status | string | -One of open, submitted, accepted, rejected, settled, withdrawn |
Response 201
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SwitchProviderDispute, shown earlier on this page. |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Update a billing dispute
PATCH/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
disputeIdrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
periodStart | string | null | -max 40 chars |
periodEnd | string | null | -max 40 chars |
ourAmount | number | string | null | - |
theirAmount | number | string | null | - |
currency | string | null | -max 3 chars |
reason | string | null | -max 4000 chars |
resolution | string | null | -max 4000 chars |
invoiceRef | string | null | -max 120 chars |
status | string | -One of open, submitted, accepted, rejected, settled, withdrawn |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SwitchProviderDispute, shown earlier on this page. |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
List SIP endpoints of a supplier trunk
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Primary and backup addresses with derived health and flap reports. A trunk with an address but no endpoint rows has its address adopted as endpoint 1 on first read.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | Same fields as SwitchTrunkEndpoint, shown earlier on this page. |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Add a SIP endpoint to a supplier trunk
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
role | string | -One of primary, backup |
hostrequired | string | -max 255 chars |
port | number | string | null | - |
transport | string | -One of udp, tcp, tls |
priority | number | string | - |
weightPct | number | string | null | - |
enabled | boolean | - |
optionsIntervalSeconds | number | string | null | - |
failureThreshold | number | string | - |
recoveryThreshold | number | string | - |
autoDisable | boolean | - |
Response 201
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SwitchTrunkEndpoint, shown earlier on this page. |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Update a SIP endpoint
PATCH/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
endpointIdrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
role | string | -One of primary, backup |
host | string | -max 255 chars |
port | number | string | null | - |
transport | string | -One of udp, tcp, tls |
priority | number | string | - |
weightPct | number | string | null | - |
enabled | boolean | - |
optionsIntervalSeconds | number | string | null | - |
failureThreshold | number | string | - |
recoveryThreshold | number | string | - |
autoDisable | boolean | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SwitchTrunkEndpoint, shown earlier on this page. |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Remove a SIP endpoint
DELETE/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
The last endpoint of a trunk cannot be removed: add its replacement first.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
endpointIdrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
deletedrequireddata.deleted | boolean | -One of true |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Render the SBC gateway configuration for a supplier trunk
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Read-only. Names which settings are profile-level (and so need a deploy) rather than applied per call. Each read is recorded in the audit log.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
trunkIdrequireddata.trunkId | string (uuid) | - |
trunkLabelrequireddata.trunkLabel | string | - |
profileLevelrequireddata.profileLevel | object[] | - |
endpointIdrequireddata.profileLevel[].endpointId | string (uuid) | - |
hostrequireddata.profileLevel[].host | string | - |
settingsrequireddata.profileLevel[].settings | string[] | - |
xmlrequireddata.xml | string | Gateway configuration to place on the SBC |
applyNoterequireddata.applyNote | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Render the SBC gateway configuration for a provider
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Read-only. One rendered profile per trunk; needsReload says whether any of it needs deploying. Each read is recorded in the audit log.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
supplierIdrequireddata.supplierId | string (uuid) | - |
supplierNamerequireddata.supplierName | string | - |
trunksrequireddata.trunks | object[] | Same fields as SwitchSbcProfile, shown earlier on this page. |
needsReloadrequireddata.needsReload | boolean | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
List health events for a supplier trunk
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Probe results, up/down transitions, auto-disables, restores and degradations. Probe rows are kept 7 days, state changes 90 days. Page with before = the previous nextBefore.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
endpointId | query | string (uuid) | - |
days | query | integer | - |
kinds | query | string | Comma-separated: probe, transition, auto_disable, restore, degraded |
before | query | string | ISO cursor from nextBefore |
limit | query | integer | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
eventsrequireddata.events | object[] | - |
windowDaysrequireddata.windowDays | integer | - |
retentionrequireddata.retention | object | - |
probeDaysrequireddata.retention.probeDays | integer | - |
eventDaysrequireddata.retention.eventDays | integer | - |
nextBeforerequireddata.nextBefore | string | null | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get the flap report for a supplier trunk
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Endpoints that changed state repeatedly in the window. Observe-only: nothing is disabled because of it.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
windowHoursrequireddata.windowHours | number | - |
minTransitionsrequireddata.minTransitions | integer | - |
endpointsrequireddata.endpoints | object[] | - |
endpointIdrequireddata.endpoints[].endpointId | string (uuid) | null | - |
hostrequireddata.endpoints[].host | string | null | - |
transitionsrequireddata.endpoints[].transitions | integer | - |
firstAtrequireddata.endpoints[].firstAt | string (date-time) | ISO-8601 timestamp (UTC) |
lastAtrequireddata.endpoints[].lastAt | string (date-time) | ISO-8601 timestamp (UTC) |
flappingrequireddata.endpoints[].flapping | boolean | - |
flappingrequireddata.flapping | boolean | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Send a test call to a supplier trunk
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 6 requests per minute
- Real traffic
- Places a real test call or sends a real test SMS over the trunk.
A real INVITE from every media worker, on demand. Never touches health counters or state. Address details are withheld for a marketplace trunk. Audited.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
endpointId | string (uuid) | null | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
ranAtrequireddata.ranAt | string (date-time) | ISO-8601 timestamp (UTC) |
hostrequireddata.host | string | null | - |
portrequireddata.port | integer | null | - |
techPrefixrequireddata.techPrefix | string | null | - |
verdictrequireddata.verdict | string | - |
latencyMsrequireddata.latencyMs | integer | - |
diagnosticsrequireddata.diagnostics | object | - |
endpointHiddendata.endpointHidden | boolean | - |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Move a supplier trunk to another provider
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Pass supplierId: null to ungroup the trunk.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
supplierIdrequired | string (uuid) | null | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | A supplier (vendor) trunk. Carries every spec section-4 policy field accepted on create/update; secrets are replaced by *Set booleans. |
idrequireddata.id | string (uuid) | - |
supplierIdrequireddata.supplierId | string (uuid) | null | The owning provider; null = ungrouped |
labelrequireddata.label | string | - |
sourcerequireddata.source | string | "external" for a carrier you entered; "marketplace" for a trunk promoted from a marketplace purchase |
statusrequireddata.status | string | -One of active, disabled, draft, testing, draining, fault |
sipHostrequireddata.sipHost | string | null | Null on a marketplace trunk: the seller address is never disclosed |
sipPortrequireddata.sipPort | integer | null | - |
transportrequireddata.transport | string | null | -One of udp, tcp, tls |
techPrefixrequireddata.techPrefix | string | null | - |
sipAuthUsernamerequireddata.sipAuthUsername | string | null | - |
sipAuthPasswordSetrequireddata.sipAuthPasswordSet | boolean | Whether a SIP password is stored. The value is only readable via GET /switch/suppliers/{id}/credentials |
smppPasswordSetrequireddata.smppPasswordSet | boolean | - |
mediaModerequireddata.mediaMode | string | -One of proxy, direct |
defaultRatePerUnitrequireddata.defaultRatePerUnit | money | null | Cost per minute used when no deck row matches USD as a decimal string with exactly 6 places, e.g. "0.012500". |
billingIncrementrequireddata.billingIncrement | string | null | - |
currencyrequireddata.currency | string | null | - |
capacityrequireddata.capacity | integer | null | Max concurrent channels |
maxCpsrequireddata.maxCps | integer | null | - |
settlementModerequireddata.settlementMode | string | -One of ap, prepaid |
balancerequireddata.balance | money | Prepaid credit remaining with this supplier (prepaid settlement) USD as a decimal string with exactly 6 places, e.g. "0.012500". |
smsDeliveryMethodrequireddata.smsDeliveryMethod | string | null | -One of http, smpp |
reachablerequireddata.reachable | boolean | null | - |
reachCheckedAtrequireddata.reachCheckedAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
createdAtrequireddata.createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata.updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
List supplier trunks
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Every vendor trunk on your switch, newest first. SIP and SMPP secrets are replaced by *Set booleans.
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | Same fields as SwitchSupplierTrunk, shown earlier on this page. |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Create a supplier trunk
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
A trunk needs at least one reachable endpoint: a SIP host, an HTTPS SMS delivery URL, or an SMPP host.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Request body (application/json)
| Field | Type | Description |
|---|---|---|
labelrequired | string | -max 160 chars |
supplierId | string (uuid) | null | - |
sipHost | string | null | -max 255 chars |
sipPort | integer | null | -1 to 65535 |
transport | string | null | -One of udp, tcp, tls |
techPrefix | string | null | -max 24 chars |
sipAuthUsername | string | null | -max 128 chars |
sipAuthPassword | string | null | -max 128 chars |
supportedCodecs | string[] | null | - |
defaultRatePerUnit | number | null | -min 0 |
mediaMode | string | -One of proxy, direct |
billingIncrement | string | null | -max 10 chars |
currency | string | null | -max 3 chars |
capacity | integer | null | -min 0 |
maxCps | integer | null | -min 0 |
status | string | -One of active, disabled, draft, testing, draining, fault |
settlementMode | string | -One of ap, prepaid |
balance | number | null | -min 0 |
portalEmail | string (email) | null | -max 255 chars |
smsDeliveryUrl | string (uri) | null | -max 500 chars |
smsDeliveryMethod | string | null | -One of http, smpp |
smppHost | string | null | -max 255 chars |
smppPort | integer | null | -1 to 65535 |
smppSystemId | string | null | - |
smppPassword | string | null | -max 64 chars |
smppBindType | string | null | -One of transceiver, transmitter |
smppSystemType | string | null | -max 13 chars |
smppTps | integer | null | -1 to 1000 |
code | string | null | -max 40 chars |
description | string | null | -max 2000 chars |
product | string | null | -max 32 chars |
direction | string | -One of termination, origination, bidirectional |
testMode | boolean | - |
activationDate | string | null | -max 10 chars |
expirationDate | string | null | -max 10 chars |
tags | string[] | null | - |
notes | string | null | -max 4000 chars |
credentialExpiresAt | string | null | -max 40 chars |
credentialRotatedAt | string | null | -max 40 chars |
allowedSourceNetworks | string[] | null | - |
requestRateLimit | integer | null | -0 to 100000 |
sipRegister | boolean | - |
sipRealm | string | null | -max 255 chars |
incomingTechPrefix | string | null | -max 24 chars |
techPrefixMode | string | -One of add, remove, replace |
techPrefixSeparator | string | null | -max 4 chars |
cliRewrite | any | null | - |
dnisRewrite | any | null | - |
cliPolicy | string | -One of passthrough, replace, remove, pool |
cliPoolId | string (uuid) | null | - |
anonymousPolicy | string | -One of passthrough, reject, substitute |
e164Normalise | boolean | - |
defaultCountryCode | string | null | -max 6 chars |
minDnisLength | integer | null | -0 to 32 |
maxDnisLength | integer | null | -0 to 32 |
paiPolicy | string | -One of omit, passthrough, generate |
rpidPolicy | string | -One of omit, passthrough, generate |
diversionPolicy | string | -One of omit, passthrough, generate |
historyInfoPolicy | string | -One of omit, passthrough, generate |
lrnPolicy | string | -One of none, passthrough, strip |
packetizationMs | integer | null | -10 to 120 |
codecMode | string | -One of transparent, transcode |
forcedCodec | string | null | -max 24 chars |
srtpMode | string | -One of disabled, optional, required |
dtmfMode | string | -One of rfc2833, info, inband, auto |
t38Mode | string | -One of disabled, passthrough, relay |
comfortNoise | boolean | - |
silenceSuppression | boolean | - |
symmetricRtp | boolean | - |
inviteTimeoutSeconds | integer | null | -1 to 600 |
pddTimeoutSeconds | integer | null | -1 to 600 |
ringTimeoutSeconds | integer | null | -1 to 600 |
sessionExpiresSeconds | integer | null | -90 to 86400 |
minSeSeconds | integer | null | -90 to 86400 |
prackMode | string | -One of disabled, supported, required |
allowReinvite | boolean | - |
allowUpdate | boolean | - |
allowRefer | boolean | - |
earlyMediaPolicy | string | -One of passthrough, generate_ringback, suppress |
recordRoute | boolean | - |
customHeaders | object | null | - |
q850Map | object | null | - |
cpsBurst | integer | null | -0 to 10000 |
queueLimit | integer | null | -0 to 100000 |
maxChannelsPerDestination | integer | null | -0 to 100000 |
maxCpsPerDestination | integer | null | -0 to 10000 |
minCallSeconds | integer | null | -0 to 86400 |
maxCallSeconds | integer | null | -0 to 86400 |
dailyMinutesCap | integer | null | -min 0 |
dailySpendCap | number | string | null | - |
monthlySpendCap | number | string | null | - |
rampupChannels | integer | null | -0 to 100000 |
rampupDays | integer | null | -0 to 365 |
allowedPrefixes | string[] | null | - |
blockedPrefixes | string[] | null | - |
allowedCountries | string[] | null | - |
blockedCountries | string[] | null | - |
allowMobile | boolean | - |
allowFixed | boolean | - |
allowSatellite | boolean | - |
allowPremium | boolean | - |
allowTollfree | boolean | - |
allowEmergency | boolean | - |
jurisdictionPolicy | string | -One of any, interstate, intrastate, local |
schedule | object[] | null | - |
daysrequiredschedule[].days | integer[] | - |
fromrequiredschedule[].from | string | -max 5 chars |
torequiredschedule[].to | string | -max 5 chars |
tzrequiredschedule[].tz | string | -max 64 chars |
maintenanceWindows | object[] | null | - |
fromrequiredmaintenanceWindows[].from | string | -max 40 chars |
torequiredmaintenanceWindows[].to | string | -max 40 chars |
notemaintenanceWindows[].note | string | -max 200 chars |
routingEnabled | boolean | - |
lcrEligible | boolean | - |
qualityEligible | boolean | - |
popRegion | string | null | -max 40 chars |
allowedCustomerGroups | string[] | null | - |
allowedProducts | string[] | null | - |
minMarginPct | number | string | null | - |
minMarginAbs | number | string | null | - |
maxBuyRate | number | string | null | - |
overflowTrunkId | string (uuid) | null | - |
retryableSipCodes | integer[] | null | - |
terminalSipCodes | integer[] | null | - |
retryPolicy | string | -One of same_endpoint, next_endpoint, next_trunk |
maxAttemptsPerCall | integer | null | -1 to 10 |
qosThresholds | object | null | - |
asrMinqosThresholds.asrMin | number | -0 to 100 |
acdMinqosThresholds.acdMin | number | -0 to 86400 |
nerMinqosThresholds.nerMin | number | -0 to 100 |
pddMaxMsqosThresholds.pddMaxMs | integer | -0 to 600000 |
mosMinqosThresholds.mosMin | number | -1 to 5 |
shortCallMaxPctqosThresholds.shortCallMaxPct | number | -0 to 100 |
minCallsqosThresholds.minCalls | integer | -1 to 1000000 |
windowMinutesqosThresholds.windowMinutes | integer | -5 to 10080 |
actionqosThresholds.action | string | -One of alert, demote, reduce_cps, block_destination, disable_trunk |
modeqosThresholds.mode | string | -One of observe, enforce |
fraudControls | object | null | - |
shortCallSecondsfraudControls.shortCallSeconds | integer | -1 to 3600 |
longCallSecondsfraudControls.longCallSeconds | integer | -1 to 86400 |
duplicateDetectfraudControls.duplicateDetect | boolean | - |
spikeMultiplefraudControls.spikeMultiple | number | -1.1 to 1000 |
spendVelocityPerHourfraudControls.spendVelocityPerHour | number | -0 to 1000000 |
highCostRatefraudControls.highCostRate | number | -0 to 10000 |
actionfraudControls.action | string | -One of alert, demote, reduce_cps, block_destination, disable_trunk |
modefraudControls.mode | string | -One of observe, enforce |
Response 201
| Field | Type | Description |
|---|---|---|
datarequired | object | A supplier (vendor) trunk. Carries every spec section-4 policy field accepted on create/update; secrets are replaced by *Set booleans.Same fields as SwitchSupplierTrunk, shown earlier on this page. |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get live metrics for active supplier trunks
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Concurrent channels, peak CPS, reachability and the last hour of answer rate and post-dial delay per active trunk. Meant to be polled.
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
trunksrequireddata.trunks | object[] | - |
idrequireddata.trunks[].id | string (uuid) | - |
labelrequireddata.trunks[].label | string | - |
capacityrequireddata.trunks[].capacity | integer | null | - |
maxCpsrequireddata.trunks[].maxCps | integer | null | - |
reachablerequireddata.trunks[].reachable | boolean | null | - |
healthrequireddata.trunks[].health | object | Derived health state (what routing believes), with its counters and thresholds |
asrrequireddata.trunks[].asr | number | null | Last-hour answer rate %, null when idle |
asrSessionsrequireddata.trunks[].asrSessions | integer | - |
pddP95Msrequireddata.trunks[].pddP95Ms | integer | null | - |
lastSipCoderequireddata.trunks[].lastSipCode | integer | null | - |
lastCauserequireddata.trunks[].lastCause | string | null | - |
liveChannelsrequireddata.trunks[].liveChannels | integer | - |
cpsrequireddata.trunks[].cps | integer | - |
capacityPctrequireddata.trunks[].capacityPct | integer | null | - |
flappingrequireddata.trunks[].flapping | boolean | - |
totalChannelsrequireddata.totalChannels | integer | - |
peakCpsrequireddata.peakCps | integer | - |
cpsAttemptsrequireddata.cpsAttempts | integer | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Show where a supplier trunk sits in routing
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
The route groups that reference it and at what priority, and any customer trunk wired straight to it. unrouted is true when no traffic can reach it.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
groupsrequireddata.groups | object[] | - |
directrequireddata.direct | object[] | - |
unroutedrequireddata.unrouted | boolean | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Promote a marketplace purchase to a supplier trunk
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Turns a route you bought on the marketplace into a trunk your switch can route to. Idempotent per route: promoting again returns the existing trunk. The seller address stays hidden.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Request body (application/json)
| Field | Type | Description |
|---|---|---|
routeIdrequired | string (uuid) | - |
Response 201
| Field | Type | Description |
|---|---|---|
datarequired | object | A supplier (vendor) trunk. Carries every spec section-4 policy field accepted on create/update; secrets are replaced by *Set booleans.Same fields as SwitchSupplierTrunk, shown earlier on this page. |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Reveal a supplier trunk SIP credentials
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
The one audited way to read a stored SIP password back. Refused (403) for a trunk promoted from the marketplace, whose login belongs to the seller.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
sipAuthUsernamerequireddata.sipAuthUsername | string | null | - |
sipAuthPasswordrequireddata.sipAuthPassword | string | null | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get a supplier trunk overview and today figures
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Trunk settings plus KPIs: today cost, minutes and calls, last-hour answer rate, ACD, PDD and MOS, live channels, CPS and outstanding payables. KPI money is a JSON number.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
supplierrequireddata.supplier | object | - |
kpisrequireddata.kpis | object | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get quality by destination for a supplier trunk
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
window | query | integer | Window in hours (default 24) |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
windowHoursrequireddata.windowHours | number | - |
windowrequireddata.window | object | - |
kpisrequireddata.kpis | object | - |
destinationsrequireddata.destinations | object[] | - |
thresholdsrequireddata.thresholds | object | - |
excludedMetricsrequireddata.excludedMetrics | any[] | - |
minJudgeableSessionsrequireddata.minJudgeableSessions | number | - |
freshnessrequireddata.freshness | object | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
List quality and fraud protection events for a supplier trunk
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
What the protection sweep saw on this trunk and what it did (enforced) or would have done (observe mode).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
limit | query | integer | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | - |
idrequireddata[].id | string (uuid) | - |
vendorTrunkIdrequireddata[].vendorTrunkId | string (uuid) | - |
moderequireddata[].mode | string | - |
actionrequireddata[].action | string | - |
enforcedrequireddata[].enforced | boolean | - |
reasonrequireddata[].reason | string | - |
breachesrequireddata[].breaches | string[] | null | - |
measureddata[].measured | any | - |
windowMinutesrequireddata[].windowMinutes | integer | - |
callsrequireddata[].calls | integer | - |
createdAtrequireddata[].createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get a supplier trunk
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Includes its inbound IP ACLs, a loopback warning when its address is also one of your customers, and the derived health state.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | A supplier (vendor) trunk. Carries every spec section-4 policy field accepted on create/update; secrets are replaced by *Set booleans. |
idrequireddata.id | string (uuid) | - |
supplierIdrequireddata.supplierId | string (uuid) | null | The owning provider; null = ungrouped |
labelrequireddata.label | string | - |
sourcerequireddata.source | string | "external" for a carrier you entered; "marketplace" for a trunk promoted from a marketplace purchase |
statusrequireddata.status | string | -One of active, disabled, draft, testing, draining, fault |
sipHostrequireddata.sipHost | string | null | Null on a marketplace trunk: the seller address is never disclosed |
sipPortrequireddata.sipPort | integer | null | - |
transportrequireddata.transport | string | null | -One of udp, tcp, tls |
techPrefixrequireddata.techPrefix | string | null | - |
sipAuthUsernamerequireddata.sipAuthUsername | string | null | - |
sipAuthPasswordSetrequireddata.sipAuthPasswordSet | boolean | Whether a SIP password is stored. The value is only readable via GET /switch/suppliers/{id}/credentials |
smppPasswordSetrequireddata.smppPasswordSet | boolean | - |
mediaModerequireddata.mediaMode | string | -One of proxy, direct |
defaultRatePerUnitrequireddata.defaultRatePerUnit | money | null | Cost per minute used when no deck row matches USD as a decimal string with exactly 6 places, e.g. "0.012500". |
billingIncrementrequireddata.billingIncrement | string | null | - |
currencyrequireddata.currency | string | null | - |
capacityrequireddata.capacity | integer | null | Max concurrent channels |
maxCpsrequireddata.maxCps | integer | null | - |
settlementModerequireddata.settlementMode | string | -One of ap, prepaid |
balancerequireddata.balance | money | Prepaid credit remaining with this supplier (prepaid settlement) USD as a decimal string with exactly 6 places, e.g. "0.012500". |
smsDeliveryMethodrequireddata.smsDeliveryMethod | string | null | -One of http, smpp |
reachablerequireddata.reachable | boolean | null | - |
reachCheckedAtrequireddata.reachCheckedAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
createdAtrequireddata.createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata.updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
ipAclsrequireddata.ipAcls | object[] | - |
idrequireddata.ipAcls[].id | string (uuid) | - |
entityTyperequireddata.ipAcls[].entityType | string | -One of customer, trunk |
entityIdrequireddata.ipAcls[].entityId | string (uuid) | - |
cidrrequireddata.ipAcls[].cidr | string | - |
descriptionrequireddata.ipAcls[].description | string | null | - |
createdAtrequireddata.ipAcls[].createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
hairpinrequireddata.hairpin | object | null | Warning when this address is also one of your own customers (loopback) |
healthrequireddata.health | object | Derived health state (what routing believes), with its counters and thresholds |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Update a supplier trunk
PATCH/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Partial update. When trunk change approval is on, the change is queued for review instead and the response carries pendingChange. Send X-If-Unchanged-Since: <updatedAt you loaded> to be refused with 409 STALE_WRITE if someone else saved in between.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
label | string | -max 160 chars |
supplierId | string (uuid) | null | - |
sipHost | string | null | -max 255 chars |
sipPort | integer | null | -1 to 65535 |
transport | string | null | -One of udp, tcp, tls |
techPrefix | string | null | -max 24 chars |
sipAuthUsername | string | null | -max 128 chars |
sipAuthPassword | string | null | -max 128 chars |
supportedCodecs | string[] | null | - |
defaultRatePerUnit | number | null | -min 0 |
mediaMode | string | -One of proxy, direct |
billingIncrement | string | null | -max 10 chars |
currency | string | null | -max 3 chars |
capacity | integer | null | -min 0 |
maxCps | integer | null | -min 0 |
status | string | -One of active, disabled, draft, testing, draining, fault |
settlementMode | string | -One of ap, prepaid |
balance | number | null | -min 0 |
portalEmail | string (email) | null | -max 255 chars |
smsDeliveryUrl | string (uri) | null | -max 500 chars |
smsDeliveryMethod | string | null | -One of http, smpp |
smppHost | string | null | -max 255 chars |
smppPort | integer | null | -1 to 65535 |
smppSystemId | string | null | - |
smppPassword | string | null | -max 64 chars |
smppBindType | string | null | -One of transceiver, transmitter |
smppSystemType | string | null | -max 13 chars |
smppTps | integer | null | -1 to 1000 |
code | string | null | -max 40 chars |
description | string | null | -max 2000 chars |
product | string | null | -max 32 chars |
direction | string | -One of termination, origination, bidirectional |
testMode | boolean | - |
activationDate | string | null | -max 10 chars |
expirationDate | string | null | -max 10 chars |
tags | string[] | null | - |
notes | string | null | -max 4000 chars |
credentialExpiresAt | string | null | -max 40 chars |
credentialRotatedAt | string | null | -max 40 chars |
allowedSourceNetworks | string[] | null | - |
requestRateLimit | integer | null | -0 to 100000 |
sipRegister | boolean | - |
sipRealm | string | null | -max 255 chars |
incomingTechPrefix | string | null | -max 24 chars |
techPrefixMode | string | -One of add, remove, replace |
techPrefixSeparator | string | null | -max 4 chars |
cliRewrite | any | null | - |
dnisRewrite | any | null | - |
cliPolicy | string | -One of passthrough, replace, remove, pool |
cliPoolId | string (uuid) | null | - |
anonymousPolicy | string | -One of passthrough, reject, substitute |
e164Normalise | boolean | - |
defaultCountryCode | string | null | -max 6 chars |
minDnisLength | integer | null | -0 to 32 |
maxDnisLength | integer | null | -0 to 32 |
paiPolicy | string | -One of omit, passthrough, generate |
rpidPolicy | string | -One of omit, passthrough, generate |
diversionPolicy | string | -One of omit, passthrough, generate |
historyInfoPolicy | string | -One of omit, passthrough, generate |
lrnPolicy | string | -One of none, passthrough, strip |
packetizationMs | integer | null | -10 to 120 |
codecMode | string | -One of transparent, transcode |
forcedCodec | string | null | -max 24 chars |
srtpMode | string | -One of disabled, optional, required |
dtmfMode | string | -One of rfc2833, info, inband, auto |
t38Mode | string | -One of disabled, passthrough, relay |
comfortNoise | boolean | - |
silenceSuppression | boolean | - |
symmetricRtp | boolean | - |
inviteTimeoutSeconds | integer | null | -1 to 600 |
pddTimeoutSeconds | integer | null | -1 to 600 |
ringTimeoutSeconds | integer | null | -1 to 600 |
sessionExpiresSeconds | integer | null | -90 to 86400 |
minSeSeconds | integer | null | -90 to 86400 |
prackMode | string | -One of disabled, supported, required |
allowReinvite | boolean | - |
allowUpdate | boolean | - |
allowRefer | boolean | - |
earlyMediaPolicy | string | -One of passthrough, generate_ringback, suppress |
recordRoute | boolean | - |
customHeaders | object | null | - |
q850Map | object | null | - |
cpsBurst | integer | null | -0 to 10000 |
queueLimit | integer | null | -0 to 100000 |
maxChannelsPerDestination | integer | null | -0 to 100000 |
maxCpsPerDestination | integer | null | -0 to 10000 |
minCallSeconds | integer | null | -0 to 86400 |
maxCallSeconds | integer | null | -0 to 86400 |
dailyMinutesCap | integer | null | -min 0 |
dailySpendCap | number | string | null | - |
monthlySpendCap | number | string | null | - |
rampupChannels | integer | null | -0 to 100000 |
rampupDays | integer | null | -0 to 365 |
allowedPrefixes | string[] | null | - |
blockedPrefixes | string[] | null | - |
allowedCountries | string[] | null | - |
blockedCountries | string[] | null | - |
allowMobile | boolean | - |
allowFixed | boolean | - |
allowSatellite | boolean | - |
allowPremium | boolean | - |
allowTollfree | boolean | - |
allowEmergency | boolean | - |
jurisdictionPolicy | string | -One of any, interstate, intrastate, local |
schedule | object[] | null | - |
daysrequiredschedule[].days | integer[] | - |
fromrequiredschedule[].from | string | -max 5 chars |
torequiredschedule[].to | string | -max 5 chars |
tzrequiredschedule[].tz | string | -max 64 chars |
maintenanceWindows | object[] | null | - |
fromrequiredmaintenanceWindows[].from | string | -max 40 chars |
torequiredmaintenanceWindows[].to | string | -max 40 chars |
notemaintenanceWindows[].note | string | -max 200 chars |
routingEnabled | boolean | - |
lcrEligible | boolean | - |
qualityEligible | boolean | - |
popRegion | string | null | -max 40 chars |
allowedCustomerGroups | string[] | null | - |
allowedProducts | string[] | null | - |
minMarginPct | number | string | null | - |
minMarginAbs | number | string | null | - |
maxBuyRate | number | string | null | - |
overflowTrunkId | string (uuid) | null | - |
retryableSipCodes | integer[] | null | - |
terminalSipCodes | integer[] | null | - |
retryPolicy | string | -One of same_endpoint, next_endpoint, next_trunk |
maxAttemptsPerCall | integer | null | -1 to 10 |
qosThresholds | object | null | - |
asrMinqosThresholds.asrMin | number | -0 to 100 |
acdMinqosThresholds.acdMin | number | -0 to 86400 |
nerMinqosThresholds.nerMin | number | -0 to 100 |
pddMaxMsqosThresholds.pddMaxMs | integer | -0 to 600000 |
mosMinqosThresholds.mosMin | number | -1 to 5 |
shortCallMaxPctqosThresholds.shortCallMaxPct | number | -0 to 100 |
minCallsqosThresholds.minCalls | integer | -1 to 1000000 |
windowMinutesqosThresholds.windowMinutes | integer | -5 to 10080 |
actionqosThresholds.action | string | -One of alert, demote, reduce_cps, block_destination, disable_trunk |
modeqosThresholds.mode | string | -One of observe, enforce |
fraudControls | object | null | - |
shortCallSecondsfraudControls.shortCallSeconds | integer | -1 to 3600 |
longCallSecondsfraudControls.longCallSeconds | integer | -1 to 86400 |
duplicateDetectfraudControls.duplicateDetect | boolean | - |
spikeMultiplefraudControls.spikeMultiple | number | -1.1 to 1000 |
spendVelocityPerHourfraudControls.spendVelocityPerHour | number | -0 to 1000000 |
highCostRatefraudControls.highCostRate | number | -0 to 10000 |
actionfraudControls.action | string | -One of alert, demote, reduce_cps, block_destination, disable_trunk |
modefraudControls.mode | string | -One of observe, enforce |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | A supplier (vendor) trunk. Carries every spec section-4 policy field accepted on create/update; secrets are replaced by *Set booleans. |
idrequireddata.id | string (uuid) | - |
supplierIdrequireddata.supplierId | string (uuid) | null | The owning provider; null = ungrouped |
labelrequireddata.label | string | - |
sourcerequireddata.source | string | "external" for a carrier you entered; "marketplace" for a trunk promoted from a marketplace purchase |
statusrequireddata.status | string | -One of active, disabled, draft, testing, draining, fault |
sipHostrequireddata.sipHost | string | null | Null on a marketplace trunk: the seller address is never disclosed |
sipPortrequireddata.sipPort | integer | null | - |
transportrequireddata.transport | string | null | -One of udp, tcp, tls |
techPrefixrequireddata.techPrefix | string | null | - |
sipAuthUsernamerequireddata.sipAuthUsername | string | null | - |
sipAuthPasswordSetrequireddata.sipAuthPasswordSet | boolean | Whether a SIP password is stored. The value is only readable via GET /switch/suppliers/{id}/credentials |
smppPasswordSetrequireddata.smppPasswordSet | boolean | - |
mediaModerequireddata.mediaMode | string | -One of proxy, direct |
defaultRatePerUnitrequireddata.defaultRatePerUnit | money | null | Cost per minute used when no deck row matches USD as a decimal string with exactly 6 places, e.g. "0.012500". |
billingIncrementrequireddata.billingIncrement | string | null | - |
currencyrequireddata.currency | string | null | - |
capacityrequireddata.capacity | integer | null | Max concurrent channels |
maxCpsrequireddata.maxCps | integer | null | - |
settlementModerequireddata.settlementMode | string | -One of ap, prepaid |
balancerequireddata.balance | money | Prepaid credit remaining with this supplier (prepaid settlement) USD as a decimal string with exactly 6 places, e.g. "0.012500". |
smsDeliveryMethodrequireddata.smsDeliveryMethod | string | null | -One of http, smpp |
reachablerequireddata.reachable | boolean | null | - |
reachCheckedAtrequireddata.reachCheckedAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
createdAtrequireddata.createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata.updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
pendingChangedata.pendingChange | object | - |
idrequireddata.pendingChange.id | string (uuid) | - |
fieldsrequireddata.pendingChange.fields | string[] | - |
statusrequireddata.pendingChange.status | string | - |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Delete a supplier trunk
DELETE/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
deletedrequireddata.deleted | boolean | -One of true |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Get the production readiness checklist for a supplier trunk
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
A pure read: it reports and never blocks. Bundle carriage trunks come back exempt with no checks.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
trunkIdrequireddata.trunkId | string (uuid) | - |
exemptrequireddata.exempt | boolean | - |
exemptReasonrequireddata.exemptReason | string | null | - |
staterequireddata.state | string | -One of ready, not_ready, exempt |
checksrequireddata.checks | object[] | - |
idrequireddata.checks[].id | string | - |
specrequireddata.checks[].spec | string | - |
titlerequireddata.checks[].title | string | - |
statusrequireddata.checks[].status | string | pass, warn or fail |
evidencerequireddata.checks[].evidence | string | - |
fixrequireddata.checks[].fix | string | -One of supplier, contacts, endpoints, configuration, cost_deck, diagnostics, settings, routing |
failingrequireddata.failing | integer | - |
warningrequireddata.warning | integer | - |
grandfatheredrequireddata.grandfathered | boolean | - |
blockingEnabledrequireddata.blockingEnabled | boolean | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
List configuration versions of a supplier trunk
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
limit | query | integer | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | - |
idrequireddata[].id | string (uuid) | - |
versionrequireddata[].version | integer | - |
sourcerequireddata[].source | string | Which door the change came through, e.g. update, approval, api |
changedFieldsrequireddata[].changedFields | string[] | - |
diffrequireddata[].diff | object | null | - |
noterequireddata[].note | string | null | - |
checksumrequireddata[].checksum | string | null | - |
changeRequestIdrequireddata[].changeRequestId | string (uuid) | null | - |
actorUserIdrequireddata[].actorUserId | string (uuid) | null | - |
actorEmaildata[].actorEmail | string | null | - |
createdAtrequireddata[].createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get one configuration version of a supplier trunk
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
The full snapshot as of that version, plus the previous version snapshot for comparison.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
versionIdrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
idrequireddata.id | string (uuid) | - |
versionrequireddata.version | integer | - |
sourcerequireddata.source | string | Which door the change came through, e.g. update, approval, api |
changedFieldsrequireddata.changedFields | string[] | - |
diffrequireddata.diff | object | null | - |
noterequireddata.note | string | null | - |
checksumrequireddata.checksum | string | null | - |
changeRequestIdrequireddata.changeRequestId | string (uuid) | null | - |
actorUserIdrequireddata.actorUserId | string (uuid) | null | - |
actorEmaildata.actorEmail | string | null | - |
createdAtrequireddata.createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
snapshotrequireddata.snapshot | object | - |
previousrequireddata.previous | object | null | - |
idrequireddata.previous.id | string (uuid) | - |
versionrequireddata.previous.version | integer | - |
snapshotrequireddata.previous.snapshot | object | - |
createdAtrequireddata.previous.createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Test a supplier trunk SMS delivery
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 20 requests per minute
- Real traffic
- Places a real test call or sends a real test SMS over the trunk.
SMPP performs a real bind with the stored credentials and sends nothing; HTTP can only be checked for a well-formed https URL.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
passrequireddata.pass | boolean | - |
viarequireddata.via | string | -One of http, smpp |
checksrequireddata.checks | object[] | - |
labelrequireddata.checks[].label | string | - |
valuerequireddata.checks[].value | string | - |
okrequireddata.checks[].ok | boolean | - |
messagerequireddata.message | string | - |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Test unsaved SMS delivery details
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 20 requests per minute
- Real traffic
- Places a real test call or sends a real test SMS over the trunk.
For the create form. SMPP performs a real bind and sends nothing; HTTP can only be checked for a well-formed https URL. The password is used for this one handshake and never stored.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Request body (application/json)
| Field | Type | Description |
|---|---|---|
smsDeliveryMethod | string | null | -One of http, smpp |
smsDeliveryUrl | string | null | -max 500 chars |
smppHost | string | null | -max 255 chars |
smppPort | integer | null | -1 to 65535 |
smppSystemId | string | null | Short account code the supplier issued (max 16 chars). An email address is rejected.max 16 chars |
smppPassword | string | null | -max 64 chars |
smppBindType | string | null | -One of transceiver, transmitter |
smppSystemType | string | null | -max 13 chars |
smppTps | integer | null | -1 to 1000 |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SwitchSmsEndpointTest, shown earlier on this page. |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Email a supplier portal sign-in link
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
- Sends email
- Sends an email to a third party.
Sends a magic link to the trunk portalEmail. When no portal email is set it answers 400 VALIDATION_ERROR.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
sentrequireddata.sent | boolean | -One of true |
torequireddata.to | string | - |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
List the cost deck in force on a supplier trunk
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Active rows only; scheduled and archived rows have their own endpoints. Search matches a prefix start.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
search | query | string | Digits; matches prefixes starting with them |
limit | query | string | 1-1000, default 100 |
offset | query | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
rowsrequireddata.rows | object[] | - |
idrequireddata.rows[].id | string (uuid) | - |
vendorTrunkIdrequireddata.rows[].vendorTrunkId | string (uuid) | - |
prefixrequireddata.rows[].prefix | string | - |
originPrefixrequireddata.rows[].originPrefix | string | Caller-origin prefix; "" = any origin |
ratePerUnitrequireddata.rows[].ratePerUnit | money | Cost per minute USD as a decimal string with exactly 6 places, e.g. "0.012500". |
destinationNamerequireddata.rows[].destinationName | string | null | - |
billingIncrementrequireddata.rows[].billingIncrement | string | null | e.g. "6/6"; null inherits the trunk default |
statusrequireddata.rows[].status | string | - |
effectiveFromrequireddata.rows[].effectiveFrom | string (date-time) | null | ISO-8601 timestamp (UTC) |
totalrequireddata.total | integer | - |
limitrequireddata.limit | integer | - |
offsetrequireddata.offset | integer | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Set the cost for one prefix on a supplier trunk
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Creates or replaces the active rate for the prefix (and origin), effective now.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
prefixrequired | string | -max 24 chars |
raterequired | number | Cost per minute, USDmin 0 |
origin | string | -max 24 chars |
billingIncrement | string | -max 10 chars |
Response 201
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SwitchTrunkRate, shown earlier on this page. |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Set costs for many prefixes on a supplier trunk
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
rowsrequired | object[] | - |
prefixrequiredrows[].prefix | string | -max 24 chars |
raterequiredrows[].rate | number | Cost per minute, USDmin 0 |
originrows[].origin | string | -max 24 chars |
billingIncrementrows[].billingIncrement | string | -max 10 chars |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
appliedrequireddata.applied | integer | - |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Delete one cost row from a supplier trunk
DELETE/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
rateIdrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
deletedrequireddata.deleted | boolean | -One of true |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Clear the cost deck of a supplier trunk
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
The deck is archived, not destroyed: restore it with POST /{id}/rates/restore.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
deletedrequireddata.deleted | integer | - |
archivedrequireddata.archived | integer | - |
recoverablerequireddata.recoverable | boolean | - |
revisionIdrequireddata.revisionId | string (uuid) | null | - |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
List archived cost decks of a supplier trunk
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | - |
revisionIdrequireddata[].revisionId | string (uuid) | null | - |
archivedAtrequireddata[].archivedAt | string (date-time) | ISO-8601 timestamp (UTC) |
rowsrequireddata[].rows | integer | - |
labelrequireddata[].label | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Restore an archived cost deck
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Restores the newest archive unless revisionId names one. Each row returns to the status it was archived from.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
revisionId | string (uuid) | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
restoredrequireddata.restored | integer | - |
skippedrequireddata.skipped | integer | - |
revisionIdrequireddata.revisionId | string (uuid) | null | - |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
List scheduled cost changes on a supplier trunk
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | Same fields as SwitchTrunkRate, shown earlier on this page. |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Schedule a future cost change for one prefix
POST/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
A date in the past or now applies the rate immediately instead.
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
prefixrequired | string | -max 24 chars |
raterequired | number | Cost per minute, USDmin 0 |
origin | string | -max 24 chars |
billingIncrement | string | -max 10 chars |
effectiveFromrequired | string (date-time) | - |
Response 201
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SwitchTrunkRate, shown earlier on this page. |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Cancel a scheduled cost change
DELETE/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Test keys: refused with 403 TEST_KEY_NOT_ALLOWED. The Switch has no test mode, so a change always applies to your live configuration. Test keys can still read Switch data.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
rateIdrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
cancelledrequireddata.cancelled | boolean | -One of true |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
approvalRequireddata.approvalRequired | boolean | -One of true |
approvalRequestIddata.approvalRequestId | string (uuid) | null | - |
permissiondata.permission | string | - |
expiresAtdata.expiresAt | string (date-time) | - |
messagedata.message | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support. - Also
STALE_WRITE
Review queued cost changes before they take effect
GET/
- Access
- API key. Scoped keys need
switch:manage. - Rate limit
- 100 requests per second (the default)
Every queued change with the price billed today, the price that takes over and when, and the effect on the last 30 days of traffic. Rates are 6-decimal strings; monthlyDelta and netMonthlyDelta are JSON numbers. At most 500 rows.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
rowsrequireddata.rows | object[] | - |
idrequireddata.rows[].id | string | - |
kindrequireddata.rows[].kind | string | -One of deck, row, removed |
prefixrequireddata.rows[].prefix | string | - |
destinationrequireddata.rows[].destination | string | null | - |
currentRaterequireddata.rows[].currentRate | money | null | US dollars as a decimal string with exactly 6 decimal places, e.g. "0.012500". Do money arithmetic with a decimal type, not floating point. USD as a decimal string with exactly 6 places, e.g. "0.012500". |
newRaterequireddata.rows[].newRate | string | null | - |
deltaPctrequireddata.rows[].deltaPct | number | null | - |
effectiveFromrequireddata.rows[].effectiveFrom | string (date-time) | ISO-8601 timestamp (UTC) |
minutes30drequireddata.rows[].minutes30d | number | - |
calls30drequireddata.rows[].calls30d | integer | - |
monthlyDeltarequireddata.rows[].monthlyDelta | number | null | - |
totalRowsrequireddata.totalRows | integer | - |
decksrequireddata.decks | object[] | - |
impactTruncatedrequireddata.impactTruncated | boolean | - |
summaryrequireddata.summary | object | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 402
SWITCH_SUBSCRIPTION_REQUIRED: the account has no active Switch plan or trial. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.