Get metered usage for a date range

GEThttps://api.wapito.com/v1/usage

Send a channel token on every request: Authorization: Bearer wpt_YOUR_TOKEN

Returns the five counters Wapito meters for this channel, both as a total and broken down per day: messages sent, messages received, billable API requests, numbers checked and webhook deliveries attempted. The range defaults to the current calendar month. Counters are written as requests complete, so the current day keeps moving while you read it.

Parameters

NameInTypeRequiredDescriptionExample
fromquerystringOptionalFirst day to include, `YYYY-MM-DD`. Defaults to the first day of the current month.date2026-09-01
toquerystringOptionalLast day to include, `YYYY-MM-DD`. Defaults to today.date2026-09-15

Responses

200

Usage over the requested range.

Fields of the 200 response
FieldTypeRequiredDescription
daysarray of objectRequiredPer-day breakdown, oldest first.
datestringRequiredDay, `YYYY-MM-DD`.date
api_requestsintegerRequiredBillable API requests (`req` quota).
number_checksintegerRequiredNumbers checked against WhatsApp (`chk` quota).
receivedintegerRequiredInbound messages processed.
sentintegerRequiredMessages accepted for sending (`sent` quota).
webhook_deliveriesintegerRequiredWebhook delivery attempts that reached your endpoint.
fromstringRequiredFirst day included, `YYYY-MM-DD`.date
limitsobjectRequiredThe plan caps the counters are measured against; `null` means uncapped.
api_requests_per_monthinteger | nullRequiredAPI requests per calendar month.
number_checks_per_dayinteger | nullRequiredNumber checks per UTC day.
sent_per_dayinteger | nullRequiredMessages per UTC day.
monthobjectRequiredThe monthly `api_requests` allowance — a month, not a day, so it stands apart from `days`.
api_requestsintegerRequiredRequests made so far this calendar month.
capinteger | nullRequiredRequests allowed this month, or `null` when uncapped.
tostringRequiredLast day included, `YYYY-MM-DD`.date
totalsobjectRequiredThe five counters Wapito meters per channel.
api_requestsintegerRequiredBillable API requests (`req` quota).
number_checksintegerRequiredNumbers checked against WhatsApp (`chk` quota).
receivedintegerRequiredInbound messages processed.
sentintegerRequiredMessages accepted for sending (`sent` quota).
webhook_deliveriesintegerRequiredWebhook delivery attempts that reached your endpoint.
{
  "days": [
    {
      "api_requests": 1388,
      "date": "2026-09-14",
      "number_checks": 26,
      "received": 712,
      "sent": 401,
      "webhook_deliveries": 1102
    },
    {
      "api_requests": 1290,
      "date": "2026-09-15",
      "number_checks": 38,
      "received": 688,
      "sent": 412,
      "webhook_deliveries": 1044
    }
  ],
  "from": "2026-09-01",
  "limits": {
    "api_requests_per_month": null,
    "number_checks_per_day": null,
    "sent_per_day": null
  },
  "month": {
    "api_requests": 19422,
    "cap": null
  },
  "to": "2026-09-15",
  "totals": {
    "api_requests": 19422,
    "number_checks": 412,
    "received": 9104,
    "sent": 5821,
    "webhook_deliveries": 14903
  }
}

400

The request body or query string is malformed, or the recipient cannot be parsed into a WhatsApp id.

Show 2 example bodies

invalid_recipient — `to` is not a dialable number or valid WhatsApp id

{
  "error": {
    "code": "invalid_recipient",
    "details": {
      "to": "+1555"
    },
    "message": "The recipient is not a valid WhatsApp address.",
    "request_id": "req_01JRQ8F4X9N2K7YB3C5V6W8H0T"
  }
}

invalid_request — schema validation failed

{
  "error": {
    "code": "invalid_request",
    "details": {
      "issues": [
        {
          "message": "Array must contain at least 2 element(s)",
          "path": "body.options"
        }
      ]
    },
    "message": "The request payload failed validation.",
    "request_id": "req_01JRQ8F4X9N2K7YB3C5V6W8H0T"
  }
}

