Developers

Your CRM, with an API in front of it

Most personal CRMs are a closed box. A.R.O gives you a REST API over your own contacts, interactions, reminders and calendar, signed webhooks when something changes, and an MCP server so an AI assistant can work with the same data. Included on every plan, free one too.

Authentication

One bearer token per person, from Settings → API & webhooks. Send it on every request:

Authorization: Bearer YOUR_TOKEN

120 requests a minute. Responses are { data }; lists add nextCursor for cursor pagination. Errors are { error: { message } } with a normal HTTP status. All dates are ISO 8601.

Endpoints

GET/api/v1/meWho the token belongs to
GET/api/v1/contactsList or search contacts. ?q= &limit= &cursor= &updatedSince=
POST/api/v1/contactsCreate a contact (groups and custom fields included)
GET/api/v1/contacts/:idOne contact with relationship health, groups and custom fields
PATCH/api/v1/contacts/:idUpdate fields, groups or custom fields
DELETE/api/v1/contacts/:idDelete a contact
GET/api/v1/contacts/:id/interactionsThat contact's logged touchpoints
POST/api/v1/contacts/:id/interactionsLog a call, email, meeting or note (moves last-contacted)
GET/api/v1/remindersReminders. ?status=open|done|all &contactId=
POST/api/v1/remindersCreate a reminder, optionally repeating
PATCH/api/v1/reminders/:idComplete or edit one (a repeating reminder rolls forward)
DELETE/api/v1/reminders/:idDelete a reminder
GET/api/v1/eventsCalendar events in a window. ?from= &to=

A real request

curl "https://aro-pcrm.com/api/v1/contacts?limit=1" \
  -H "Authorization: Bearer YOUR_TOKEN"

{
  "data": [
    {
      "id": "clx8f2k9r0001",
      "firstName": "Sarah",
      "lastName": "Chen",
      "name": "Sarah Chen",
      "email": "sarah@example.com",
      "company": "Stripe",
      "jobTitle": "Product Manager",
      "cadenceDays": 60,
      "lastContactedAt": "2026-09-02T17:04:11.000Z",
      "health": { "tier": "cooling", "score": 42, "daysSinceContact": 71, "overdue": true },
      "groups": ["Work network"],
      "customFields": { "Stage": "Referred" },
      "url": "https://aro-pcrm.com/contacts/clx8f2k9r0001"
    }
  ],
  "nextCursor": "clx8f2k9r0001"
}

health is computed, not stored: the tier and score come from your keep-in-touch cadence and the last logged touchpoint, which is the part you would otherwise have to build yourself. Trimmed above — a contact also carries additional emails and phones, birthday, how you met, LinkedIn and website, notes, favourite and tracked flags, and timestamps.

Webhooks

Add an endpoint in Settings and A.R.O POSTs it a signed JSON envelope when something changes. Works with a Zapier Catch Hook, Make, n8n or your own server.

contact.createdA contact was added, by you or by a sync
contact.updatedAny field, group or custom field changed
contact.deletedA contact was removed
interaction.loggedA touchpoint was logged against a contact
reminder.createdA reminder was created
reminder.completedA reminder was ticked off
POST https://your-endpoint.example.com/aro
x-aro-event: interaction.logged
x-aro-delivery: evt_9f2c1a7b0e4d
x-aro-signature: sha256=<HMAC-SHA256 of the raw body, keyed with your secret>

{
  "id": "evt_9f2c1a7b0e4d",
  "event": "interaction.logged",
  "createdAt": "2026-10-27T14:03:02.118Z",
  "data": { "id": "clx…", "contactId": "clx…", "type": "coffee", "content": "Caught up about the new role", "occurredAt": "2026-10-27T14:00:00.000Z" }
}

Verifying the signature is optional but easy: HMAC-SHA256 the raw request body with the secret shown when you create the webhook. After 20 consecutive failures a webhook pauses itself rather than hammering a dead endpoint.

MCP (Claude and other assistants)

A.R.O runs a Model Context Protocol server, so an assistant can search your contacts, log an interaction, set a cadence, create reminders and pull the weekly brief without you leaving the chat. It authenticates as you with the same token. Setup lives in Settings → AI & connector.

Questions

How do I get a token?

Sign in and open Settings → API & webhooks. The same personal token works for the REST API, the browser extension and the Claude connector; you can regenerate it there at any time.

What are the rate limits?

120 requests per minute per token. Over that you get HTTP 429 with a retry-after header.

Is there a sandbox?

No separate sandbox. The free plan (unlimited contacts, no card) is the sandbox: create a second account if you want to test writes without touching your real network.

Can I use it from Claude or another AI assistant?

Yes. A.R.O ships an MCP server, so a client that speaks the Model Context Protocol can search contacts, log interactions, create reminders and pull a weekly brief as you. Connect it in Settings → AI & connector.

What happens to my data?

It stays yours. Contacts are never sold and never used to train models, and you can export everything (CSV or JSON) or delete the account at any time.

Get a token in two minutes

Free plan, unlimited contacts, no card. The API is on every plan.