Dashly Docs

Clients

`/clients`

List clients

GET
/clients

One page of records, newest first unless you say otherwise, with the total count in meta so you know how far to paginate.

Required scope: clients:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Query Parameters

page?integer

1-based. meta.totalPages says how many there are.

Range1 <= value
Default1
per_page?integer

Rows per page. A value above 200 returns 400 - never a silent clamp.

Range1 <= value <= 200
Default50
sort?string

Prefix with - for descending. An undeclared sort returns 400.

Default"-createdAt"
Value in"createdAt""-createdAt""name""-name""status""-status"
q?string

Case-insensitive "contains", across: name, sector.

filter[status]?string

Exact match on status.

filter[sector]?string

Exact match on sector.

filter[lead]?string

false (the default) leaves out the organisations that only an unconverted lead knows; true lists only them. They join the directory when the lead converts.

Value in"true""false"

Response Body

The requested page.

application/json
  1. response
data*array<>
meta*
Example Request
curl -X GET 'https://api.usedashly.com/v1/clients'
Example Response
{  "data": [    {      "id": "string",      "name": "string",      "slug": "string",      "sector": "string",      "website": "string",      "linkedinUrl": "string",      "siren": "string",      "status": "string",      "locale": "fr",      "createdAt": "2019-08-24T14:15:22Z",      "customFields": {}    }  ],  "meta": {    "page": 0,    "perPage": 0,    "total": 0,    "totalPages": 0  }}

Create a client

POST
/clients

Links are given as the target's public id (clientId: "hsbftmp3f5"); the API resolves them server-side. Fields the database requires but the interface decides for you are filled in the same way here.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
name*string
Length1 <= length <= 200
slug?|null
sector?|null
website?|null
linkedinUrl?|null
siren?|null
status*string
Value in"prospect""active""inactive""lost"
locale?|null
customFields?
createdAt?string

When this actually happened, for an import. Past dates only; defaults to now. updatedAt follows it unless the body sets one.

Formatdate-time

Response Body

Created. The body is the new record, as a read would return it.

application/json
  1. response
data*
Example Request
curl -X POST 'https://api.usedashly.com/v1/clients' \  -H 'Content-Type: application/json' \  -d '{  "name": "string",  "status": "prospect"}'
Example Response
{  "data": {    "id": "string",    "name": "string",    "slug": "string",    "sector": "string",    "website": "string",    "linkedinUrl": "string",    "siren": "string",    "status": "string",    "locale": "fr",    "createdAt": "2019-08-24T14:15:22Z",    "customFields": {}  }}

Retrieve a client

GET
/clients/{id}

The full record, custom fields included when the resource carries them. A record from another agency is a 404, not a 403 - its existence is not ours to confirm.

Required scope: clients:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The record's public id (hsbftmp3f5), as returned in the id field. An internal UUID returns 404.

Response Body

Found.

application/json
  1. response
data*
Example Request
curl -X GET 'https://api.usedashly.com/v1/clients/string'
Example Response
{  "data": {    "id": "string",    "name": "string",    "slug": "string",    "sector": "string",    "website": "string",    "linkedinUrl": "string",    "siren": "string",    "status": "string",    "locale": "fr",    "createdAt": "2019-08-24T14:15:22Z",    "customFields": {}  }}

Update a client

PATCH
/clients/{id}

A partial update: only the fields you send change. One exception - customFields is replaced wholesale, not merged, so sending it with a single key clears the others. Read the record, merge, then write.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The record's public id (hsbftmp3f5), as returned in the id field. An internal UUID returns 404.

Request Body

application/json
  1. body
name?string
Length1 <= length <= 200
slug?|null
sector?|null
website?|null
linkedinUrl?|null
siren?|null
status?string
Value in"prospect""active""inactive""lost"
locale?|null
customFields?

Response Body

Updated. The body is the record as it now stands.

application/json
  1. response
