Fax numbers API reference

Updated

15 operations of the Fax for Agents API, from the OpenAPI document version 1.20.0, snapshot of 2026-11-13. The base URL is https://api.faxforagents.com/v1. This is one group of the full reference.

  • A number order answers 201 with the created order even when the carrier refuses the purchase.
  • Releasing a number is confirmed with the number itself, and a 30-day quarantine follows.
  • A sender verification covers only a number your organization owns.

Operations

How do I find and order a number?

Three calls. GET /v1/coverage says where faxes can be sent and where numbers are hosted. GET /v1/number-inventory lists fax-capable numbers for sale. It filters by country, locality and type. POST /v1/number-orders buys one, with the number in e164 exactly as the inventory returned it.

The order can carry a label, a project_id under which inbound faxes are filed, and an inbound_webhook_id. That last field names the webhook that receives fax.received for this number. Without it every webhook of the organization does.

Why does a refused order answer 201?

The OpenAPI document says it in the description of the operation. The call returns 201 with the created order, including when the carrier refuses the purchase. A refused order has status failed and an error with the carrier's reason. Its first-month hold is released and nothing is charged.

So read status on the answer before you use the number. The first month is held when the order is made and charged on activation. An unconfirmed carrier response leaves the order pending while the outcome is checked. Reusing the same Idempotency-Key returns the same body without another purchase, so a retry after a timeout cannot buy twice.

What can I change on a number I own?

GET /v1/numbers lists your numbers, and include_released adds the ones you gave back. PATCH /v1/numbers/{number_id} changes the label, the project and the inbound route. A number shows its monthly price in monthly_micro, when it renews in renews_at and whether inbound is working in inbound_status.

How is a number released?

POST /v1/numbers/{number_id}/release-requests gives a number back. The body has one field, confirm, and it takes the number itself, typed out. A 30-day quarantine follows the release. The step is deliberate: a released number stops receiving, and a fax sent to it afterwards does not reach you.

How does porting work?

POST /v1/portability-checks takes a list of numbers and says which can port in. POST /v1/port-orders requests a port-in. The summary says "handled with you": a person on our side works through the port with you, and the order shows its milestones as it moves. GET /v1/port-orders lists port orders and port-out requests, and one can be read by id.

POST /v1/port-out-requests notes that one of your numbers is leaving to another carrier.

What is a sender verification?

POST /v1/sender-verifications verifies one of your numbers as a sender. It takes from, a number your organization owns, and answers with the verification, its method and its status. A number of another organization is refused. A quote in the quotes group names one of your numbers in from. Without it the fax goes out from the shared pool.

Which scopes do number calls need?

Reads need number:read: coverage, inventory, orders, numbers, port orders and the portability check. Everything that buys, changes, releases or ports needs number:buy. The default API key does not carry number:buy. Choose it when you create the key, or the order answers 403. Several calls here answer 503 while the carrier is not available.

Each operation in detail

GET /v1/coverage

Where we send and where we host numbers

Credential: an API key or a signed-in session. Scope: number:read.

Responses

GET /v1/coverage responses
StatusMeaning
200Successful Response
401No credential, or one that was not accepted: invalid_token for an API key, unauthenticated where a signed-in session is needed. error.details.reason says why a key was refused.
403The credential is valid and is not allowed to do this. scope_missing puts the scope in error.details.scope. Other codes are agent_forbidden and approval_required. A session can also meet csrf_invalid and reauth_required.
429rate_limited. Retry-After and the RateLimit-* headers say when to try again.

Response fields

GET /v1/coverage response fields
FieldTypeRequiredDescription
coverage_versionstring or nullyes
excludedobjectyes
generated_atstring or nullyes
inboundobjectyes
notestring or nullyes
orderable_nowarray of stringyes
outboundobjectyes

Example

curl https://api.faxforagents.com/v1/coverage \
  -H "Authorization: Bearer ffa_test_..."

GET /v1/number-inventory

Fax-capable numbers for sale

Credential: an API key or a signed-in session. Scope: number:read.

Parameters

