Siglore API
One base URL, bearer keys, JSON in and out. Parse emails into structured contacts, verify and find addresses through the waterfall, and sync your contact base anywhere.
https://siglore.com/api/v1Authentication
Create a key in Settings → API keys — it is shown once and stored hashed. Send it on every request. Keys are rate-limited to 120 requests/minute.
curl https://siglore.com/api/v1/credits \ -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx"
Credits & pricing
Enrichment bills in credits, and only for delivered answers — a miss across the whole waterfall costs nothing. Parsing costs no credits.
verify | 1 credit | Definitive deliverability answer (unknown = free) |
find-email | 5 credits | Only when the found address verifies |
person enrich | 3 credits | Only when profile data is found |
Insufficient balance returns 402 with {"error":"no_credits"}.
POST/parse
Extract every person from a raw email.0 credits
raw | string · required | Full RFC822 message or plain email text, up to 512 KB |
store | boolean | Also merge the people into your contact base (default false) |
Parsing spends no credits but counts toward the plan's monthly parse allowance (unlimited on Pro); over the free allowance the endpoint returns 402 monthly_parse_limit.
curl -X POST https://siglore.com/api/v1/parse \ -H "Authorization: Bearer $SIGLORE_KEY" \ -H "Content-Type: application/json" \ -d '{"raw": "...full email including signature...", "store": true}'
{
"people": [
{
"emails": ["jane@acme.com"],
"fullName": "Jane Doe",
"title": "VP Sales",
"company": "Acme Corp",
"companyDomain": "acme.com",
"phones": [{ "type": "mobile", "number": "+1 416 555 0199" }],
"socials": [{ "network": "linkedin", "url": "https://linkedin.com/in/janedoe" }],
"source": "signature",
"confidence": 0.95
}
],
"stored": { "created": 1, "updated": 0 }
}POST/verify
Check whether an address really accepts mail.1 credit on a definitive answer
email | string · required | The address to check |
curl -X POST https://siglore.com/api/v1/verify \ -H "Authorization: Bearer $SIGLORE_KEY" \ -H "Content-Type: application/json" \ -d '{"email": "jane@acme.com"}'
{
"jobId": "j_8f2c41",
"status": "hit",
"data": { "status": "valid" },
"creditsCharged": 1
}data.status is one of valid · invalid · catch_all · unknown (unknown is never charged).
POST/find-email
Name + company domain in, verified address out.5 credits on a verified hit
Cascades across multiple data sources and verifies before charging. No verified find → no charge.
first_name | string · required | Given name |
last_name | string · required | Family name |
domain | string · required | Company domain, e.g. acme.com |
curl -X POST https://siglore.com/api/v1/find-email \ -H "Authorization: Bearer $SIGLORE_KEY" \ -H "Content-Type: application/json" \ -d '{"first_name": "Jane", "last_name": "Doe", "domain": "acme.com"}'
{
"jobId": "j_c90de2",
"status": "hit",
"data": { "email": "jane@acme.com", "verification": "valid" },
"creditsCharged": 5
}GET/contacts
Paginated export of your contact base.0 credits
offset | integer | Pages of 200, default 0 |
updated_since | ISO 8601 | Only records changed since — poll for incremental sync |
curl "https://siglore.com/api/v1/contacts?updated_since=2026-08-01T00:00:00Z" \ -H "Authorization: Bearer $SIGLORE_KEY"
{
"contacts": [
{
"id": "c_7d31aa",
"primaryEmail": "jane@acme.com",
"fullName": "Jane Doe",
"title": "VP Sales",
"company": "Acme Corp",
"phones": [{ "type": "mobile", "number": "+1 416 555 0199" }],
"firstSeenAt": "2026-05-02T09:12:44.000Z",
"lastSeenAt": "2026-08-03T18:22:00.000Z"
}
],
"offset": 0,
"hasMore": false
}GET/credits
Current credit balance.0 credits
{ "balance": 940 }Webhooks
Add an endpoint in Settings → Webhooks and we POST contacts.changed events as contacts are created or updated. Every delivery is signed.
{
"event": "contacts.changed",
"data": { "ingestionId": "i_55ab01", "created": 2, "updated": 1 },
"workspaceId": "w_19fe2c",
"at": "2026-08-04T14:22:31.000Z"
}The X-Siglore-Signature header is t=<unix>,v1=<hex> where v1 = HMAC-SHA256 of "<t>.<body>" with your endpoint secret. Reject anything older than 5 minutes or with a bad signature. Endpoints failing 10 times in a row are paused until re-added.
Errors
400 | bad request | Missing or malformed input — the error field says which |
401 | unauthorized | Missing, invalid, or revoked key |
402 | no credits | Balance too low for the operation |
429 | rate limited | Over 120 requests/minute — back off and retry |
501 | not configured | That capability has no active provider yet |
{ "error": "no_credits" }