data*
Example Request
curl -X PATCH 'https://api.usedashly.com/v1/clients/string' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "data": {    "id": "string",    "name": "string",    "slug": "string",    "sector": "string",    "website": "string",    "linkedinUrl": "string",    "siren": "string",    "status": "string",    "locale": "fr",    "createdAt": "2019-08-24T14:15:22Z",    "customFields": {}  }}

Delete a client

DELETE
/clients/{id}

Permanent. The audit log keeps the trace; the record does not come back.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The record's public id (hsbftmp3f5), as returned in the id field. An internal UUID returns 404.

Response Body

Deleted. Empty body.

Example Request
curl -X DELETE 'https://api.usedashly.com/v1/clients/string'
Example Response
Empty

List available actions

GET
/clients/actions

Every verb this resource answers to, with its target and the JSON Schema of its body - the same contracts this document describes, readable at runtime.

Required scope: clients:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Response Body

The available verbs.

application/json
  1. response
data*array<>
Example Request
curl -X GET 'https://api.usedashly.com/v1/clients/actions'
Example Response
{  "data": [    {      "name": "string",      "label": "string",      "description": "string",      "target": "item",      "readOnly": true,      "path": "string",      "input": {}    }  ]}

Pin a quick access

POST
/clients/{id}/actions/add-portal-highlight

Pins a highlighted link ("Quick access") to the home page of this client's portal.

Does what the dashboard's addPortalHighlightAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
label*string
Length1 <= length <= 80
url*string
Formaturi
Lengthlength <= 500

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/add-portal-highlight' \  -H 'Content-Type: application/json' \  -d '{  "label": "string",  "url": "http://example.com"}'
Example Response
{  "data": null}

Remove a quick access

POST
/clients/{id}/actions/remove-portal-highlight

Removes the pinned link pointing at this URL from the client's portal home. If several point there under different names, pass label to say which.

Does what the dashboard's deletePortalHighlightAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
url*string
Formaturi
Lengthlength <= 500
label?string
Length1 <= length <= 80

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/remove-portal-highlight' \  -H 'Content-Type: application/json' \  -d '{  "url": "http://example.com"}'
Example Response
{  "data": null}

Set a portal permission

POST
/clients/{id}/actions/set-portal-permission

Grants or removes a portal permission for one of the client's members, identified by e-mail. If the state you ask for matches their role's preset, the exception is lifted and the member inherits from the role again.

Does what the dashboard's setMemberPortalPermissionAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
email*string
Match^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
Formatemail
Lengthlength <= 200
permissionKey*string
Value in"billing.read""docs.read""forfaits.read""reports.read""decks.read""tickets.create""portal.docs.create""portal.deals.read""portal.geo.manage""chat.write"
allowed*boolean

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/set-portal-permission' \  -H 'Content-Type: application/json' \  -d '{  "email": "user@example.com",  "permissionKey": "billing.read",  "allowed": true}'
Example Response
{  "data": null}
GET
/clients/{id}/actions/portal-members

The people of the client's portal and the pending invitations, each with standing: invited (invitation pending), activated (in the space, never signed in) or signed_in (signed in at least once), plus the role, since (invitation sent or access granted), and the first and latest sign-in. Read-only.

Reads the same data as the in-app listPortalMemberActivity - same implementation. Changes nothing; also answers GET with the same fields as query parameters.

Required scope: clients:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Response Body

The figures.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X GET 'https://api.usedashly.com/v1/clients/string/actions/portal-members'
Example Response
{  "data": null}
POST
/clients/{id}/actions/portal-members

The people of the client's portal and the pending invitations, each with standing: invited (invitation pending), activated (in the space, never signed in) or signed_in (signed in at least once), plus the role, since (invitation sent or access granted), and the first and latest sign-in. Read-only.

Reads the same data as the in-app listPortalMemberActivity - same implementation. Changes nothing; also answers GET with the same fields as query parameters.

Required scope: clients:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/portal-members' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "data": null}
POST
/clients/{id}/actions/set-portal-role