401

The channel token is missing, malformed, revoked or belongs to a deleted channel.

Show 2 example bodies

token_revoked — the token was rotated in the dashboard

{
  "error": {
    "code": "token_revoked",
    "message": "This channel token has been revoked.",
    "request_id": "req_01JRQ8F4X9N2K7YB3C5V6W8H0T"
  }
}

unauthorized — no or unusable Bearer token

{
  "error": {
    "code": "unauthorized",
    "message": "Missing or invalid channel token.",
    "request_id": "req_01JRQ8F4X9N2K7YB3C5V6W8H0T"
  }
}

403

The token is valid but the channel may not perform this action right now.

Show 2 example bodies

channel_locked — billing lapsed or the channel was locked by an operator

{
  "error": {
    "code": "channel_locked",
    "details": {
      "reason": "plan_required"
    },
    "message": "This channel is locked.",
    "request_id": "req_01JRQ8F4X9N2K7YB3C5V6W8H0T"
  }
}

forbidden — the channel does not own the target object

{
  "error": {
    "code": "forbidden",
    "message": "You are not allowed to perform this action.",
    "request_id": "req_01JRQ8F4X9N2K7YB3C5V6W8H0T"
  }
}

429

A rate limit, a plan quota or one of the anti-ban guards stopped the request. Every one of these is safe to retry later; read `Retry-After` when present.

Show 5 example bodies

cold_send_limit — too many first messages to new recipients this hour

{
  "error": {
    "code": "cold_send_limit",
    "details": {
      "resets_at": "2026-09-15T09:00:00.000Z",
      "window_cap": 20
    },
    "message": "The hourly limit for messages to new recipients is reached.",
    "request_id": "req_01JRQ8F4X9N2K7YB3C5V6W8H0T"
  }
}

quota_exceeded — plan quota for the day or month

{
  "error": {
    "code": "quota_exceeded",
    "details": {
      "quota": "sent",
      "resets_at": "2026-09-16T00:00:00.000Z",
      "used": 150
    },
    "message": "The plan quota for this resource is exhausted.",
    "request_id": "req_01JRQ8F4X9N2K7YB3C5V6W8H0T"
  }
}

rate_limited — per-minute API rate limit

{
  "error": {
    "code": "rate_limited",
    "details": {
      "retry_after": 12
    },
    "message": "Too many requests.",
    "request_id": "req_01JRQ8F4X9N2K7YB3C5V6W8H0T"
  }
}

send_rate_limited — the send queue did not drain within 20 s

{
  "error": {
    "code": "send_rate_limited",
    "details": {
      "retry_after": 5
    },
    "message": "The send queue for this channel is saturated.",
    "request_id": "req_01JRQ8F4X9N2K7YB3C5V6W8H0T"
  }
}

warmup_limit — the warm-up ladder cap for today

{
  "error": {
    "code": "warmup_limit",
    "details": {
      "cap": 200,
      "day": 2
    },
    "message": "The warm-up limit for this channel is reached.",
    "request_id": "req_01JRQ8F4X9N2K7YB3C5V6W8H0T"
  }
}

500

Something went wrong inside Wapito. Quote `request_id` when reporting it.

Show the example body

internal_error — unexpected failure

{
  "error": {
    "code": "internal_error",
    "message": "Something went wrong on our side.",
    "request_id": "req_01JRQ8F4X9N2K7YB3C5V6W8H0T"
  }
}

Errors

Code examples

import requests

url = "https://api.wapito.com/v1/usage"

querystring = {"from":"2026-09-01","to":"2026-09-15"}

headers = {"Authorization": "Bearer wpt_YOUR_TOKEN"}

response = requests.get(url, headers=headers, params=querystring)

print(response.json())

Related

Try it on your own number

Create a channel, link a WhatsApp number by QR or pairing code, and call the API in a couple of minutes. The Sandbox plan is free and needs no card.