GET /v1/number-inventory parameters
NameInTypeRequiredNotes
countryquerystringno Default "US".
localityquerystring or nullno
typequerystring (local, toll_free)no Default "local".
limitqueryintegerno Default 10.

Responses

GET /v1/number-inventory responses
StatusMeaning
200Successful Response
401No credential, or one that was not accepted: invalid_token for an API key, unauthenticated where a signed-in session is needed. error.details.reason says why a key was refused.
403The credential is valid and is not allowed to do this. scope_missing puts the scope in error.details.scope. Other codes are agent_forbidden and approval_required. A session can also meet csrf_invalid and reauth_required.
409The resource is in a state that refuses the call, or the Idempotency-Key was used with a different request (idempotency_key_conflict). error.code names the state.
422A field failed validation: invalid_request, with one entry per field in error.details, or a code that names the rule.
429rate_limited. Retry-After and the RateLimit-* headers say when to try again.
503Something this call depends on is not available or not set up here, for example billing_unavailable or provider_unavailable. error.retryable says whether to send the same call again.

Response fields

GET /v1/number-inventory response fields
FieldTypeRequiredDescription
countrystringyes
itemsarray of object InventoryNumberyes
localitystring or nullyes
notestringyes
number_typestringyes
recurring_periodstringyes

Example

curl https://api.faxforagents.com/v1/number-inventory \
  -H "Authorization: Bearer ffa_test_..."

GET /v1/number-orders

List your number orders

Credential: an API key or a signed-in session. Scope: number:read.

Responses

GET /v1/number-orders responses
StatusMeaning
200Successful Response
401No credential, or one that was not accepted: invalid_token for an API key, unauthenticated where a signed-in session is needed. error.details.reason says why a key was refused.
403The credential is valid and is not allowed to do this. scope_missing puts the scope in error.details.scope. Other codes are agent_forbidden and approval_required. A session can also meet csrf_invalid and reauth_required.
429rate_limited. Retry-After and the RateLimit-* headers say when to try again.

Response fields

GET /v1/number-orders response fields
FieldTypeRequiredDescription
itemsarray of object NumberOrderyes

Example

curl https://api.faxforagents.com/v1/number-orders \
  -H "Authorization: Bearer ffa_test_..."

POST /v1/number-orders

Buy a number (the first month is held now, charged on activation)

Returns 201 with the created order, including when the carrier refuses the purchase. A refused order has status failed and an error describing the carrier's reason. Its first-month hold is released and nothing is charged. Reusing the same Idempotency-Key returns the same response body without another purchase. An unconfirmed carrier response leaves the order pending for reconciliation.

Credential: an API key or a signed-in session. Scope: number:buy.

Parameters

POST /v1/number-orders parameters
NameInTypeRequiredNotes
Idempotency-KeyheaderstringnoReplay the first successful response for the same request within 24 hours. Reusing the idempotency header with a different request returns 409 idempotency_key_conflict. Responses include Idempotent-Replayed: true on replay.

Request body application/json, required

POST /v1/number-orders request body
FieldTypeRequiredDescription
e164stringyesA number from GET /v1/number-inventory, E.164.
inbound_webhook_idstring or nullnoThe webhook that receives fax.received for this number (default: all).
labelstring or nullno
project_idstring or nullnoInbound faxes are filed under this project.

Responses

POST /v1/number-orders responses
StatusMeaning
201Successful Response
401No credential, or one that was not accepted: invalid_token for an API key, unauthenticated where a signed-in session is needed. error.details.reason says why a key was refused.
402The prepaid balance does not cover the call: insufficient_balance.
403The credential is valid and is not allowed to do this. scope_missing puts the scope in error.details.scope. Other codes are agent_forbidden and approval_required. A session can also meet csrf_invalid and reauth_required.
404not_found: no such resource for this credential. A resource of another organization answers the same.
409The resource is in a state that refuses the call, or the Idempotency-Key was used with a different request (idempotency_key_conflict). error.code names the state.
422A field failed validation: invalid_request, with one entry per field in error.details, or a code that names the rule.
429rate_limited. Retry-After and the RateLimit-* headers say when to try again.