Makes one of the client's portal members an admin or a plain member, identified by e-mail. An admin may invite colleagues into the client's space. Demoting the space's last admin needs replacementEmail: another member, made admin first.

Does what the dashboard's setPortalMemberRoleAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
email*string
Match^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
Formatemail
Lengthlength <= 200
replacementEmail?string
Match^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
Formatemail
Lengthlength <= 200
role*string
Value in"client_member""client_admin"

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/set-portal-role' \  -H 'Content-Type: application/json' \  -d '{  "email": "user@example.com",  "role": "client_member"}'
Example Response
{  "data": null}

Remove a portal member

POST
/clients/{id}/actions/remove-portal-member

Takes one of the client's portal members out of the client's space, identified by e-mail. Their login and their person record stay; they can be invited again. Removing the space's last admin needs replacementEmail: another member, made admin first.

Does what the dashboard's removePortalMemberAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
email*string
Match^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
Formatemail
Lengthlength <= 200
replacementEmail?string
Match^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
Formatemail
Lengthlength <= 200

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/remove-portal-member' \  -H 'Content-Type: application/json' \  -d '{  "email": "user@example.com"}'
Example Response
{  "data": null}
POST
/clients/{id}/actions/submit-onboarding

Submits the onboarding this client filled in for the agency to review. Refused while a required step is still outstanding, so it never stands in for the client's own work. Pass projectId when several onboardings are open.

Does what the dashboard's submitOnboardingAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
projectId?string
Length1 <= length

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/submit-onboarding' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "data": null}

Approve the onboarding

POST
/clients/{id}/actions/validate-onboarding

Approves the onboarding this client submitted and opens their portal. Pass projectId when several onboardings are open.

Does what the dashboard's validateOnboardingAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
projectId?string
Length1 <= length

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/validate-onboarding' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "data": null}
POST
/clients/{id}/actions/request-onboarding-changes

Sends the submitted onboarding back to the client with a note explaining what needs adjusting. Pass projectId when several onboardings are open.

Does what the dashboard's requestOnboardingChangesAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
projectId?string
Length1 <= length
note*string
Length1 <= length <= 2000

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/request-onboarding-changes' \  -H 'Content-Type: application/json' \  -d '{  "note": "string"}'
Example Response
{  "data": null}

Cancel the onboarding

POST
/clients/{id}/actions/cancel-onboarding

Cancels this client's onboarding, unlocking their portal without approving it. Pass projectId when several onboardings are open.

Does what the dashboard's cancelOnboardingAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
projectId?string
Length1 <= length
note?string
Lengthlength <= 2000

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/cancel-onboarding' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "data": null}
POST
/clients/{id}/actions/link-drive-folder

Links a Google Drive folder to the client, by URL or folder id, after checking it exists through the Drive API. Replaces any previously linked folder, and stays hidden from the portal by default.

Does what the dashboard's linkDriveFolderAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
folder*string
Length1 <= length <= 2000
clientVisible?boolean

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/link-drive-folder' \  -H 'Content-Type: application/json' \  -d '{  "folder": "string"}'
Example Response
{  "data": null}
POST
/clients/{id}/actions/set-drive-visibility

Shows (clientVisible: true) or hides (false) the linked Drive folder in the client's portal.

Does what the dashboard's toggleDriveVisibilityAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
clientVisible*boolean

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/set-drive-visibility' \  -H 'Content-Type: application/json' \  -d '{  "clientVisible": true}'
Example Response
{  "data": null}
POST
/clients/{id}/actions/unlink-drive-folder

Removes the link between the client and their Google Drive folder. The folder itself is untouched.

Does what the dashboard's unlinkDriveFolderAction does - same implementation, so the two cannot diverge. Takes no body.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/unlink-drive-folder'
Example Response
{  "data": null}

Start a crawl

POST
/clients/{id}/actions/start-crawl

Starts crawling this client's website (the sitemap tool). Requires a plan with SEO (Pro and above, trials included); capped at 2,000 pages per crawl, counted against the monthly allowance. The job is queued and runs in the background.

