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/me | Who the token belongs to |
| GET | /api/v1/contacts | List or search contacts. ?q= &limit= &cursor= &updatedSince= |
| POST | /api/v1/contacts | Create a contact (groups and custom fields included) |
| GET | /api/v1/contacts/:id | One contact with relationship health, groups and custom fields |
| PATCH | /api/v1/contacts/:id | Update fields, groups or custom fields |
| DELETE | /api/v1/contacts/:id | Delete a contact |
| GET | /api/v1/contacts/:id/interactions | That contact's logged touchpoints |
| POST | /api/v1/contacts/:id/interactions | Log a call, email, meeting or note (moves last-contacted) |
| GET | /api/v1/reminders | Reminders. ?status=open|done|all &contactId= |
| POST | /api/v1/reminders | Create a reminder, optionally repeating |
| PATCH | /api/v1/reminders/:id | Complete or edit one (a repeating reminder rolls forward) |
| DELETE | /api/v1/reminders/:id | Delete a reminder |
| GET | /api/v1/events | Calendar 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.created | A contact was added, by you or by a sync |
contact.updated | Any field, group or custom field changed |
contact.deleted | A contact was removed |
interaction.logged | A touchpoint was logged against a contact |
reminder.created | A reminder was created |
reminder.completed | A 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
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.
120 requests per minute per token. Over that you get HTTP 429 with a retry-after header.
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.
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.
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.