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
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
401INVALID_API_KEYKey not found or malformed header
401REVOKED_API_KEYKey exists but is not active
402INSUFFICIENT_CREDITSBalance below what the request needs
429RATE_LIMITEDPlan rate limit breached — see Retry-After header
503PROVIDER_UNAVAILABLEUpstream network unreachable — credit refunded
{
  "error": {
    "code": "INSUFFICIENT_CREDITS",
    "message": "You have run out of credits. Top up at https://usefilter.io/billing"
  }
}

See also

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