Start free

API reference

WhatsApp numbers

List your organization's WhatsApp numbers, check each one's status, quality and messaging tier straight from Meta, and track send volume over time.

  • 5 operations
  • Base URLhttps://api.messages.ccxcompany.co
  • AuthenticationBearer with your API key

The technical text below comes from the public contract, openapi.json, in the language the contract was written in.

List WABA numbers in the current organization

GET/numbers

Returns a paginated list. Filters: status, qualityRating, limit, skip. Sorted by createdAt desc.

Parameters

FieldInTypeDescription
statusoptionalquerystringValues:availableconnecteddisconnectedflaggedpending
qualityRatingoptionalquerystringValues:greenyellowredunknown
limitoptionalqueryinteger
skipoptionalqueryinteger

Responses

  • 200Default Response

    Response fields and example
    FieldTypeDescription
    itemsrequiredobject[]
    items[].idrequiredstringBranded Number id (num_ prefix + 21 nano-id chars).
    items[].organizationIdrequiredstringBranded Organization id (org_ prefix + 21 nano-id chars).
    items[].phoneNumberIdrequiredstringMeta phone_number_id from the WABA Graph API.
    items[].wabaIdrequiredstringMeta WhatsApp Business Account id.
    items[].displayPhonerequiredstringE.164 phone number — PII_SENSITIVE, masked in cross-tenant responses.
    items[].statusrequiredstringValues:availableconnecteddisconnectedflaggedpending
    items[].qualityRatingrequiredstringValues:greenyellowredunknown
    items[].messagingTierrequiredstringValues:tier_250tier_1ktier_2ktier_10ktier_100kunlimited
    items[].rateLimitrequiredobject
    items[].rateLimit.perSecondrequiredinteger
    items[].rateLimit.perDayrequiredinteger
    items[].metarequiredobject
    items[].meta.verifiedNameoptionalstringDisplay name registered with WhatsApp Business.
    items[].meta.byooptionalbooleanTrue when the number runs under the customer's own WABA.
    items[].meta.nameStatusoptionalstringSituação do nome de exibição na Meta. Ausente ⇒ desconhecido (número sem sync). Não deduza aprovação da presença de verifiedName: a Meta devolve o nome mesmo quando o recusa.Values:approvedpendingrejectedexpirednone
    items[].meta.partnerRemovedAtoptionalstring | null · date-timeWhen Meta reported (account_update PARTNER_REMOVED or PARTNER_APP_UNINSTALLED) that the customer removed CCX from this number's account. Only a mark: status and history are untouched, but sending through this number is expected to fail. null/absent = no such report pending.
    items[].meta.partnerRemovedReasonoptionalstring | nullWhich Meta event set partnerRemovedAt; set and cleared together with it: - PARTNER_REMOVED — the customer stopped sharing the account with CCX. - PARTNER_APP_UNINSTALLED — the customer uninstalled the CCX app (or removed its permissions), which revokes the token CCX sends with.Values:PARTNER_REMOVEDPARTNER_APP_UNINSTALLED
    items[].profileoptionalobject
    items[].profile.aboutoptionalstring
    items[].profile.addressoptionalstring
    items[].profile.emailoptionalstring
    items[].profile.websiteoptionalstring
    items[].profile.verticaloptionalstring
    items[].profile.profilePictureUrloptionalstring
    items[].lastMetaSyncAtoptionalstring | null · date-time
    items[].createdAtrequiredstring · date-timeISO-8601 timestamp in UTC.
    items[].updatedAtrequiredstring · date-timeISO-8601 timestamp in UTC.
    totalrequiredinteger
    JSON
    {  "items": [    {      "id": "num_aB3xY9zQ1pTkLmNoPqRsT",      "organizationId": "org_pGgniw5L7CTDSZDwjDrQ2",      "phoneNumberId": "1234567890123456",      "wabaId": "9876543210987654",      "displayPhone": "+5511999998888",      "status": "connected",      "qualityRating": "green",      "messagingTier": "tier_1k",      "rateLimit": {        "perSecond": 80,        "perDay": 100000      },      "meta": {        "verifiedName": "Acme Sales",        "byo": false,        "nameStatus": "rejected",        "partnerRemovedAt": "2026-10-16T12:00:00.000Z",        "partnerRemovedReason": "PARTNER_REMOVED"      },      "profile": {        "about": "string",        "address": "string",        "email": "string",        "website": "string",        "vertical": "string",        "profilePictureUrl": "string"      },      "lastMetaSyncAt": "2026-10-16T12:00:00.000Z",      "createdAt": "2026-04-07T17:30:00.000Z",      "updatedAt": "2026-04-07T17:30:00.000Z"    }  ],  "total": 3}
  • 401RFC 7807 problem details for UNAUTHORIZED (401).

  • 403RFC 7807 problem details for FORBIDDEN (403).