Does what the dashboard's startCrawlAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
url*string
Length1 <= length <= 2000

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/start-crawl' \  -H 'Content-Type: application/json' \  -d '{  "url": "string"}'
Example Response
{  "data": null}

Cancel the running crawl

POST
/clients/{id}/actions/cancel-crawl

Stops the running or queued crawl for this client. Pages already explored are kept.

Does what the dashboard's cancelCrawlAction does - same implementation, so the two cannot diverge. Takes no body.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/cancel-crawl'
Example Response
{  "data": null}

Schedule the monthly re-crawl

Deprecated
POST
/clients/{id}/actions/set-crawl-schedule

Turns the automatic monthly re-crawl of this client's site on (monthly) or off (off), keeping the day and slot of the client's crawl schedule. Deprecated: set-collection-schedule with kind: crawl sets the whole schedule (frequency, day, slot).

Does what the dashboard's setClientCollectionScheduleAction does - same implementation, so the two cannot diverge.

Deprecated, removed on 2027-05-01: POST /v1/clients/{id}/actions/set-collection-schedule with kind: crawl

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
schedule*string
Value in"off""monthly"

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/set-crawl-schedule' \  -H 'Content-Type: application/json' \  -d '{  "schedule": "off"}'
Example Response
{  "data": null}
GET
/clients/{id}/actions/collection-schedule

Per kind (geo, rank, crawl): where the client's schedule comes from (source: client exception, agency default or house default), the exception, the inherited schedule, and next — the slot the next run is really placed in (assigned, later than requested when that slot is full; placement: theoretical when the client is not collected today, e.g. the module is off). Null next = never. Read-only.

Reads the same data as the in-app getClientPlanning - same implementation. Changes nothing; also answers GET with the same fields as query parameters.

Required scope: clients:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Response Body

The figures.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X GET 'https://api.usedashly.com/v1/clients/string/actions/collection-schedule'
Example Response
{  "data": null}
POST
/clients/{id}/actions/collection-schedule

Per kind (geo, rank, crawl): where the client's schedule comes from (source: client exception, agency default or house default), the exception, the inherited schedule, and next — the slot the next run is really placed in (assigned, later than requested when that slot is full; placement: theoretical when the client is not collected today, e.g. the module is off). Null next = never. Read-only.

Reads the same data as the in-app getClientPlanning - same implementation. Changes nothing; also answers GET with the same fields as query parameters.

Required scope: clients:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/collection-schedule' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "data": null}
POST
/clients/{id}/actions/set-collection-schedule

Gives this client its own schedule for one kind, instead of the agency's default: kind (geo, rank or crawl), frequency (daily, weekly, monthly or off), weekday (1 = Monday … 7, read when weekly), monthDay (1-28, read when monthly) and slotHour (0, 6, 12 or 18, in the agency's time zone).

Does what the dashboard's setClientCollectionScheduleAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
kind*string
Value in"geo""rank""crawl"
frequency*string
Value in"daily""weekly""monthly""off"
weekday?integer
Range1 <= value <= 7
Default1
monthDay?integer
Range1 <= value <= 28
Default1
slotHour*|

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/set-collection-schedule' \  -H 'Content-Type: application/json' \  -d '{  "kind": "geo",  "frequency": "daily",  "slotHour": 0}'
Example Response
{  "data": null}
POST
/clients/{id}/actions/clear-collection-schedule

Removes this client's own schedule for one kind (geo, rank or crawl): it follows the agency's default again. cleared is false when it had none.

Does what the dashboard's clearClientCollectionScheduleAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
kind*string
Value in"geo""rank""crawl"

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/clear-collection-schedule' \  -H 'Content-Type: application/json' \  -d '{  "kind": "geo"}'
Example Response
{  "data": null}

Add an internal note

POST
/clients/{id}/actions/add-note

Writes an internal note on this client's record, optionally attached to one of their deals. Never visible to the client.

