API
API for developers
The DuckINT API for Pro accounts: run the same OSINT searches from your own code with an API key, with the same sources, quota and limits as the site.
1. Get an API key
API access is part of the Pro plan. Create a key in Settings → API keys. It is shown once: store it like a password. You can have three keys and revoke any of them at once; replacing your access key ends them all.
Send the key with every request:
Authorization: Bearer dk_…
2. Search
POST https://duckint.cc/api/v1/search runs one search and answers when every source has finished, usually within 30 seconds. Give your client a timeout of at least 90 seconds.
curl -s https://duckint.cc/api/v1/search \
-H "Authorization: Bearer $DUCKINT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "example.com", "kind": "domain"}'| Field | Type | Meaning |
|---|---|---|
| query | string, required | The value to search: email, username, domain, IP, URL, Discord ID, crypto address… |
| kind | string | Search the value only as this type, e.g. "domain". It must be a type the value can be. |
| only | string[] | Run only these sources (capability ids from /api/capabilities). |
| exclude | string[] | Skip these sources. |
| include | string[] | Sources that run only when picked (daily allowance), e.g. "hunter-domain". |
The answer:
{
"ok": true,
"data": {
"searchId": "…",
"query": { "normalized": "example.com", "intents": [{ "kind": "domain", "value": "example.com" }] },
"outcome": "results",
"charged": true,
"durationMs": 8123,
"quota": { "limit": 25, "used": 3, "remaining": 22, "date": "…" },
"checks": [{ "capability": "rdap-domain", "providerName": "RDAP", "status": "results", "resultCount": 1 }],
"skipped": [{ "capability": "hunter-domain", "reason": "excluded", "detail": "…" }],
"results": [{ "key": "…", "type": "domain-registration", "title": "…", "fields": [], "sources": [], "data": {} }]
}
}Results have the same shape as the site's JSON export. Raw provider payloads are never included, and neither are leaked passwords: the API tells you where a credential leaked, not the credential. Open the search on duckint.cc to reveal one.
3. Check a key
GET https://duckint.cc/api/v1/me returns the account's username, plan and today's searches, without running a search.
curl -s https://duckint.cc/api/v1/me -H "Authorization: Bearer $DUCKINT_API_KEY"
4. Limits
- The same daily allowance as your account (Pro has no daily limit); a search that finds nothing is not charged.
- At most 250 API search requests per account in 24 hours, across all its keys, even ones that find nothing; the X-API-Daily-Remaining header shows what is left.
- Need more? It can be raised for an extra fee: Contact us
- At most 30 requests a minute per key, on top of the site's limits on searches per minute and searches running at once.
- Searches made with a key appear in your history like any other, and follow the same retention.
- Acceptable use policy: no stalking, harassment or searching people without a lawful reason.
5. Errors
Errors answer {"ok": false, "error": {"code": "…", "message": "…"}} with these statuses:
| HTTP | code | When |
|---|---|---|
| 400 | bad_request | Missing or invalid query, or a type the value can't be. |
| 401 | unauthorized | No key, a revoked key, or a key from before the access key was replaced. |
| 403 | forbidden | The account has no Pro plan, or the value is excluded from searches. |
| 429 | rate_limited / quota_exhausted | Too many requests, the 24-hour API cap reached, or no searches left today; wait for Retry-After. |
| 502 | provider_unavailable | The search could not be completed. No search was charged. |