Response fields

POST /v1/number-orders response fields
FieldTypeRequiredDescription
completed_atstring or nullyes
countrystring or nullyes
created_atstringyes
currencystringyes
e164string or nullyes
environmentstring (live, test)yes
errorstring or nullyes
first_month_hold_microintegeryesHeld now, captured when the number activates.
idstringyes
numberobject Number or nullyes
number_idstring or nullyes
number_typestring or nullyes
providerstringyes
recurring_charge_microintegeryesCharged every month on the activation day.
recurring_periodstringyes
statusstringyes

Example

curl https://api.faxforagents.com/v1/number-orders \
  -X POST \
  -H "Authorization: Bearer ffa_test_..." \
  -H "Content-Type: application/json" \
  -d '{"e164":"+15550001001"}'

GET /v1/number-orders/{order_id}

Read a number order

Credential: an API key or a signed-in session. Scope: number:read.

Parameters

GET /v1/number-orders/{order_id} parameters
NameInTypeRequiredNotes
order_idpathstringyes

Responses

GET /v1/number-orders/{order_id} responses
StatusMeaning
200Successful Response
401No credential, or one that was not accepted: invalid_token for an API key, unauthenticated where a signed-in session is needed. error.details.reason says why a key was refused.
403The credential is valid and is not allowed to do this. scope_missing puts the scope in error.details.scope. Other codes are agent_forbidden and approval_required. A session can also meet csrf_invalid and reauth_required.
404not_found: no such resource for this credential. A resource of another organization answers the same.
422A field failed validation: invalid_request, with one entry per field in error.details, or a code that names the rule.
429rate_limited. Retry-After and the RateLimit-* headers say when to try again.

Response fields

GET /v1/number-orders/{order_id} response fields
FieldTypeRequiredDescription
completed_atstring or nullyes
countrystring or nullyes
created_atstringyes
currencystringyes
e164string or nullyes
environmentstring (live, test)yes
errorstring or nullyes
first_month_hold_microintegeryesHeld now, captured when the number activates.
idstringyes
numberobject Number or nullyes
number_idstring or nullyes
number_typestring or nullyes
providerstringyes
recurring_charge_microintegeryesCharged every month on the activation day.
recurring_periodstringyes
statusstringyes

Example

curl https://api.faxforagents.com/v1/number-orders/ORDER_ID \
  -H "Authorization: Bearer ffa_test_..."

GET /v1/numbers

Your numbers

Credential: an API key or a signed-in session. Scope: number:read.

Parameters

GET /v1/numbers parameters
NameInTypeRequiredNotes
include_releasedquerybooleanno Default false.

Responses

GET /v1/numbers responses
StatusMeaning
200Successful Response
401No credential, or one that was not accepted: invalid_token for an API key, unauthenticated where a signed-in session is needed. error.details.reason says why a key was refused.
403The credential is valid and is not allowed to do this. scope_missing puts the scope in error.details.scope. Other codes are agent_forbidden and approval_required. A session can also meet csrf_invalid and reauth_required.
422A field failed validation: invalid_request, with one entry per field in error.details, or a code that names the rule.
429rate_limited. Retry-After and the RateLimit-* headers say when to try again.

Response fields

GET /v1/numbers response fields
FieldTypeRequiredDescription
itemsarray of object Numberyes

Example

curl https://api.faxforagents.com/v1/numbers \
  -H "Authorization: Bearer ffa_test_..."

GET /v1/numbers/{number_id}

One number

Credential: an API key or a signed-in session. Scope: number:read.

Parameters

GET /v1/numbers/{number_id} parameters
NameInTypeRequiredNotes
number_idpathstringyes

Responses

