Skip to main content
← Resources
Reference

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.dev

3. Core Endpoints

These are the endpoints your agent will call most often.

MethodEndpointDescription
POST/v1/enrichmentsEnrich a contact
GET/v1/enrichments/{id}Get enrichment result
GET/v1/enrichments/{id}/streamSSE progress stream
GET/v1/linkedin/profile/{publicId}Research a LinkedIn profile
GET/v1/linkedin/profile/{publicId}/contactGet contact info
POST/v1/linkedin/messagesSend LinkedIn message
GET/v1/linkedin/search/peopleSearch people on LinkedIn
POST/v1/people-finderFind 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.

1

Submit the enrichment

POST /v1/enrichments

// Response
{ "id": "enr_abc123", "status": "queued" }
2

Stream progress (optional)

GET /v1/enrichments/enr_abc123/stream

// SSE events
data: { "source": "clearbit", "status": "completed" }
data: { "source": "apollo", "status": "completed" }
3

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:

CodeMeaning
VALIDATION_ERRORMissing or invalid request parameters
RATE_LIMITEDToo many requests — back off and retry
INSUFFICIENT_CREDITSNot enough credits to complete the request
NOT_FOUNDThe requested resource does not exist
LINKEDIN_SESSION_EXPIREDThe 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 GroupLimit
Enrichment60 requests / min
LinkedIn research30 requests / min
LinkedIn messaging10 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.

ActionCost
Person enrichment1 credit
Company enrichment1 credit
LinkedIn research0 credits (included)
LinkedIn messaging0 credits (included)

Need the full OpenAPI spec? Download /openapi.json or import tool definitions directly from /agent-tools.json.