Skip to content
Markets open

API reference

Rate sheets

Upload and manage per-prefix rate decks on routes you sell.

21 operationsBase URL https://packetexchange.io/api/v1Postman collection

List rate-sheet imports for a route

GET/api/v1/routes/{id}/rate-sheets

Access
API key. Scoped keys need routes:read.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject[]-
idrequireddata[].idstring (uuid)-
routeIdrequireddata[].routeIdstring (uuid)-
filenamerequireddata[].filenamestring-
fileTyperequireddata[].fileTypestring-
statusrequireddata[].statusstring-
rowCountrequireddata[].rowCountinteger | null-
columnMappingdata[].columnMappingany-
previewRowsdata[].previewRowsany-
warningsdata[].warningsany-
currencyrequireddata[].currencystring | null-
fxRaterequireddata[].fxRatestring | null-
errorMessagerequireddata[].errorMessagestring | null-
createdAtrequireddata[].createdAtstring (date-time)ISO-8601 timestamp (UTC)
appliedAtrequireddata[].appliedAtstring (date-time) | nullISO-8601 timestamp (UTC)

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Upload a rate sheet to a route

POST/api/v1/routes/{id}/rate-sheets

Access
API key. Scoped keys need routes:write.
Rate limit
10 requests per minute

Multipart upload (field file, CSV or Excel). Creates an import to preview, diff and apply; nothing is priced until you apply it.

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (multipart/form-data)

FieldTypeDescription
filerequiredstringCSV or Excel rate sheet (binary)

Response 201

FieldTypeDescription
datarequiredobject-
idrequireddata.idstring (uuid)-
routeIdrequireddata.routeIdstring (uuid)-
filenamerequireddata.filenamestring-
fileTyperequireddata.fileTypestring-
statusrequireddata.statusstring-
rowCountrequireddata.rowCountinteger | null-
columnMappingdata.columnMappingany-
previewRowsdata.previewRowsany-
warningsdata.warningsany-
currencyrequireddata.currencystring | null-
fxRaterequireddata.fxRatestring | null-
errorMessagerequireddata.errorMessagestring | null-
createdAtrequireddata.createdAtstring (date-time)ISO-8601 timestamp (UTC)
appliedAtrequireddata.appliedAtstring (date-time) | nullISO-8601 timestamp (UTC)
rawSampledata.rawSampleany-
summarydata.summaryany-
confidencedata.confidenceany-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Upload and apply a rate sheet in one step

POST/api/v1/routes/{id}/rate-sheets/quick

Access
API key. Scoped keys need routes:write.
Rate limit
10 requests per minute

Applies straight away when the sheet reads unambiguously; otherwise returns outcome: "review" with the reasons.

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (multipart/form-data)

FieldTypeDescription
filerequiredstringCSV or Excel rate sheet (binary)

Response 200

FieldTypeDescription
datarequiredobject-
outcomerequireddata.outcomestring-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Get a rate-sheet import

GET/api/v1/routes/{id}/rate-sheets/{importId}

Access
API key. Scoped keys need routes:read.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
importIdrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject-
idrequireddata.idstring (uuid)-
routeIdrequireddata.routeIdstring (uuid)-
filenamerequireddata.filenamestring-
fileTyperequireddata.fileTypestring-
statusrequireddata.statusstring-
rowCountrequireddata.rowCountinteger | null-
columnMappingdata.columnMappingany-
previewRowsdata.previewRowsany-
warningsdata.warningsany-
currencyrequireddata.currencystring | null-
fxRaterequireddata.fxRatestring | null-
errorMessagerequireddata.errorMessagestring | null-
createdAtrequireddata.createdAtstring (date-time)ISO-8601 timestamp (UTC)
appliedAtrequireddata.appliedAtstring (date-time) | nullISO-8601 timestamp (UTC)
rawSampledata.rawSampleany-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Preview a rate-sheet import

POST/api/v1/routes/{id}/rate-sheets/{importId}/preview

Access
API key. Scoped keys need routes:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
importIdrequiredpathstring-

Request body (application/json)