GET /v1/numbers/{number_id} responses
StatusMeaning
200Successful Response
401No credential, or one that was not accepted: invalid_token for an API key, unauthenticated where a signed-in session is needed. error.details.reason says why a key was refused.
403The credential is valid and is not allowed to do this. scope_missing puts the scope in error.details.scope. Other codes are agent_forbidden and approval_required. A session can also meet csrf_invalid and reauth_required.
404not_found: no such resource for this credential. A resource of another organization answers the same.
422A field failed validation: invalid_request, with one entry per field in error.details, or a code that names the rule.
429rate_limited. Retry-After and the RateLimit-* headers say when to try again.

Response fields

GET /v1/numbers/{number_id} response fields
FieldTypeRequiredDescription
activated_atstring or nullyes
countrystringyes
created_atstringyes
currencystringyes
e164stringyes
email_pdfbooleannoWhen true, the notice mail of a fax received on this number carries the PDF as an attachment. Live numbers only. Off by default.
environmentstring (live, test)yes
idstringyes
inbound_statusstringyes
inbound_webhook_idstring or nullyes
labelstring or nullyes
localitystring or nullyes
monthly_microintegeryes
number_typestringyes
order_idstring or nullyes
project_idstring or nullyes
providerstringyes
released_atstring or nullyes
renews_atstring or nullyes
statusstringyes

Example

curl https://api.faxforagents.com/v1/numbers/NUMBER_ID \
  -H "Authorization: Bearer ffa_test_..."

PATCH /v1/numbers/{number_id}

Label, inbound route and PDF by mail of a number

Credential: an API key or a signed-in session. Scope: number:buy.

Parameters

PATCH /v1/numbers/{number_id} parameters
NameInTypeRequiredNotes
number_idpathstringyes
Idempotency-KeyheaderstringnoReplay the first successful response for the same request within 24 hours. Reusing the idempotency header with a different request returns 409 idempotency_key_conflict. Responses include Idempotent-Replayed: true on replay.

Request body application/json, required

PATCH /v1/numbers/{number_id} request body
FieldTypeRequiredDescription
email_pdfboolean or nullnoAttach the PDF of each received fax to the notice mail. The mail goes to the verified address of an owner of the organization and to no other address. A PDF over 15 MB is not attached. It needs the scope number:buy. An agent, an OAuth connection and a connected app are refused.
inbound_webhook_idstring or nullno
labelstring or nullno
project_idstring or nullno

Responses

PATCH /v1/numbers/{number_id} responses
StatusMeaning
200Successful Response
401No credential, or one that was not accepted: invalid_token for an API key, unauthenticated where a signed-in session is needed. error.details.reason says why a key was refused.
403The credential is valid and is not allowed to do this. scope_missing puts the scope in error.details.scope. Other codes are agent_forbidden and approval_required. A session can also meet csrf_invalid and reauth_required.
404not_found: no such resource for this credential. A resource of another organization answers the same.
409The resource is in a state that refuses the call, or the Idempotency-Key was used with a different request (idempotency_key_conflict). error.code names the state.
422A field failed validation: invalid_request, with one entry per field in error.details, or a code that names the rule.
429rate_limited. Retry-After and the RateLimit-* headers say when to try again.

Response fields

PATCH /v1/numbers/{number_id} response fields
FieldTypeRequiredDescription
activated_atstring or nullyes
countrystringyes
created_atstringyes
currencystringyes
e164stringyes
email_pdfbooleannoWhen true, the notice mail of a fax received on this number carries the PDF as an attachment. Live numbers only. Off by default.
environmentstring (live, test)yes
idstringyes
inbound_statusstringyes
inbound_webhook_idstring or nullyes
labelstring or nullyes
localitystring or nullyes
monthly_microintegeryes
number_typestringyes
order_idstring or nullyes
project_idstring or nullyes
providerstringyes
released_atstring or nullyes
renews_atstring or nullyes
statusstringyes

Example

curl https://api.faxforagents.com/v1/numbers/NUMBER_ID \
  -X PATCH \
  -H "Authorization: Bearer ffa_test_..." \
  -H "Content-Type: application/json" \
  -d '{}'

POST /v1/numbers/{number_id}/release-requests

Release a number (confirm with the number itself; 30-day quarantine follows)

Credential: an API key or a signed-in session. Scope: number:buy.

Parameters

