A small, versioned REST API for querying contacts, signals, research, and generating outreach programmatically. JSON in, JSON out, Bearer auth.
Generate an API key from Settings → Developers → API keys. Pass it as a Bearer token in every request:
curl https://api.reconnaissance-ai.com/v1/contacts \ -H "Authorization: Bearer sk_live_xxxxxxxxxxxx" \ -H "Accept: application/json"
Base URL: https://api.reconnaissance-ai.com/v1
Rate limit: 60 req/min on Pro · 600 req/min on Enterprise
Encoding: JSON (Content-Type: application/json)
List contacts in your workspace. Supports limit, cursor, and filter by pipeline_stage, icp_score_min.
{
"data": [
{
"id": "c_4f3e...",
"name": "Marcus König",
"email": "marcus@physical.ai",
"company": "Physical Intelligence",
"role": "Head of ML",
"icp_score": 87,
"pipeline_stage": "contacted",
"intent_band": "hot"
}
],
"next_cursor": "eyJpZCI6ImNfNGYzZSJ9"
}
Upsert a contact. Match by email or crm_id. Creates if missing, updates otherwise.
POST /v1/contacts
{
"email": "marcus@physical.ai",
"name": "Marcus König",
"company": "Physical Intelligence",
"role": "Head of ML"
}
List active signals across your workspace. Filter by type, contact_id, since (ISO 8601), min_weight.
{
"data": [
{
"id": "s_8a2b...",
"type": "funding_detected",
"contact_id": "c_4f3e...",
"company": "Physical Intelligence",
"weight": 20,
"fired_at": "2026-04-15T09:22:11Z",
"metadata": { "round": "Series B", "amount_usd": 400000000 }
}
]
}
Fetch the AI research brief for a contact — company summary, products, tech stack, pain points, industry tag.
Generate outreach for a contact. Optionally pin an angle (trigger / problem / insight / competitor) and a template.
POST /v1/outreach/generate
{
"contact_id": "c_4f3e...",
"angle": "auto",
"email_steps": 3,
"linkedin_steps": 1
}
→ 200 OK
{
"email_1": { "subject": "...", "body": "..." },
"email_2": { "subject": "...", "body": "..." },
"email_3": { "subject": "...", "body": "..." },
"linkedin": { "connection": "...", "msg_1": "...", "msg_2": "...", "msg_3": "..." },
"resolved_angle": "competitor",
"hook_archetype": "timeline"
}
Register a webhook for events. Available events: signal.fired, reply.received, pipeline_stage.changed, research.completed.
POST /v1/webhooks/register
{
"url": "https://your-app.com/hooks/recon",
"events": ["signal.fired", "reply.received"],
"secret": "whsec_..."
}
Current billing period usage — AI generations, API calls, active seats.
| Status | Error code | Meaning |
|---|---|---|
| 400 | invalid_request | Malformed JSON or missing required field |
| 401 | invalid_token | Missing or invalid Bearer token |
| 403 | feature_not_available | Endpoint requires Pro or Enterprise plan |
| 404 | not_found | Resource doesn't exist or you don't have access |
| 429 | rate_limited | Too many requests. Retry after the Retry-After header |
| 500 | internal_error | Something broke on our side. We're on it (Sentry'd) |
Official SDKs for JavaScript / TypeScript and Python are on the roadmap. For now, any HTTP client works. A typed OpenAPI schema is available at https://api.reconnaissance-ai.com/openapi.json.
Drop us a line and we'll get you API keys, SDK preview access, and a Slack channel with the engineers building the endpoints you'll use.