Agent Quickstart
Everything your AI agent needs to call ABM.dev APIs: authentication, endpoints, tool definitions, streaming, error handling, and rate limits.
1. Authentication
Every request requires two headers. Get your API key from /settings/api-keys and your org ID from the dashboard.
# Include on every request Authorization: Bearer YOUR_API_KEY X-Org-ID: your-org-id
2. Base URL
All endpoints are relative to:
https://api.abm.dev3. Core Endpoints
These are the endpoints your agent will call most often.
| Method | Endpoint | Description |
|---|---|---|
| POST | /v1/enrichments | Enrich a contact |
| GET | /v1/enrichments/{id} | Get enrichment result |
| GET | /v1/enrichments/{id}/stream | SSE progress stream |
| GET | /v1/linkedin/profile/{publicId} | Research a LinkedIn profile |
| GET | /v1/linkedin/profile/{publicId}/contact | Get contact info |
| POST | /v1/linkedin/messages | Send LinkedIn message |
| GET | /v1/linkedin/search/people | Search people on LinkedIn |
| POST | /v1/people-finder | Find decision-makers (coming soon) |
4. Tool Definitions
Copy the JSON below into your agent's tool registry. Each tool maps to one API endpoint with its parameters described in JSON Schema format.
// Agent tool definitions — import as JSON [ { "name": "enrich_contact", "description": "Enrich a contact with data from 10+ sources", "parameters": { "type": "object", "properties": { "linkedin_url": { "type": "string", "description": "LinkedIn profile URL" }, "email": { "type": "string" }, "first_name": { "type": "string" }, "last_name": { "type": "string" }, "company": { "type": "string" } }, "required": ["linkedin_url"] }, "method": "POST", "endpoint": "https://api.abm.dev/v1/enrichments" }, { "name": "get_enrichment", "description": "Get the result of an enrichment by ID", "parameters": { "type": "object", "properties": { "id": { "type": "string", "description": "Enrichment job ID" } }, "required": ["id"] }, "method": "GET", "endpoint": "https://api.abm.dev/v1/enrichments/{id}" }, { "name": "stream_enrichment", "description": "Stream enrichment progress via SSE", "parameters": { "type": "object", "properties": { "id": { "type": "string", "description": "Enrichment job ID" } }, "required": ["id"] }, "method": "GET", "endpoint": "https://api.abm.dev/v1/enrichments/{id}/stream" }, { "name": "linkedin_profile", "description": "Research a LinkedIn profile", "parameters": { "type": "object", "properties": { "publicId": { "type": "string", "description": "LinkedIn public ID (from profile URL)" } }, "required": ["publicId"] }, "method": "GET", "endpoint": "https://api.abm.dev/v1/linkedin/profile/{publicId}" }, { "name": "linkedin_contact", "description": "Get contact info for a LinkedIn profile", "parameters": { "type": "object", "properties": { "publicId": { "type": "string", "description": "LinkedIn public ID" } }, "required": ["publicId"] }, "method": "GET", "endpoint": "https://api.abm.dev/v1/linkedin/profile/{publicId}/contact" }, { "name": "linkedin_send_message", "description": "Send a LinkedIn message to a prospect", "parameters": { "type": "object", "properties": { "linkedin_member_id": { "type": "string" }, "message": { "type": "string" }, "sender_member_id": { "type": "string" } }, "required": ["linkedin_member_id", "message", "sender_member_id"] }, "method": "POST", "endpoint": "https://api.abm.dev/v1/linkedin/messages" }, { "name": "linkedin_search_people", "description": "Search people on LinkedIn", "parameters": { "type": "object", "properties": { "keywords": { "type": "string", "description": "Search keywords" }, "sender_member_id": { "type": "string", "description": "LinkedIn member ID to search as" } }, "required": ["keywords", "sender_member_id"] }, "method": "GET", "endpoint": "https://api.abm.dev/v1/linkedin/search/people" }, { "name": "people_finder", "description": "Find decision-makers at a company (coming soon)", "parameters": { "type": "object", "properties": { "company": { "type": "string" }, "titles": { "type": "array", "items": { "type": "string" } } }, "required": ["company"] }, "method": "POST", "endpoint": "https://api.abm.dev/v1/people-finder" } ]
5. Enrichment Flow
Enrichments are asynchronous. Submit a job, optionally stream progress, then fetch the final result.
Submit the enrichment
POST /v1/enrichments // Response { "id": "enr_abc123", "status": "queued" }
Stream progress (optional)
GET /v1/enrichments/enr_abc123/stream // SSE events data: { "source": "clearbit", "status": "completed" } data: { "source": "apollo", "status": "completed" }
Fetch the final result
GET /v1/enrichments/enr_abc123 // Response — all enriched fields { "id": "enr_abc123", "status": "completed", "data": { ... } }
6. SSE Streaming
The stream endpoint delivers Server-Sent Events as each data source completes. Here is a Python example:
import sseclient import requests import json HEADERS = { "Authorization": "Bearer YOUR_API_KEY", "X-Org-ID": "your-org-id" } url = f"https://api.abm.dev/v1/enrichments/{job_id}/stream" response = requests.get(url, headers=HEADERS, stream=True) client = sseclient.SSEClient(response) for event in client.events(): data = json.loads(event.data) print(f"[{data['source']}] {data['status']}")
7. Error Handling
All errors follow a standard format:
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "linkedin_url is required"
}
}Common error codes your agent should handle:
| Code | Meaning |
|---|---|
| VALIDATION_ERROR | Missing or invalid request parameters |
| RATE_LIMITED | Too many requests — back off and retry |
| INSUFFICIENT_CREDITS | Not enough credits to complete the request |
| NOT_FOUND | The requested resource does not exist |
| LINKEDIN_SESSION_EXPIRED | The linked LinkedIn session needs to be re-authenticated |
8. Rate Limits
Rate limits are enforced per-org. When you exceed a limit, you will receive a RATE_LIMITED error. Check the response headers to pace your requests.
| Endpoint Group | Limit |
|---|---|
| Enrichment | 60 requests / min |
| LinkedIn research | 30 requests / min |
| LinkedIn messaging | 10 requests / min |
Rate limit headers included on every response:
RateLimit-Limit: 60 RateLimit-Remaining: 58 RateLimit-Reset: 1690000000
9. Credits
Each action costs a fixed number of credits, deducted when the request completes.
| Action | Cost |
|---|---|
| Person enrichment | 1 credit |
| Company enrichment | 1 credit |
| LinkedIn research | 0 credits (included) |
| LinkedIn messaging | 0 credits (included) |
Need the full OpenAPI spec? Download /openapi.json or import tool definitions directly from /agent-tools.json.