DocumentationRate limits

Rate limits

Stay within request limits and retry safely when the API asks you to wait.

Base URLhttps://api.dehashit.com/api/v1/

Rate limits

Limits use a sliding 60-second window. A 429 response is not billed and includes Retry-After in seconds (normally 60). Wait at least that long before trying again; immediate retries use your retry budget without helping the request succeed.

Request limits

ScopeLimit
Look up hashed MSISDN, per API key100 / min
Look up hashed MSISDN, per source IP400 / min
Phone validation, per API key200 / min
Batch creation, per account10 / min

Service keys cannot access batch jobs; API integrations require a tenant-owned API key.

For billable lookups, preserve the same Idempotency-Key and hash across retries, including after a network timeout. Generate the key once per logical lookup, not inside the retry loop. The Python, Node.js, and Go helpers retry 429 responses only; cURL also retries transient server errors. Handle other API responses in your application.

Handling rate limits (429)

# Modern cURL honors Retry-After for transient HTTP errors.
curl -i -X POST https://api.dehashit.com/api/v1/msisdn/decrypt/ \
  -H "X-Api-Key: dh_live_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: payment-order-123" \
  -d '{"msisdn_hash": "7132104d6aae9c3fac82095a42c2817952bca48e09d98d5bf4ac08218982fb90"}' \
  --retry 3 --retry-max-time 240

Rate limit response (429)

{
  "status": false,
  "status_code": 429,
  "error_code": "rate_limited",
  "message": "Rate limit exceeded. Back off and retry.",
  "data": {}
}

Requests exceeding these thresholds return HTTP 429 with error_code: "rate_limited" and a Retry-After: 60 header. Spread requests over time instead of sending large bursts. Authentication, invalid-input, balance, and key-conflict errors need application action rather than an automatic retry.

Need a hand with your integration? Contact support.