Verified leads, source-linked, in under 1.5 seconds.
Send { "email": "jane.doe@stripe.com" }. Get back her title, role history, company funding stage, technographics, hiring intent — every field carrying a confidence score and at least one public source URL.
First curl in under 5 minutes. No portal. No OAuth.
"code-comment">$ "code-method">curl "code-key">-X "code-method">POST https://lead-enrichment.prin7r.com/v1/enrich \
"code-key">-H 'authorization: Bearer YOUR_KEY' \
"code-key">-H 'content-type: application/json' \
"code-key">-d '{"email":"jane.doe@stripe.com"}'Engineering proof points
P95 1.4s · P99 2.1s · measured against 1k-record benchmark
Per-field coverage on B2B SaaS Series A–C ICP
Firmographics · 14d decision-maker · 24h intent
Scale tier · 49% off Starter
Six categories. One JSON. Six confidence scores.
The schema is the hero. Every field on the response carries a confidence score and the public source we used to derive it.
Company shape
Industry, employee band, HQ, funding stage and last round — all sourced from SEC, Companies House, and Crunchbase open snapshots.
Person profile
Full name, current title, department, two most recent role changes — each with the LinkedIn URL we used to derive it.
Stack fingerprint
CDN, framework, runtime, database, auth provider — derived from header probes and DOM-free HTML response fingerprinting.
Hiring + news + changelog
Open-role count by department, news mention count over 7d, changelog activity (active vs. quiet) — refreshed daily.
Email deliverability
SMTP echo + MX validation + breach-disclosure metadata. We return `not_match` instead of guessing pattern-built emails.
Source-linked confidence
Every field ships with a 0.0–1.0 confidence score and at least one public source URL. Click the URL, audit the claim.
No portal. No OAuth. Five-line first integration.
The schema below is the same JSON the production endpoint returns. Pin our version header (X-Triangulate-Version: 2026-05) when you're ready to lock it down.
- → Stable JSON schema, semver-pinned.
- → Deterministic responses on identical input.
- → Cache hits don't consume credits.
- → Correlation id on every response.
01 · Authentication
# 1. Buy a credit pack on the pricing page below.
# 2. Receive your API key by email.
# 3. Send the key as a Bearer token. Done.
"code-method">curl https://lead-enrichment.prin7r.com/healthz
# -> { "status": "ok", "service": "triangulate-api", ... }
"code-method">curl "code-key">-H "authorization: Bearer YOUR_KEY" \
"code-key">-X "code-method">POST https://lead-enrichment.prin7r.com/v1/enrich \
"code-key">-H "content-type: application/json" \
"code-key">-d '{"email":"jane.doe@stripe.com"}'02 · Single enrichment
# Single enrichment — one credit consumed on cache miss.
# Cache hits return < 50ms and consume 0 credits.
"code-method">curl "code-key">-X "code-method">POST https://lead-enrichment.prin7r.com/v1/enrich \
"code-key">-H "authorization: Bearer YOUR_KEY" \
"code-key">-H "content-type: application/json" \
"code-key">-d '{
"email": "jane.doe@stripe.com",
"domain": "stripe.com",
"firstName": "Jane",
"lastName": "Doe",
"company": "Stripe"
}'03 · Webhook callback (optional)
"code-comment">// Optional: register a webhook to receive batch completions.
"code-comment">// We POST a signed event when a bulk job finishes.
"code-key">import crypto "code-key">from "node:crypto";
"code-key">export "code-key">async "code-key">function POST(req: Request) {
"code-key">const raw = "code-key">await req.text();
"code-key">const sig = req.headers.get("x-triangulate-signature") ?? "";
"code-key">const expected = crypto
.createHmac("sha256", process.env.TRIANGULATE_WEBHOOK_SECRET!)
.update(raw)
.digest("hex");
"code-key">if (!crypto.timingSafeEqual(Buffer."code-key">from(sig), Buffer."code-key">from(expected))) {
"code-key">return "code-key">new Response("invalid signature", { status: 401 });
}
"code-key">const event = JSON.parse(raw); "code-comment">// { type, batchId, completedAt, results: [...] }
"code-key">await persist(event);
"code-key">return "code-key">new Response("ok");
}One credit, one verified record.
Three credit packs. No contract, no seats. Cached responses don't consume credits. Refund prorated to unused credits within 30 days, refunded to the same payment rail.
Founders evaluating + small teams running ≤ 1k enrichments/month.
1,000 credits · $0.049 / credit
- 1,000 enrichment credits
- Cached responses don't burn credits
- Per-field confidence + sources
- USDT-TRC20, USDC-Polygon, USDC-ERC20
- Best-effort latency (P95 1.4s)
- Prorated refund within 30 days
USDT-TRC20, USDC-Polygon, USDC-ERC20 via NOWPayments hosted invoice.
RevOps engineering teams running 1k–10k enrichments/month.
10,000 credits · $0.0399 / credit
- 10,000 enrichment credits
- 19% discount vs. Starter
- Webhook-style batch callbacks
- All Starter features included
- Priority email support (24h reply)
- Prorated refund within 30 days
USDT-TRC20, USDC-Polygon, USDC-ERC20 via NOWPayments hosted invoice.
Series-B and larger running 10k–100k enrichments/month with a contractual SLA.
100,000 credits · $0.02499 / credit
- 100,000 enrichment credits
- 49% discount vs. Starter
- Contractual ≤ 1.5s P95 SLA
- 99.9% monthly uptime SLA
- Quarterly USDT-TRC20 invoicing available
- Named-engineer Slack support
USDT-TRC20, USDC-Polygon, USDC-ERC20 via NOWPayments hosted invoice.
Above 100k credits/month? Talk to the founder for custom pricing — typically $0.01–$0.02/credit with annual prepay.
Three things we ship that competitors don't.
Source-linked, not score-linked
Every confidence score ships with a public source URL. Audit any field by clicking through. No black-box scoring; no vendor pinky-swears.
Latency you can put in a contract
P50 720ms. P95 1.4s. P99 2.1s. Methodology published. Scale tier holds us to a contractual ≤ 1.5s P95 with prorated credit refund on miss.
Freshness on every response
Firmographics refresh on a 28-day window; decision-maker mapping on 14d; intent on 24h. The age of any cached record is on `meta.freshness.ageDays`.
The questions engineers and operators ask first.
Don't see your question? Email the founder — replies within four business hours.