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/contactsAdd 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.