REST API Overview
Score CRM has a real-time API for creating and updating contacts from your own backend, landing pages, or CRM — the moment something happens, instead of waiting for a CSV export.
https://api.scorehq.co
This is a separate host from your dashboard (app.scorehq.co or wherever you log in). It's built specifically for server-to-server traffic — every request is authenticated with an API key, never a user session, and it's designed to be called from your backend, not from a browser.
What it's for
The API exposes two endpoints for the same create-or-update operation, differing only in how many contacts one request carries:
| Endpoint | Use for |
|---|---|
POST /api/v2/contacts | One contact per call — the common case for real-time sync. Returns a real HTTP status (201/200/409/etc.) for that one outcome. |
POST /api/v2/contacts/batch | Up to 50 contacts per call. Always returns 200, with a per-contact result inside results[], since a batch's outcomes can't collapse into one status code. |
Use either one whenever something happens in your own systems that should be reflected in Score right away — a signup, a plan change, a form submission — without you having to batch it into a CSV later.
| Use this API for... | Use CSV import for... |
|---|---|
| Real-time sync as events happen (signups, form fills, status changes) | One-time or periodic bulk imports of existing contact lists |
| Small, frequent updates (one contact, or a handful at a time) | Large historical imports (thousands of rows at once) |
| Keeping Score in sync with a system of record you already have | Migrating from another platform |
If you're integrating for the first time, read Authentication next to get your API key, then Create or Update a Contact (one at a time) or Sync a Contact Batch (up to 50) for the actual request/response shapes.
What you can do today
- Create a new contact and add them to one or more lists.
- Update an existing contact's fields — but only if you explicitly say so (see
overwritein the Create or Update a Contact guide). Nothing is ever overwritten by accident. - Add an existing contact to additional lists, which can enroll them in any journey that's watching for new members on that list.
- Send up to 50 contacts in a single request to the batch endpoint, with a per-contact result for each one.
What it doesn't do (by design)
- It can't re-subscribe someone. If a contact has bounced, complained, or unsubscribed, this API can still update their name, phone, or custom fields — but it will never restore their ability to receive email. That protection can't be bypassed from either endpoint.
- It never removes a contact from a list. This API only adds — removing list membership isn't something it does.
- It's not built for bulk historical imports. Batches are capped at 50 contacts per request. For a one-time import of your existing contact base, use CSV import instead.
What's next
- Authentication — how to get and use your API key
- Rate Limits & Retries — how many requests you can make, and how to handle being throttled
- Create or Update a Contact — single-contact endpoint, full request/response reference
- Sync a Contact Batch — batch endpoint, full request/response reference
- Error Codes — every error you might see, and what to do about it