FieldTypeDescription
fxRatenumberMultiply source rates by this to convert to USDmin 0
mappinganyColumn mapping override
overridesobject-
defaultIncrementstring | null-
increaseEffectiveAtstring | string (date-time) | nullWhen the sheet's increases take effect: "now", an ISO instant, or omitted for the default notice period (diff and apply only)

Response 200

FieldTypeDescription
datarequiredobjectParsed rows as they would be priced

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Compare a rate-sheet import with the live deck

POST/api/v1/routes/{id}/rate-sheets/{importId}/diff

Access
API key. Scoped keys need routes:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
importIdrequiredpathstring-

Request body (application/json)

FieldTypeDescription
fxRatenumberMultiply source rates by this to convert to USDmin 0
mappinganyColumn mapping override
overridesobject-
defaultIncrementstring | null-
increaseEffectiveAtstring | string (date-time) | nullWhen the sheet's increases take effect: "now", an ISO instant, or omitted for the default notice period (diff and apply only)

Response 200

FieldTypeDescription
datarequiredobjectAdded, changed and removed rows

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Apply a rate-sheet import

POST/api/v1/routes/{id}/rate-sheets/{importId}/apply

Access
API key. Scoped keys need routes:write.
Rate limit
100 requests per second (the default)

Rate increases put list-rate buyers on hold until they accept the new rate.

Parameters

NameInTypeDescription
idrequiredpathstring-
importIdrequiredpathstring-

Request body (application/json)

FieldTypeDescription
fxRatenumberMultiply source rates by this to convert to USDmin 0
mappinganyColumn mapping override
overridesobject-
defaultIncrementstring | null-
increaseEffectiveAtstring | string (date-time) | nullWhen the sheet's increases take effect: "now", an ISO instant, or omitted for the default notice period (diff and apply only)

Response 200

FieldTypeDescription
datarequiredobject-
appliedrequireddata.appliedinteger-
addedrequireddata.addedinteger-
changedrequireddata.changedinteger-
removedrequireddata.removedinteger-
droppedBlockedrequireddata.droppedBlockedinteger-
diffdata.diffany-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Roll a route back to an earlier rate-sheet import

POST/api/v1/routes/{id}/rate-sheets/{importId}/rollback

Access
API key. Scoped keys need routes:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
importIdrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject-
appliedrequireddata.appliedinteger-
addedrequireddata.addedinteger-
changedrequireddata.changedinteger-
removedrequireddata.removedinteger-
droppedBlockedrequireddata.droppedBlockedinteger-
diffdata.diffany-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Reapply a rate-sheet import with new settings

POST/api/v1/routes/{id}/rate-sheets/{importId}/reapply

Access
API key. Scoped keys need routes:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
importIdrequiredpathstring-

Request body (application/json)

FieldTypeDescription
fxRatenumberMultiply source rates by this to convert to USDmin 0
mappinganyColumn mapping override
overridesobject-
defaultIncrementstring | null-
increaseEffectiveAtstring | string (date-time) | nullWhen the sheet's increases take effect: "now", an ISO instant, or omitted for the default notice period (diff and apply only)

Response 200

FieldTypeDescription
datarequiredobject-
appliedrequireddata.appliedinteger-
addedrequireddata.addedinteger-
changedrequireddata.changedinteger-
removedrequireddata.removedinteger-
droppedBlockedrequireddata.droppedBlockedinteger-
diffdata.diffany-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Publish an A-Z deck as per-country listings

POST/api/v1/routes/{id}/publish-by-country

Access
API key. Scoped keys need routes:write.
Rate limit
6 requests per minute

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (application/json)

FieldTypeDescription
perCarrierboolean-

Response 200

FieldTypeDescription
datarequiredobjectThe listings created

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Collapse per-country listings back into one deck

POST/api/v1/routes/{id}/collapse-bundle

Access
API key. Scoped keys need routes:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject-
removedrequireddata.removedinteger-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List the per-country listings of a deck

GET/api/v1/routes/{id}/children

Access
API key. Scoped keys need routes:read.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject[]-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List per-destination rates on a route

GET/api/v1/routes/{id}/rates

Access
Key optional. A key or token personalises the answer.
Rate limit
100 requests per second (the default)

Public for public routes. Buyers see cleaned destination names and no upstream operator labels.