POST /v1/numbers/{number_id}/release-requests parameters
NameInTypeRequiredNotes
number_idpathstringyes
Idempotency-KeyheaderstringnoReplay the first successful response for the same request within 24 hours. Reusing the idempotency header with a different request returns 409 idempotency_key_conflict. Responses include Idempotent-Replayed: true on replay.

Request body application/json, required

POST /v1/numbers/{number_id}/release-requests request body
FieldTypeRequiredDescription
confirmstring or nullnoThe number itself, typed out, to confirm.

Responses

POST /v1/numbers/{number_id}/release-requests responses
StatusMeaning
200Successful Response
401No credential, or one that was not accepted: invalid_token for an API key, unauthenticated where a signed-in session is needed. error.details.reason says why a key was refused.
403The credential is valid and is not allowed to do this. scope_missing puts the scope in error.details.scope. Other codes are agent_forbidden and approval_required. A session can also meet csrf_invalid and reauth_required.
404not_found: no such resource for this credential. A resource of another organization answers the same.
409The resource is in a state that refuses the call, or the Idempotency-Key was used with a different request (idempotency_key_conflict). error.code names the state.
422A field failed validation: invalid_request, with one entry per field in error.details, or a code that names the rule.
429rate_limited. Retry-After and the RateLimit-* headers say when to try again.
503Something this call depends on is not available or not set up here, for example billing_unavailable or provider_unavailable. error.retryable says whether to send the same call again.

Response fields

POST /v1/numbers/{number_id}/release-requests response fields
FieldTypeRequiredDescription
activated_atstring or nullyes
countrystringyes
created_atstringyes
currencystringyes
e164stringyes
email_pdfbooleannoWhen true, the notice mail of a fax received on this number carries the PDF as an attachment. Live numbers only. Off by default.
environmentstring (live, test)yes
idstringyes
inbound_statusstringyes
inbound_webhook_idstring or nullyes
labelstring or nullyes
localitystring or nullyes
monthly_microintegeryes
number_typestringyes
order_idstring or nullyes
project_idstring or nullyes
providerstringyes
released_atstring or nullyes
renews_atstring or nullyes
statusstringyes

Example

curl https://api.faxforagents.com/v1/numbers/NUMBER_ID/release-requests \
  -X POST \
  -H "Authorization: Bearer ffa_test_..." \
  -H "Content-Type: application/json" \
  -d '{}'

GET /v1/port-orders

Port orders and port-out requests

Credential: an API key or a signed-in session. Scope: number:read.

Responses

GET /v1/port-orders responses
StatusMeaning
200Successful Response
401No credential, or one that was not accepted: invalid_token for an API key, unauthenticated where a signed-in session is needed. error.details.reason says why a key was refused.
403The credential is valid and is not allowed to do this. scope_missing puts the scope in error.details.scope. Other codes are agent_forbidden and approval_required. A session can also meet csrf_invalid and reauth_required.
429rate_limited. Retry-After and the RateLimit-* headers say when to try again.

Response fields

GET /v1/port-orders response fields
FieldTypeRequiredDescription
itemsarray of object PortOrderyes

Example

curl https://api.faxforagents.com/v1/port-orders \
  -H "Authorization: Bearer ffa_test_..."

POST /v1/port-orders

Request a port-in (handled with you)

Credential: an API key or a signed-in session. Scope: number:buy.

Parameters

POST /v1/port-orders parameters
NameInTypeRequiredNotes
Idempotency-KeyheaderstringnoReplay the first successful response for the same request within 24 hours. Reusing the idempotency header with a different request returns 409 idempotency_key_conflict. Responses include Idempotent-Replayed: true on replay.

Request body application/json, required

POST /v1/port-orders request body
FieldTypeRequiredDescription
notestring or nullno
numbersarray of stringyes

Responses