Error responses follow RFC 7807 (application/problem+json), with a stable code in the code field. See the error codes

curl example

cURL
curl 'https://api.messages.ccxcompany.co/numbers' \  -H "Authorization: Bearer $CCX_API_KEY"
Required fields only. Swap the sample values for your own.

Get a single WABA number

GET/numbers/{id}

Returns the full Number record for the given id. Tenant isolation is enforced by the Mongo Guardian filter — a request from another org receives 404, not the doc.

Parameters

FieldInTypeDescription
idrequiredpathstringBranded Number id (num_ prefix + 21 nano-id chars).

Responses

  • 200Default Response

    Response fields and example
    FieldTypeDescription
    idrequiredstringBranded Number id (num_ prefix + 21 nano-id chars).
    organizationIdrequiredstringBranded Organization id (org_ prefix + 21 nano-id chars).
    phoneNumberIdrequiredstringMeta phone_number_id from the WABA Graph API.
    wabaIdrequiredstringMeta WhatsApp Business Account id.
    displayPhonerequiredstringE.164 phone number — PII_SENSITIVE, masked in cross-tenant responses.
    statusrequiredstringValues:availableconnecteddisconnectedflaggedpending
    qualityRatingrequiredstringValues:greenyellowredunknown
    messagingTierrequiredstringValues:tier_250tier_1ktier_2ktier_10ktier_100kunlimited
    rateLimitrequiredobject
    rateLimit.perSecondrequiredinteger
    rateLimit.perDayrequiredinteger
    metarequiredobject
    meta.verifiedNameoptionalstringDisplay name registered with WhatsApp Business.
    meta.byooptionalbooleanTrue when the number runs under the customer's own WABA.
    meta.nameStatusoptionalstringSituação do nome de exibição na Meta. Ausente ⇒ desconhecido (número sem sync). Não deduza aprovação da presença de verifiedName: a Meta devolve o nome mesmo quando o recusa.Values:approvedpendingrejectedexpirednone
    meta.partnerRemovedAtoptionalstring | null · date-timeWhen Meta reported (account_update PARTNER_REMOVED or PARTNER_APP_UNINSTALLED) that the customer removed CCX from this number's account. Only a mark: status and history are untouched, but sending through this number is expected to fail. null/absent = no such report pending.
    meta.partnerRemovedReasonoptionalstring | nullWhich Meta event set partnerRemovedAt; set and cleared together with it: - PARTNER_REMOVED — the customer stopped sharing the account with CCX. - PARTNER_APP_UNINSTALLED — the customer uninstalled the CCX app (or removed its permissions), which revokes the token CCX sends with.Values:PARTNER_REMOVEDPARTNER_APP_UNINSTALLED
    profileoptionalobject
    profile.aboutoptionalstring
    profile.addressoptionalstring
    profile.emailoptionalstring
    profile.websiteoptionalstring
    profile.verticaloptionalstring
    profile.profilePictureUrloptionalstring
    lastMetaSyncAtoptionalstring | null · date-time
    createdAtrequiredstring · date-timeISO-8601 timestamp in UTC.
    updatedAtrequiredstring · date-timeISO-8601 timestamp in UTC.
    JSON
    {  "id": "num_aB3xY9zQ1pTkLmNoPqRsT",  "organizationId": "org_pGgniw5L7CTDSZDwjDrQ2",  "phoneNumberId": "1234567890123456",  "wabaId": "9876543210987654",  "displayPhone": "+5511999998888",  "status": "connected",  "qualityRating": "green",  "messagingTier": "tier_1k",  "rateLimit": {    "perSecond": 80,    "perDay": 100000  },  "meta": {    "verifiedName": "Acme Sales",    "byo": false,    "nameStatus": "rejected",    "partnerRemovedAt": "2026-10-16T12:00:00.000Z",    "partnerRemovedReason": "PARTNER_REMOVED"  },  "profile": {    "about": "string",    "address": "string",    "email": "string",    "website": "string",    "vertical": "string",    "profilePictureUrl": "string"  },  "lastMetaSyncAt": "2026-10-16T12:00:00.000Z",  "createdAt": "2026-04-07T17:30:00.000Z",  "updatedAt": "2026-04-07T17:30:00.000Z"}
  • 401RFC 7807 problem details for UNAUTHORIZED (401).

  • 403RFC 7807 problem details for FORBIDDEN (403).

  • 404RFC 7807 problem details for NOT_FOUND (404).

