Contacts API
Every organization has one address book: each person once, whichever campaigns or channels they're in (Cold Email, LinkedIn and more). Read it, add to it, and mark people do not contact. Base URL: https://core.financialrebrand.com
Authentication
Send Authorization: Bearer <personal access token> — create one at API tokens with the contacts:read and, to change anything, contacts:write scopes. Every call names the organization with orgId; you must be a member of it.
Endpoints
GET /v1/contacts?orgId= | Contacts, ordered by id. Filter with tag, search (email, name, company) and do_not_contact=true|false; page with after=<next>, limit up to 500. |
GET /v1/contacts/:id?orgId= | One contact. |
POST /v1/contacts | Add or update up to 5,000 contacts (below). |
POST /v1/contacts/:id/do-not-contact | { "orgId": "…", "reason": "…" } — no channel reaches them again. |
Adding and updating
curl -X POST https://core.financialrebrand.com/v1/contacts \
-H "Authorization: Bearer …" -H "Content-Type: application/json" \
-d '{"orgId":"<org id>","source":{"kind":"api","label":"Trade show list"},"tags":["expo-2026"],
"contacts":[{"email":"jane@acme.com","firstName":"Jane","company":"Acme",
"linkedinUrl":"linkedin.com/in/jane-smith","phone":"(555) 123-4567"}]}'
200 {"ids":["3f0c…"],"created":1,"updated":0,"skippedDoNotContact":0}Each person is matched within your organization by email address, then LinkedIn profile, then source.kind + source.ref(your own id for them). A match is filled in: an empty field never erases what's stored, and the source is added to their history. ids lines up with the contacts you sent. Anyone marked do not contact is left untouched and gets null. Sending the same call twice changes nothing the second time.
Phone numbers are stored in international form (US numbers may leave off the +1). LinkedIn links are stored as https://www.linkedin.com/in/<name> however they were pasted.
Do not contact
Do not contact covers the whole organization: Cold Email, LinkedIn and every other channel skip that person. It is set when someone replies asking not to be contacted, when a team member marks them, or through this API, and only a person in the app can clear it. An unsubscribe link click is different — it stops that channel only.
From Claude or ChatGPT
The MCP server wraps these as contacts_list, contacts_get, contacts_upsert and contacts_mark_do_not_contact.