POST /v1/port-orders responses
StatusMeaning
201Successful Response
401No credential, or one that was not accepted: invalid_token for an API key, unauthenticated where a signed-in session is needed. error.details.reason says why a key was refused.
403The credential is valid and is not allowed to do this. scope_missing puts the scope in error.details.scope. Other codes are agent_forbidden and approval_required. A session can also meet csrf_invalid and reauth_required.
404not_found: no such resource for this credential. A resource of another organization answers the same.
409The resource is in a state that refuses the call, or the Idempotency-Key was used with a different request (idempotency_key_conflict). error.code names the state.
422A field failed validation: invalid_request, with one entry per field in error.details, or a code that names the rule.
429rate_limited. Retry-After and the RateLimit-* headers say when to try again.
503Something this call depends on is not available or not set up here, for example billing_unavailable or provider_unavailable. error.retryable says whether to send the same call again.

Response fields

POST /v1/port-orders response fields
FieldTypeRequiredDescription
created_atstringyes
directionstringyes
environmentstring (live, test)yes
idstringyes
milestonesarray of objectyes
numbersarray of stringyes
providerstringyes
requestobjectyes
statusstringyes
updated_atstringyes

Example

curl https://api.faxforagents.com/v1/port-orders \
  -X POST \
  -H "Authorization: Bearer ffa_test_..." \
  -H "Content-Type: application/json" \
  -d '{"numbers":["+15550001001"]}'

GET /v1/port-orders/{port_id}

One port order

Credential: an API key or a signed-in session. Scope: number:read.

Parameters

GET /v1/port-orders/{port_id} parameters
NameInTypeRequiredNotes
port_idpathstringyes

Responses

GET /v1/port-orders/{port_id} responses
StatusMeaning
200Successful Response
401No credential, or one that was not accepted: invalid_token for an API key, unauthenticated where a signed-in session is needed. error.details.reason says why a key was refused.
403The credential is valid and is not allowed to do this. scope_missing puts the scope in error.details.scope. Other codes are agent_forbidden and approval_required. A session can also meet csrf_invalid and reauth_required.
404not_found: no such resource for this credential. A resource of another organization answers the same.
422A field failed validation: invalid_request, with one entry per field in error.details, or a code that names the rule.
429rate_limited. Retry-After and the RateLimit-* headers say when to try again.

Response fields

GET /v1/port-orders/{port_id} response fields
FieldTypeRequiredDescription
created_atstringyes
directionstringyes
environmentstring (live, test)yes
idstringyes
milestonesarray of objectyes
numbersarray of stringyes
providerstringyes
requestobjectyes
statusstringyes
updated_atstringyes

Example

curl https://api.faxforagents.com/v1/port-orders/PORT_ID \
  -H "Authorization: Bearer ffa_test_..."

POST /v1/port-out-requests

Note a port-out of one of your numbers

Credential: an API key or a signed-in session. Scope: number:buy.

Parameters

POST /v1/port-out-requests parameters
NameInTypeRequiredNotes
Idempotency-KeyheaderstringnoReplay the first successful response for the same request within 24 hours. Reusing the idempotency header with a different request returns 409 idempotency_key_conflict. Responses include Idempotent-Replayed: true on replay.

Request body application/json, required

POST /v1/port-out-requests request body
FieldTypeRequiredDescription
notestring or nullno
number_idstringyes

Responses

POST /v1/port-out-requests responses
StatusMeaning
201Successful Response
401No credential, or one that was not accepted: invalid_token for an API key, unauthenticated where a signed-in session is needed. error.details.reason says why a key was refused.
403The credential is valid and is not allowed to do this. scope_missing puts the scope in error.details.scope. Other codes are agent_forbidden and approval_required. A session can also meet csrf_invalid and reauth_required.
404not_found: no such resource for this credential. A resource of another organization answers the same.
409The resource is in a state that refuses the call, or the Idempotency-Key was used with a different request (idempotency_key_conflict). error.code names the state.
422A field failed validation: invalid_request, with one entry per field in error.details, or a code that names the rule.
429rate_limited. Retry-After and the RateLimit-* headers say when to try again.
503Something this call depends on is not available or not set up here, for example billing_unavailable or provider_unavailable. error.retryable says whether to send the same call again.

Response fields