Does what the dashboard's addAccountNoteAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
body*string
Length1 <= length <= 4000
dealId?string
Length1 <= length

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/add-note' \  -H 'Content-Type: application/json' \  -d '{  "body": "string"}'
Example Response
{  "data": null}
GET
/clients/{id}/actions/services

The third-party services this client runs on (Webflow, Vercel, Stripe…), as followed by the agency: catalogue id, the agency's note, whether the client's portal shows it, and the names of the client's projects whose stack uses it. Read-only.

Reads the same data as the in-app listAccountServices - same implementation. Changes nothing; also answers GET with the same fields as query parameters.

Required scope: clients:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Response Body

The figures.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X GET 'https://api.usedashly.com/v1/clients/string/actions/services'
Example Response
{  "data": null}
POST
/clients/{id}/actions/services

The third-party services this client runs on (Webflow, Vercel, Stripe…), as followed by the agency: catalogue id, the agency's note, whether the client's portal shows it, and the names of the client's projects whose stack uses it. Read-only.

Reads the same data as the in-app listAccountServices - same implementation. Changes nothing; also answers GET with the same fields as query parameters.

Required scope: clients:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/services' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "data": null}
POST
/clients/{id}/actions/add-service

Adds a catalogue service to the client's services (visible on their portal by default). Adding one already followed changes nothing. Answers the client's services.

Does what the dashboard's addAccountServiceAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
serviceId*string

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/add-service' \  -H 'Content-Type: application/json' \  -d '{  "serviceId": "string"}'
Example Response
{  "data": null}
POST
/clients/{id}/actions/update-service

Sets the agency's note on a service the client follows and whether their portal shows it. A field left out keeps its value. 404 when the client does not follow that service.

Does what the dashboard's updateAccountServiceAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
serviceId*string
note?|null
clientVisible?boolean

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/update-service' \  -H 'Content-Type: application/json' \  -d '{  "serviceId": "string"}'
Example Response
{  "data": null}
POST
/clients/{id}/actions/remove-service

Removes a service from the client's services, and from the stack of every project of this client. 404 when the client does not follow it.

Does what the dashboard's removeAccountServiceAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
serviceId*string

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/remove-service' \  -H 'Content-Type: application/json' \  -d '{  "serviceId": "string"}'
Example Response
{  "data": null}

Start offboarding

POST
/clients/{id}/actions/start-offboarding

Opens an offboarding for this client and creates the default end-of-contract checklist.

Does what the dashboard's startOffboardingAction does - same implementation, so the two cannot diverge. Takes no body.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/start-offboarding'
Example Response
{  "data": null}
POST
/clients/{id}/actions/toggle-offboarding-step

Marks a step of the offboarding checklist as done (done: true) or not, addressed by its zero-based position.

Does what the dashboard's toggleOffboardingStepAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
position*integer
Range0 <= value <= 9007199254740991
done*boolean

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/toggle-offboarding-step' \  -H 'Content-Type: application/json' \  -d '{  "position": 0,  "done": true}'
Example Response
{  "data": null}

Cancel the offboarding

POST
/clients/{id}/actions/cancel-offboarding

Cancels this client's offboarding. The checklist is abandoned.

Does what the dashboard's cancelOffboardingAction does - same implementation, so the two cannot diverge. Takes no body.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/cancel-offboarding'
Example Response
{  "data": null}

Complete the offboarding

POST
/clients/{id}/actions/complete-offboarding

Completes this client's offboarding: archives the account and sends the farewell e-mail, carrying the agency's review links, to their portal users.

Does what the dashboard's completeOffboardingAction does - same implementation, so the two cannot diverge. Takes no body.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/complete-offboarding'
Example Response
{  "data": null}

Request an NPS rating

POST
/clients/{id}/actions/request-nps

Invites this client's portal users to leave an NPS rating, by in-app notification and e-mail according to their preferences.

Does what the dashboard's requestNpsAction does - same implementation, so the two cannot diverge. Takes no body.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/request-nps'
Example Response
{  "data": null}

Withdraw the NPS request