Parameters

NameInTypeDescription
idrequiredpathstring-
searchquerystring-
limitqueryinteger-
offsetqueryinteger-

Response 200

FieldTypeDescription
ratesrequiredobject[]-
idrequiredrates[].idstring (uuid)-
routeIdrequiredrates[].routeIdstring (uuid)-
destinationNamerequiredrates[].destinationNamestring-
operatorrequiredrates[].operatorstring | null-
prefixrequiredrates[].prefixstring-
ratePerUnitrequiredrates[].ratePerUnitmoneyUSD as a decimal string with exactly 6 places, e.g. "0.012500".
billingIncrementrequiredrates[].billingIncrementstring | null-
minDurationrequiredrates[].minDurationinteger | null-
effectiveDaterequiredrates[].effectiveDatestring (date-time) | nullISO-8601 timestamp (UTC)
statusrequiredrates[].statusstring-
mccMncrates[].mccMncstring | nullSMS sheets priced by network code: the network the row price came from ("214" = whole country)
operatorRatesrates[].operatorRatesobject[] | nullSMS sheets priced by network: the price per destination network (charged per network when networkPriced is true). A message is charged its network's rate (networks not listed pay the All Operators rate when there is one); ratePerUnit is the price for other or unknown networks. The network is determined from the number's range (ported numbers may be priced at the network the range belongs to)
mccMncrequiredrates[].operatorRates[].mccMncstring"214-07" for one network; "214" for All Operators
operatorrequiredrates[].operatorRates[].operatorstring | null-
raterequiredrates[].operatorRates[].ratemoneyUSD as a decimal string with exactly 6 places, e.g. "0.012500".
networkPricedrates[].networkPricedbooleanTrue when each SMS on this row is charged its destination network's rate from operatorRates; ratePerUnit then applies to other or unknown networks
totalrequiredinteger-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Add a rate to your route's deck

POST/api/v1/routes/{id}/rates

Access
API key. Scoped keys need routes:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (application/json)

FieldTypeDescription
destinationNamerequiredstring-max 255 chars
operatorstring | null-max 120 chars
prefixrequiredstring-max 24 chars
ratePerUnitrequiredstring-
billingIncrementstring-max 10 chars
minDurationinteger-min 0

Response 201

FieldTypeDescription
datarequiredobject-
idrequireddata.idstring (uuid)-
routeIdrequireddata.routeIdstring (uuid)-
destinationNamerequireddata.destinationNamestring-
operatorrequireddata.operatorstring | null-
prefixrequireddata.prefixstring-
ratePerUnitrequireddata.ratePerUnitmoneyUSD as a decimal string with exactly 6 places, e.g. "0.012500".
billingIncrementrequireddata.billingIncrementstring | null-
minDurationrequireddata.minDurationinteger | null-
effectiveDaterequireddata.effectiveDatestring (date-time) | nullISO-8601 timestamp (UTC)
statusrequireddata.statusstring-
mccMncdata.mccMncstring | nullSMS sheets priced by network code: the network the row price came from ("214" = whole country)
operatorRatesdata.operatorRatesobject[] | nullSMS sheets priced by network: the price per destination network (charged per network when networkPriced is true). A message is charged its network's rate (networks not listed pay the All Operators rate when there is one); ratePerUnit is the price for other or unknown networks. The network is determined from the number's range (ported numbers may be priced at the network the range belongs to)
mccMncrequireddata.operatorRates[].mccMncstring"214-07" for one network; "214" for All Operators
operatorrequireddata.operatorRates[].operatorstring | null-
raterequireddata.operatorRates[].ratemoneyUSD as a decimal string with exactly 6 places, e.g. "0.012500".
networkPriceddata.networkPricedbooleanTrue when each SMS on this row is charged its destination network's rate from operatorRates; ratePerUnit then applies to other or unknown networks
updatedrequireddata.updatedboolean-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Export a route's rates as CSV

GET/api/v1/routes/{id}/rates/export

Access
Key optional. A key or token personalises the answer.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-

Response 200 (text/csv)

The deck as CSV (attachment).

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Add many rates to your route's deck

POST/api/v1/routes/{id}/rates/bulk

Access
API key. Scoped keys need routes:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (application/json)