POST /v1/port-out-requests response fields
FieldTypeRequiredDescription
created_atstringyes
directionstringyes
environmentstring (live, test)yes
idstringyes
milestonesarray of objectyes
numbersarray of stringyes
providerstringyes
requestobjectyes
statusstringyes
updated_atstringyes

Example

curl https://api.faxforagents.com/v1/port-out-requests \
  -X POST \
  -H "Authorization: Bearer ffa_test_..." \
  -H "Content-Type: application/json" \
  -d '{"number_id":"number_example"}'

POST /v1/portability-checks

Can these numbers port in

Credential: an API key or a signed-in session. Scope: number:read.

Parameters

POST /v1/portability-checks parameters
NameInTypeRequiredNotes
Idempotency-KeyheaderstringnoReplay the first successful response for the same request within 24 hours. Reusing the idempotency header with a different request returns 409 idempotency_key_conflict. Responses include Idempotent-Replayed: true on replay.

Request body application/json, required

POST /v1/portability-checks request body
FieldTypeRequiredDescription
numbersarray of stringyes

Responses

POST /v1/portability-checks responses
StatusMeaning
201Successful Response
401No credential, or one that was not accepted: invalid_token for an API key, unauthenticated where a signed-in session is needed. error.details.reason says why a key was refused.
403The credential is valid and is not allowed to do this. scope_missing puts the scope in error.details.scope. Other codes are agent_forbidden and approval_required. A session can also meet csrf_invalid and reauth_required.
409The resource is in a state that refuses the call, or the Idempotency-Key was used with a different request (idempotency_key_conflict). error.code names the state.
422A field failed validation: invalid_request, with one entry per field in error.details, or a code that names the rule.
429rate_limited. Retry-After and the RateLimit-* headers say when to try again.
503Something this call depends on is not available or not set up here, for example billing_unavailable or provider_unavailable. error.retryable says whether to send the same call again.

Response fields

POST /v1/portability-checks response fields
FieldTypeRequiredDescription
checked_atstringyes
itemsarray of objectyes

Example

curl https://api.faxforagents.com/v1/portability-checks \
  -X POST \
  -H "Authorization: Bearer ffa_test_..." \
  -H "Content-Type: application/json" \
  -d '{"numbers":["+15550001001"]}'

POST /v1/sender-verifications

Verify a number of yours as a sender (only numbers you own)

Credential: an API key or a signed-in session. Scope: number:buy.

Parameters

POST /v1/sender-verifications parameters
NameInTypeRequiredNotes
Idempotency-KeyheaderstringnoReplay the first successful response for the same request within 24 hours. Reusing the idempotency header with a different request returns 409 idempotency_key_conflict. Responses include Idempotent-Replayed: true on replay.

Request body application/json, required

POST /v1/sender-verifications request body
FieldTypeRequiredDescription
fromstringyesA number your organization owns, E.164.

Responses

POST /v1/sender-verifications responses
StatusMeaning
201Successful Response
401No credential, or one that was not accepted: invalid_token for an API key, unauthenticated where a signed-in session is needed. error.details.reason says why a key was refused.
403The credential is valid and is not allowed to do this. scope_missing puts the scope in error.details.scope. Other codes are agent_forbidden and approval_required. A session can also meet csrf_invalid and reauth_required.
409The resource is in a state that refuses the call, or the Idempotency-Key was used with a different request (idempotency_key_conflict). error.code names the state.
422A field failed validation: invalid_request, with one entry per field in error.details, or a code that names the rule.
429rate_limited. Retry-After and the RateLimit-* headers say when to try again.

Response fields

POST /v1/sender-verifications response fields
FieldTypeRequiredDescription
created_atstringyes
environmentstring (live, test)yes
fromstringyes
idstringyes
methodstringyes
number_idstring or nullyes
statusstringyes
verified_atstring or nullyes

Example

curl https://api.faxforagents.com/v1/sender-verifications \
  -X POST \
  -H "Authorization: Bearer ffa_test_..." \
  -H "Content-Type: application/json" \
  -d '{"from":"+15550001001"}'