Clients
Create, read, update, and archive the clients (businesses) in your agency.
Returns a page of your agency's clients, most recently created first. All filters are optional and combine together (a client must match all of them); to page through more results, pass the returned nextCursor back in.
List / search clients
/api/v1/clients{
"data": {
"clients": [
{
"id": "cli_123",
"businessName": "Acme Dental",
"industry": "Dental",
"status": "complete",
"goal": "get_reviews",
"healthScore": 82,
"locationCount": 1,
"googleRating": 4.8,
"googleReviewCount": 26,
"archived": false,
"archivedAt": null,
"scheduledArchiveAt": null,
"packageType": null,
"planName": null,
"createdAt": "2026-01-15T10:00:00.000Z",
"primaryRepresentative": {
"id": "usr_123",
"firstName": "Jamie",
"lastName": "Lee",
"email": "jamie@youragency.com"
}
}
],
"nextCursor": null,
"total": 1
}
}Creates a new client in your agency, plus a first location when address details resolve to a real place.
Create a client
/api/v1/clients{
"data": {
"client": {
"id": "cli_123",
"businessName": "Acme Dental",
"website": null,
"industry": null,
"primaryContactEmail": "owner@acmedental.com",
"primaryRepresentativeId": "usr_123",
"visibility": "public",
"goal": null,
"notes": null,
"gbpLink": null,
"trackingKeyword": null,
"healthScore": null,
"planName": null,
"archived": false,
"archivedAt": null,
"scheduledArchiveAt": null,
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z"
},
"locationId": "loc_456",
"locationSkipped": null
}
}Returns full details for one client: business profile, assigned representative, creator, health score, and plan.
Get a client
/api/v1/clients/{id}{
"data": {
"id": "cli_123",
"businessName": "Acme Dental",
"website": "https://acmedental.com",
"industry": "Dental",
"primaryContactEmail": "owner@acmedental.com",
"primaryRepresentativeId": "usr_123",
"visibility": "public",
"goal": "get_reviews",
"notes": null,
"gbpLink": null,
"trackingKeyword": "dentist near me",
"healthScore": 82,
"planName": null,
"archived": false,
"archivedAt": null,
"scheduledArchiveAt": null,
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z",
"primaryRepresentative": {
"id": "usr_123",
"firstName": "Jamie",
"lastName": "Lee",
"email": "jamie@youragency.com"
},
"createdBy": {
"id": "usr_123",
"firstName": "Jamie",
"lastName": "Lee",
"email": "jamie@youragency.com"
},
"clientPlan": null
}
}Edits an existing client's editable fields. Pass only the fields you want to change. The client's primaryContactEmail (their portal login) can only be set here while it's still blank — it can never be changed once set.
Update a client
/api/v1/clients/{id}{
"data": {
"id": "cli_123",
"businessName": "Acme Dental",
"website": "https://acmedental.com",
"industry": "Dental",
"primaryContactEmail": "owner@acmedental.com",
"primaryRepresentativeId": "usr_123",
"visibility": "public",
"goal": "get_reviews",
"notes": null,
"gbpLink": null,
"trackingKeyword": "dentist near me",
"healthScore": 82,
"planName": null,
"archived": false,
"archivedAt": null,
"scheduledArchiveAt": null,
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-02-01T09:30:00.000Z"
}
}Requests archival of a client — this API never permanently deletes one. If the client has any locations this SCHEDULES it: the client and every one of its locations archive at the end of the current billing period, and until then everything stays fully active and billed — the archival can be called off with the cancel-archive endpoint. A client with no locations at all is archived immediately instead (there's nothing to defer). The response's outcome field says which of the two actually happened.
Archive a client
/api/v1/clients/{id}{
"data": {
"outcome": "scheduled",
"clientId": "cli_123",
"businessName": "Acme Dental",
"scheduledArchiveAt": "2026-02-01T00:00:00.000Z",
"archiveAt": "2026-03-01T00:00:00.000Z",
"locationCount": 1
}
}Calls off a pending client archival, so a client scheduled to archive at the end of the billing period carries on as normal. Also releases the locations that were scheduled along with it. Only works while the archival is still pending — a client already fully archived has to be reactivated instead, via the reactivate endpoint.
Cancel a scheduled archival
/api/v1/clients/{id}/cancel-archive{
"data": {
"cancelled": true,
"locationsReleased": 1
}
}Sends (or resends) the customer-portal invite email to a client's primary contact — a passwordless magic link. Resending invalidates any previously sent link. Fails if the client has no primaryContactEmail set.
Send the client-portal invite
/api/v1/clients/{id}/invite{
"data": {
"portalLink": "https://portal.synup.com/invite/aB3dE9fGhJ"
}
}Restores an already-archived client, and every location that archived along with it. A client that isn't currently archived is a no-op success, not an error. This is the only way back for a client with outcome archived — one that's still scheduled should go through cancel-archive instead.
Reactivate an archived client
/api/v1/clients/{id}/reactivate{
"data": {
"archived": false,
"locationsArchived": 1,
"locationsFailed": 0,
"cancelledScheduledPosts": 0
}
}Returns a rolled-up snapshot for one client: aggregate location, review, and SEO stats.
Get client summary
/api/v1/clients/summary{
"data": {
"locations": {
"total": 1,
"byStatus": {
"approved": 1
},
"byVerification": {
"unknown": 1
}
},
"reviews": {
"avgRating": 4.8,
"total": 26
},
"seo": {
"avgRank": 3.2,
"top3Pct": 0.62
}
}
}