POST
/clients/{id}/actions/withdraw-nps

Takes the review card off this client's portal home again. A rating already given stays.

Does what the dashboard's withdrawNpsAction does - same implementation, so the two cannot diverge. Takes no body.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/withdraw-nps'
Example Response
{  "data": null}

Propose a suggestion

POST
/clients/{id}/actions/propose-suggestion

Proposes an improvement on this client's portal - title, pitch, effort, benefit, optionally a linked project - and notifies their users. The client accepts or declines from their portal.

Does what the dashboard's createSuggestionAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
title*string
Length2 <= length <= 160
description?string
Lengthlength <= 2000
effort?string
Lengthlength <= 80
benefit?string
Lengthlength <= 300
projectId?string
Length1 <= length

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/propose-suggestion' \  -H 'Content-Type: application/json' \  -d '{  "title": "string"}'
Example Response
{  "data": null}

Sync the connectors

POST
/clients/{id}/actions/sync-connectors

Immediately re-runs the capture for every active connection of this client. The response lists which connectors were captured and which failed - each connection fails on its own.

Does what the dashboard's refreshAccountConnectionsAction does - same implementation, so the two cannot diverge. Takes no body.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/sync-connectors'
Example Response
{  "data": null}

Import a CSV

POST
/clients/actions/import-csv

