Skip to main content

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:

EndpointUse for
POST /api/v2/contactsOne 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/batchUp 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 haveMigrating from another platform
Start here

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 overwrite in 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