Error responses follow RFC 7807 (application/problem+json), with a stable code in the code field. See the error codes

curl example

cURL
curl 'https://api.messages.ccxcompany.co/numbers/num_aB3xY9zQ1pTkLmNoPqRsT' \  -H "Authorization: Bearer $CCX_API_KEY"
Required fields only. Swap the sample values for your own.

Real-time health check from Meta

GET/numbers/{id}/health

Fetches current number status, quality, messaging tier, and business profile directly from Meta Graph API.

Parameters

FieldInTypeDescription
idrequiredpathstringBranded Number id (num_ prefix + 21 nano-id chars).

Responses

  • 200Default Response

    Response fields and example
    JSON
    {}
  • 401RFC 7807 problem details for UNAUTHORIZED (401).

  • 403RFC 7807 problem details for FORBIDDEN (403).

  • 404RFC 7807 problem details for NOT_FOUND (404).

Error responses follow RFC 7807 (application/problem+json), with a stable code in the code field. See the error codes

curl example

cURL
curl 'https://api.messages.ccxcompany.co/numbers/num_aB3xY9zQ1pTkLmNoPqRsT/health' \  -H "Authorization: Bearer $CCX_API_KEY"
Required fields only. Swap the sample values for your own.

Envios reais deste número na janela pedida (default 24h)

GET/numbers/{id}/usage

Agrega messages (outbound, numberId) na janela. Aceita ?window=24h|7d|30d.

Parameters

FieldInTypeDescription
windowoptionalquerystring
idrequiredpathstringBranded Number id (num_ prefix + 21 nano-id chars).

Responses

  • 200Default Response

    Response fields and example
    FieldTypeDescription
    windowrequiredstring
    sentrequiredinteger
    marketingSentoptionalinteger | null
    sincerequiredstring · date-time
    untilrequiredstring · date-time
    JSON
    {  "window": "string",  "sent": 0,  "marketingSent": 0,  "since": "2026-10-16T12:00:00.000Z",  "until": "2026-10-16T12:00:00.000Z"}
  • 401RFC 7807 problem details for UNAUTHORIZED (401).

  • 403RFC 7807 problem details for FORBIDDEN (403).

  • 404RFC 7807 problem details for NOT_FOUND (404).

Error responses follow RFC 7807 (application/problem+json), with a stable code in the code field. See the error codes

curl example

cURL
curl 'https://api.messages.ccxcompany.co/numbers/num_aB3xY9zQ1pTkLmNoPqRsT/usage' \  -H "Authorization: Bearer $CCX_API_KEY"
Required fields only. Swap the sample values for your own.

Timeseries de envios (buckets pra sparkline)

GET/numbers/{id}/usage/timeseries

Retorna points[] alinhados no bucket pedido (hour|day). Buckets vazios entram como sent: 0 — o cliente pode desenhar direto.

Parameters

FieldInTypeDescription
windowoptionalquerystring
bucketoptionalquerystringValues:hourday
idrequiredpathstringBranded Number id (num_ prefix + 21 nano-id chars).

Responses

  • 200Default Response

    Response fields and example
    FieldTypeDescription
    windowrequiredstring
    bucketrequiredstringValues:hourday
    sincerequiredstring · date-time
    untilrequiredstring · date-time
    pointsrequiredobject[]
    points[].atrequiredstring · date-time
    points[].sentrequiredinteger
    JSON
    {  "window": "string",  "bucket": "hour",  "since": "2026-10-16T12:00:00.000Z",  "until": "2026-10-16T12:00:00.000Z",  "points": [    {      "at": "2026-10-16T12:00:00.000Z",      "sent": 0    }  ]}
  • 401RFC 7807 problem details for UNAUTHORIZED (401).

  • 403RFC 7807 problem details for FORBIDDEN (403).

  • 404RFC 7807 problem details for NOT_FOUND (404).

Error responses follow RFC 7807 (application/problem+json), with a stable code in the code field. See the error codes

curl example

cURL
curl 'https://api.messages.ccxcompany.co/numbers/num_aB3xY9zQ1pTkLmNoPqRsT/usage/timeseries' \  -H "Authorization: Bearer $CCX_API_KEY"
Required fields only. Swap the sample values for your own.

Stuck on a route? Talk to the people who run the API.

Sign up through the site and get a US$5 test credit.