Imports clients, contacts, leads or deals (type) from CSV text (headers on the first line; , ; tab or | separated, guessed from the file) with a column-to-field mapping (field key → CSV header; the agency's custom fields as cf:<key>). At most 5 000 rows: past it the whole file is refused (too_many_rows). dryRun: true checks the file and writes nothing. Rows matching an existing record (client name; person e-mail, else name in the client; lead e-mail, else organisation and person; deal name and organisation) or an earlier row are skipped as duplicate unless allowDuplicates: true. Invalid rows are skipped and itemised (imported / skipped / errors, at most 50). Each error carries the sheet row (header = row 1), a stable code (required, too_long, invalid_email, invalid_value, account_not_found, duplicate, too_many_rows), the values that explain it (field, max, value) and an English reason. For contacts, the account column must match the exact name of an existing client; for leads, an organisation the agency has is linked, otherwise kept as the lead's company; for deals, an unknown organisation is created as a prospect. createdAt keeps the record's original creation date (ISO 8601 or day-first dd/mm/yyyy). A decorative value never skips its row: a phone stored in E.164 or dropped (phone_dropped), an unreadable date, status, source, stage, amount or custom-field value dropped (value_ignored), listed in warnings (at most 50). Leads and deals are attributed to the key's issuer.

Does what the dashboard's importCsvAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
type*string
Value in"clients""contacts""leads""deals"
csv*string
Length1 <= length <= 2000000
mapping*
dryRun?boolean
Defaultfalse
allowDuplicates?boolean
Defaultfalse

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/actions/import-csv' \  -H 'Content-Type: application/json' \  -d '{  "type": "clients",  "csv": "string",  "mapping": {    "property1": "string",    "property2": "string"  }}'
Example Response
{  "data": null}
POST
/clients/{id}/actions/link-object

Creates a relation between this record and a target object (targetType plus the target's public targetId) in the relation graph. Linking the same pair twice does nothing.

Does what the dashboard's linkObjectAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
targetType*string
Value in"account""contact""project""ticket""deal""user""proposal"
targetId*string
Length1 <= length <= 60

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/link-object' \  -H 'Content-Type: application/json' \  -d '{  "targetType": "account",  "targetId": "string"}'
Example Response
{  "data": null}
POST
/clients/{id}/actions/unlink-object

Removes the relation between this record and the target object in the relation graph. Unlinking a pair that was never linked does nothing. A deal/project pair is unlinked like unlink-project on the deal: the change is audited, so the key must be attached to a user (403 with reason key_not_attached otherwise).

Does what the dashboard's unlinkObjectAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
targetType*string
Value in"account""contact""project""ticket""deal""user""proposal"
targetId*string
Length1 <= length <= 60

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/unlink-object' \  -H 'Content-Type: application/json' \  -d '{  "targetType": "account",  "targetId": "string"}'
Example Response
{  "data": null}
POST
/clients/{id}/actions/set-manager

Assigns this client to the agency member who looks after it, named by its id from /v1/members. null clears the assignment.

Does what the dashboard's setAccountManagerAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
managerId*|null

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/set-manager' \  -H 'Content-Type: application/json' \  -d '{  "managerId": "string"}'
Example Response
{  "data": null}

Assign the team

Deprecated
POST
/clients/{id}/actions/set-team

Assigns this client to the team that carries it, named by its id from /v1/teams. null clears the assignment.

Does what the dashboard's setAccountTeamAction does - same implementation, so the two cannot diverge.

Deprecated, removed on 2027-04-09: teams belong to projects now; set them on each project (dashboard project header).

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
teamId*|null

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/set-team' \  -H 'Content-Type: application/json' \  -d '{  "teamId": "string"}'
Example Response
{  "data": null}
POST
/clients/{id}/actions/set-logo

Stores the client's logo as a data URI (PNG, JPEG or WebP, already resized). null removes the logo.

Does what the dashboard's setAccountLogoAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
logo*|null

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/set-logo' \  -H 'Content-Type: application/json' \  -d '{  "logo": "string"}'
Example Response
{  "data": null}
POST
/clients/actions/set-overview-layout

Sets, for the whole agency, which rows appear in the overview panel of a client record and in what order. Each entry is a built-in key (sector, status, website, siren, since, hours, openTickets, activeProjects, openDeals, contacts, lastActivity) or field:<key> for a client custom field. Unknown rows are ignored; an empty list restores the default.

Does what the dashboard's saveClientOverviewAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
rows*array<>
Itemsitems <= 40

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/actions/set-overview-layout' \  -H 'Content-Type: application/json' \  -d '{  "rows": [    "string"  ]}'
Example Response
{  "data": null}
POST
/clients/{id}/actions/set-weekly-bilan

Turns the client's weekly summary (done this week, in progress, left to do, what's next) on or off (enabled). When on, it is posted every Monday to the client's Slack channel if one is linked and Slack is connected, otherwise it is added to the Monday recap email of the client's subscribed portal contacts. 409 weekly_bilan_not_installed until the feature's migration is applied.

Does what the dashboard's setClientBilanAction does - same implementation, so the two cannot diverge.

Required scope: clients:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
enabled*boolean

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/set-weekly-bilan' \  -H 'Content-Type: application/json' \  -d '{  "enabled": true}'
Example Response
{  "data": null}

Client weekly summary

GET
/clients/{id}/actions/weekly-bilan

The client's weekly summary as the agency sees it: whether it is on (enabled, installed), where it goes (route: off, slack or email), the linked Slack channel, the last Slack post, and a preview built from the client's current work (done, inProgress, toDo, next, each with total and up to 8 items).

Reads the same data as the in-app AccountWeeklyBilanSection - same implementation. Changes nothing; also answers GET with the same fields as query parameters. Takes no body.

Required scope: clients:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Response Body

The figures.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X GET 'https://api.usedashly.com/v1/clients/string/actions/weekly-bilan'
Example Response
{  "data": null}

Client weekly summary

POST
/clients/{id}/actions/weekly-bilan

The client's weekly summary as the agency sees it: whether it is on (enabled, installed), where it goes (route: off, slack or email), the linked Slack channel, the last Slack post, and a preview built from the client's current work (done, inProgress, toDo, next, each with total and up to 8 items).

Reads the same data as the in-app AccountWeeklyBilanSection - same implementation. Changes nothing; also answers GET with the same fields as query parameters. Takes no body.

Required scope: clients:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/weekly-bilan'
Example Response
{  "data": null}

Client site statistics

GET
/clients/{id}/actions/site-statistics

The client's site statistics from every connected source (Search Console, GA4, Ahrefs, Ads...) over a period - days (28 by default, ending on the last consolidated day, about three days ago) or from/to - with, per source, the totals, the totals of the previous period of the same length, the daily series and the top rows per dimension (queries, pages, channels...), plus the portal's highlights: headline KPIs with their change, and the pages that moved most. Rates (ctr) are 0..1.

Reads the same data as the in-app client_analytics - same implementation. Changes nothing; also answers GET with the same fields as query parameters.

Required scope: clients:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Query Parameters

days?integer
Range2 <= value <= 365
from?string
Match^\d{4}-\d{2}-\d{2}$
to?string
Match^\d{4}-\d{2}-\d{2}$

Response Body

The figures.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X GET 'https://api.usedashly.com/v1/clients/string/actions/site-statistics'
Example Response
{  "data": null}

Client site statistics

POST
/clients/{id}/actions/site-statistics

The client's site statistics from every connected source (Search Console, GA4, Ahrefs, Ads...) over a period - days (28 by default, ending on the last consolidated day, about three days ago) or from/to - with, per source, the totals, the totals of the previous period of the same length, the daily series and the top rows per dimension (queries, pages, channels...), plus the portal's highlights: headline KPIs with their change, and the pages that moved most. Rates (ctr) are 0..1.

Reads the same data as the in-app client_analytics - same implementation. Changes nothing; also answers GET with the same fields as query parameters.

Required scope: clients:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Request Body

application/json
  1. body
days?integer
Range2 <= value <= 365
from?string
Match^\d{4}-\d{2}-\d{2}$
to?string
Match^\d{4}-\d{2}-\d{2}$

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/site-statistics' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "data": null}

Client AI visibility

GET
/clients/{id}/actions/ai-visibility

The client's visibility in AI answers (ChatGPT, Perplexity, Gemini...) at the latest capture compared with the one before: score out of 100, mention and citation rates (0..1), average rank, share of voice, competitors, cited domains, the market panels' view (latest.market: per provider, the brand's share of voice, competitors' shares, cited domains and searchPresence — AI Overview citations and SEO competitors in Google), per-engine mention rate, the mention trend and the question x engine matrix. null when the module was never configured for this client; latest: null when it has not been measured yet.

Reads the same data as the in-app client_ai_visibility - same implementation. Changes nothing; also answers GET with the same fields as query parameters. Takes no body.

Required scope: clients:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Response Body

The figures.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X GET 'https://api.usedashly.com/v1/clients/string/actions/ai-visibility'
Example Response
{  "data": null}

Client AI visibility

POST
/clients/{id}/actions/ai-visibility

The client's visibility in AI answers (ChatGPT, Perplexity, Gemini...) at the latest capture compared with the one before: score out of 100, mention and citation rates (0..1), average rank, share of voice, competitors, cited domains, the market panels' view (latest.market: per provider, the brand's share of voice, competitors' shares, cited domains and searchPresence — AI Overview citations and SEO competitors in Google), per-engine mention rate, the mention trend and the question x engine matrix. null when the module was never configured for this client; latest: null when it has not been measured yet.

Reads the same data as the in-app client_ai_visibility - same implementation. Changes nothing; also answers GET with the same fields as query parameters. Takes no body.

Required scope: clients:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Your agency's API key: Authorization: Bearer ak_…. Created in Connectors → API & webhooks and shown once. A key authenticates an agency, not a person.

Path Parameters

id*string

The public id of the record to act on. It is resolved inside your agency before the action runs, so an id from another tenant is a 404 and never reaches it.

Header Parameters

Idempotency-Key?string

A value you choose (a UUID is the usual one), 8 to 255 characters of A-Z a-z 0-9 _ . : -. Retrying with the same key returns the first call's answer instead of creating a second record, for seven days. The same key with a different body returns 409.

Length8 <= length <= 255

Response Body

Done.

application/json
  1. response
data*unknown

The action's result; its shape depends on the verb.

Example Request
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/ai-visibility'
Example Response
{  "data": null}