API reference

Every endpoint, every field, every error code.

POST /api/v1/filter

Checks a single phone number synchronously. Returns in under 1.5 seconds typically, under 100ms on a cache hit.

FieldTypeNotes
phonestringE.164 format, e.g. +919876543210
sourcestringOptional. Where this number came from — "facebook", "instagram", "website", "youtube", "bulk", etc. Defaults to "internal".

Which check type(s) run is an account setting now, not a request field — see Settings for the three you can enable: Network Connection Status (on by default), Phone Number Type, and Portability Status. Enabling an optional signal costs more credits per call, but never changes the shape of this response.

{
  "country": "IN",
  "valid": true,
  "status": "CONNECTED",
  "carrier": "Jio",
  "line_type": "MOBILE",
  "is_ported": false
}
FieldMeaning
countryISO country code the number belongs to, e.g. IN
validWhether the number is well-formed and live
statusCONNECTED | ABSENT | UNDETERMINED
carrierOperator name, when determinable
line_typee.g. MOBILE
is_portedWhether the number has been ported between operators

That's the whole response — no cache flag, no per-request credit count. Credits are still deducted per the credit logic below; check your balance separately whenever you want it, with GET /api/v1/balance.

GET /api/v1/balance

curl https://api.usefilter.io/api/v1/balance \
  -H "Authorization: Bearer YOUR_API_KEY"

Errors

HTTPerror.codeWhen
400INVALID_REQUESTMalformed body, missing phone, or no check type enabled in Settings
401MISSING_API_KEYNo Authorization header was sent at all
401INVALID_API_KEYKey not found, or the header is present but malformed
401REVOKED_API_KEYKey exists but is not active
402INSUFFICIENT_CREDITSBalance below what the request needs
500INTERNAL_ERROROur bug — credit refunded if one was already reserved
429RATE_LIMITEDPer-key rate limit exceeded — see "Rate limiting" below
503PROVIDER_UNAVAILABLE[TO BE CONFIRMED] Cannot fire by current design — see below
{
  "error": {
    "code": "INSUFFICIENT_CREDITS",
    "message": "You have run out of credits. Top up at /app/billing."
  }
}

Rate limiting

Every API key is limited to 2 requests/second, with a burst allowance up to 5. Exceeding it returns 429 RATE_LIMITED with a Retry-After header (seconds until the next token). Need a higher limit? Email us — it's a per-key setting we can raise on request.

Why 503 is listed but can't happen yet

[TO BE CONFIRMED] 503 PROVIDER_UNAVAILABLE is listed for completeness but cannot actually occur today: an unreachable/timing-out upstream call is absorbed per-type as a refunded, 200-status UNDETERMINED result (see /docs/errors), never as a request-level failure. 500 INTERNAL_ERROR is the one error code above that's real and live right now.

See also

  • Full error semantics: /docs/errors
  • Bulk lookups (up to 1,000 numbers): /docs/bulk