FieldTypeDescription
rowsrequiredobject[]-
destinationNamerows[].destinationNamestring-max 255 chars
operatorrows[].operatorstring | null-max 120 chars
prefixrequiredrows[].prefixstring-max 24 chars
ratePerUnitrequiredrows[].ratePerUnitstring-max 32 chars
billingIncrementrows[].billingIncrementstring-max 10 chars
minDurationrows[].minDurationinteger-min 0

Response 201

FieldTypeDescription
datarequiredobject-
addedrequireddata.addedinteger-
updatedrequireddata.updatedinteger-
skippedrequireddata.skippedinteger-
skippedRowsrequireddata.skippedRowsobject[]-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Edit or block one rate in your deck

PATCH/api/v1/routes/{id}/rates/{rateId}

Access
API key. Scoped keys need routes:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
rateIdrequiredpathstring-

Request body (application/json)

FieldTypeDescription
destinationNamestring-max 255 chars
ratePerUnitstring-
billingIncrementstring | null-max 10 chars
minDurationinteger | null-min 0
blockedboolean-

Response 200

FieldTypeDescription
datarequiredobjectSame fields as RouteRate, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Delete one rate from your deck

DELETE/api/v1/routes/{id}/rates/{rateId}

Access
API key. Scoped keys need routes:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
rateIdrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject-
messagerequireddata.messagestring-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List scheduled rate changes on your route

GET/api/v1/routes/{id}/rate-changes

Access
API key. Scoped keys need routes:read.
Rate limit
100 requests per second (the default)

With how many buyers are held by each change and how many already accepted it.

Parameters

NameInTypeDescription
idrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject[]-
idrequireddata[].idstring (uuid)-
kindrequireddata[].kindstring-
statusrequireddata[].statusstring-
effectiveDaterequireddata[].effectiveDatestring (date-time)ISO-8601 timestamp (UTC)
increasesrequireddata[].increasesinteger-
decreasesrequireddata[].decreasesinteger-
addedrequireddata[].addedinteger-
removedrequireddata[].removedinteger-
largestIncreasePctrequireddata[].largestIncreasePctnumber | null-
sampleOldRaterequireddata[].sampleOldRatemoney | nullUS 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".
sampleNewRaterequireddata[].sampleNewRatemoney | nullUS 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".
flatOldPricerequireddata[].flatOldPricemoney | nullUS 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".
flatNewPricerequireddata[].flatNewPricemoney | nullUS 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".
createdAtrequireddata[].createdAtstring (date-time)ISO-8601 timestamp (UTC)
notifiedAtrequireddata[].notifiedAtstring (date-time) | nullISO-8601 timestamp (UTC)
promotedAtrequireddata[].promotedAtstring (date-time) | nullISO-8601 timestamp (UTC)
cancelledAtrequireddata[].cancelledAtstring (date-time) | nullISO-8601 timestamp (UTC)
heldPurchasesrequireddata[].heldPurchasesinteger | null-
acceptedPurchasesrequireddata[].acceptedPurchasesinteger-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Schedule a price change on a one-price route

POST/api/v1/routes/{id}/rate-changes/flat

Access
API key. Scoped keys need routes:write.
Rate limit
100 requests per second (the default)

An increase takes effect after the notice period when list-rate buyers are bound; buyers are notified and can accept in advance. Replaces any change already scheduled.

Parameters

NameInTypeDescription
idrequiredpathstring-

Request body (application/json)

FieldTypeDescription
newPricerequiredstring-
effectiveDatestring (date-time) | nullOmit for the default notice period

Response 201

FieldTypeDescription
datarequiredobject-
scheduledrequireddata.scheduledbooleanFalse when the change applied immediately
changeIdrequireddata.changeIdstring (uuid)-
effectiveDaterequireddata.effectiveDatestring (date-time)ISO-8601 timestamp (UTC)
boundBuyersrequireddata.boundBuyersinteger-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Withdraw a scheduled rate change

POST/api/v1/routes/{id}/rate-changes/{changeId}/cancel

Access
API key. Scoped keys need routes:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-
changeIdrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject-
cancelledrequireddata.cancelledboolean-One of true

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.