Conure API

API reference

Base URL https://conureapi.com. JSON in, JSON out, bearer auth. There is nothing else to learn.

/v1/bot-check · /v1/email-check · /v1/usage · Errors · Limits

Authentication

Send your key as a bearer token. Keys are stored as SHA-256 hashes, so we cannot show you an existing key, only mint a new one.

Authorization: Bearer YOUR_API_KEY

Browser CORS is scoped to your own origins on purpose. A key that reaches the browser is a public key, so call us from your server.

POST /v1/bot-check

Scores an IP and User-Agent pair. A risk score above 50 sets is_bot. The IP half is deterministic: a merged range table over published datacenter CIDRs, with no heuristics.

Costs one credit. Refunded on any non-2xx response.

Parameters

FieldTypeRequiredNotes
ipstringyesIPv4 address of the client.
user_agentstringnoRaw User-Agent header. Absent or empty is itself a signal.
headersobjectnoRequest headers, up to 64 entries. Missing browser headers add risk.

Response

{
  "is_bot": true,
  "risk_score": 100,
  "reasons": [
    "datacenter_ip",
    "missing_sec_ch_ua",
    "missing_accept_language",
    "missing_sec_fetch_site",
    "known_bot_user_agent"
  ]
}

Try it

POST /v1/email-check

Scores an address on syntax, role-account shape, disposable-domain membership, free-provider status and a live MX lookup. A risk score above 40 sets is_risky. A DNS failure scores zero rather than inventing a verdict.

Costs one credit. Refunded on any non-2xx response.

Parameters

FieldTypeRequiredNotes
emailstringyesAddress to score. Maximum 254 characters.

Response

{
  "email": "admin@mailinator.com",
  "is_risky": true,
  "is_role": true,
  "is_disposable": true,
  "is_free_provider": false,
  "has_mx": true,
  "mx_status": "has_mx",
  "risk_score": 90,
  "reasons": ["role_account", "disposable_domain"]
}

Try it

GET /v1/usage

Current balance for the key. Authenticated but never metered: checking your balance is free.

Free. Never metered.

Parameters

No parameters.

Response

{
  "period": "2026-08",
  "free_used": 412,
  "free_limit": 1000,
  "free_remaining": 588,
  "paid_remaining": 0,
  "total_remaining": 588
}

Try it

Errors

StatusMeaning
400Validation failed. details[] names the field. Not billed.
401Missing, malformed or revoked key.
402Credits exhausted. Top up on the dashboard.
413Body over the size cap.
429Rate limited. Retry after the header says.
500Our fault. Not billed. Quote request_id.
503Storage unreachable. Retry: this is not an auth failure.
{
  "error": "Invalid request body",
  "request_id": "01J...",
  "details": [{ "field": "ip", "message": "Must be a valid IPv4 address" }]
}

Limits and stated trade-offs