API
API Overview
Programmatic access to everything the web app can do.
The PersonalCRM API gives you full programmatic access to your data: contacts, networks, pings, meetings and follow-ups. It is built for AI agents, scripts and integrations: everything you can do in the web app, you can do over HTTP.
Quick start
- In the app, go to Settings → API Keys → Create key and copy your key. It is shown exactly once.
- Call the API with the key as a Bearer token:
curl -H "Authorization: Bearer pcrm_..." \
https://personalcrm.me/api/v1/contactsReference
The full endpoint reference is generated from the code and always up to date:
- Interactive API reference: browse and try every endpoint
- OpenAPI spec: machine-readable, hand this to tools and agents
Endpoints at a glance
| Resource | Operations |
|---|---|
/api/v1/contacts | list, create, get, update, delete, photo upload |
/api/v1/networks | list, create, update, delete |
/api/v1/pings | list, create, delete |
/api/v1/follow-ups | list, create, update (incl. complete), delete |
/api/v1/meetings | list, create, get, update, delete (attendees included) |
/api/v1/me | get profile, update (name, timezone), delete account |
All list endpoints support page and pageSize (max 200), plus resource-specific filters:
- Contacts:
search,networkId,needsPing - Meetings:
contactId(attendee),search(name and location) - Pings:
contactId - Follow-ups:
contactId,completed
Contact photos
Photos live in a private bucket, so uploads and reads both use signed URLs:
POST /contacts/{id}/photo-uploadwith the file extension → returns a signeduploadUrland a storagepath.PUTthe raw image bytes (max 5MB, JPG/PNG/WebP) to thatuploadUrl, thenPATCH /contacts/{id}withphotoUrlset to the returnedpath.
On reads, photoUrl is a short-lived signed URL, not the stored path. Set
photoUrl: null to remove a photo.
Limits
- 120 requests per minute per key
- Request bodies up to 1 MB
- Validation rules match the web app exactly: same field lengths, same formats