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, notes and reminders. 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 → 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/notes | list, create, get, update, delete |
/api/v1/note-types | list, create, update, delete |
/api/v1/reminders | list, create, update (incl. complete), delete |
/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,needsContact - Notes:
contactId(tagged),noteTypeId,from,to(both YYYY-MM-DD, inclusive) - Reminders:
contactId(tagged),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