Clients
`/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.
bearerAuthAuthorizationBearer <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.
page?integer1-based. meta.totalPages says how many there are.
1 <= value1per_page?integerRows per page. A value above 200 returns 400 - never a silent clamp.
1 <= value <= 20050sort?stringPrefix with - for descending. An undeclared sort returns 400.
"-createdAt""createdAt""-createdAt""name""-name""status""-status"q?stringCase-insensitive "contains", across: name, sector.
filter[status]?stringExact match on status.
filter[sector]?stringExact match on sector.
filter[lead]?stringfalse (the default) leaves out the organisations that only an unconverted lead knows; true lists only them. They join the directory when the lead converts.
"true""false"The requested page.
application/json- response
data*array<>meta*curl -X GET 'https://api.usedashly.com/v1/clients'{ "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 }}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.
bearerAuthAuthorizationBearer <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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
name*string1 <= length <= 200slug?|nullsector?|nullwebsite?|nulllinkedinUrl?|nullsiren?|nullstatus*string"prospect""active""inactive""lost"locale?|nullcustomFields?createdAt?stringWhen this actually happened, for an import. Past dates only; defaults to now. updatedAt follows it unless the body sets one.
date-timeCreated. The body is the new record, as a read would return it.
application/json- response
data*curl -X POST 'https://api.usedashly.com/v1/clients' \ -H 'Content-Type: application/json' \ -d '{ "name": "string", "status": "prospect"}'{ "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": {} }}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.
bearerAuthAuthorizationBearer <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.
id*stringThe record's public id (hsbftmp3f5), as returned in the id field. An internal UUID returns 404.
Found.
application/json- response
data*curl -X GET 'https://api.usedashly.com/v1/clients/string'{ "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": {} }}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.
bearerAuthAuthorizationBearer <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.
id*stringThe record's public id (hsbftmp3f5), as returned in the id field. An internal UUID returns 404.
application/json- body
name?string1 <= length <= 200slug?|nullsector?|nullwebsite?|nulllinkedinUrl?|nullsiren?|nullstatus?string"prospect""active""inactive""lost"locale?|nullcustomFields?Updated. The body is the record as it now stands.
application/json- response
data*curl -X PATCH 'https://api.usedashly.com/v1/clients/string' \ -H 'Content-Type: application/json' \ -d '{}'{ "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": {} }}Permanent. The audit log keeps the trace; the record does not come back.
Required scope: clients:write.
bearerAuthAuthorizationBearer <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.
id*stringThe record's public id (hsbftmp3f5), as returned in the id field. An internal UUID returns 404.
Deleted. Empty body.
curl -X DELETE 'https://api.usedashly.com/v1/clients/string'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.
bearerAuthAuthorizationBearer <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.
The available verbs.
application/json- response
data*array<>curl -X GET 'https://api.usedashly.com/v1/clients/actions'{ "data": [ { "name": "string", "label": "string", "description": "string", "target": "item", "readOnly": true, "path": "string", "input": {} } ]}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
label*string1 <= length <= 80url*stringurilength <= 500Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
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"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
url*stringurilength <= 500label?string1 <= length <= 80Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/remove-portal-highlight' \ -H 'Content-Type: application/json' \ -d '{ "url": "http://example.com"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
email*string^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$emaillength <= 200permissionKey*string"billing.read""docs.read""forfaits.read""reports.read""decks.read""tickets.create""portal.docs.create""portal.deals.read""portal.geo.manage""chat.write"allowed*booleanDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
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}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
The figures.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X GET 'https://api.usedashly.com/v1/clients/string/actions/portal-members'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/portal-members' \ -H 'Content-Type: application/json' \ -d '{}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
email*string^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$emaillength <= 200replacementEmail?string^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$emaillength <= 200role*string"client_member""client_admin"Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
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"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
email*string^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$emaillength <= 200replacementEmail?string^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$emaillength <= 200Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/remove-portal-member' \ -H 'Content-Type: application/json' \ -d '{ "email": "user@example.com"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
projectId?string1 <= lengthDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/submit-onboarding' \ -H 'Content-Type: application/json' \ -d '{}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
projectId?string1 <= lengthDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/validate-onboarding' \ -H 'Content-Type: application/json' \ -d '{}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
projectId?string1 <= lengthnote*string1 <= length <= 2000Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/request-onboarding-changes' \ -H 'Content-Type: application/json' \ -d '{ "note": "string"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
projectId?string1 <= lengthnote?stringlength <= 2000Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/cancel-onboarding' \ -H 'Content-Type: application/json' \ -d '{}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
folder*string1 <= length <= 2000clientVisible?booleanDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/link-drive-folder' \ -H 'Content-Type: application/json' \ -d '{ "folder": "string"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
clientVisible*booleanDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/set-drive-visibility' \ -H 'Content-Type: application/json' \ -d '{ "clientVisible": true}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/unlink-drive-folder'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
url*string1 <= length <= 2000Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/start-crawl' \ -H 'Content-Type: application/json' \ -d '{ "url": "string"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/cancel-crawl'{ "data": null}Schedule the monthly re-crawl
DeprecatedTurns 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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
schedule*string"off""monthly"Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/set-crawl-schedule' \ -H 'Content-Type: application/json' \ -d '{ "schedule": "off"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
The figures.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X GET 'https://api.usedashly.com/v1/clients/string/actions/collection-schedule'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/collection-schedule' \ -H 'Content-Type: application/json' \ -d '{}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
kind*string"geo""rank""crawl"frequency*string"daily""weekly""monthly""off"weekday?integer1 <= value <= 71monthDay?integer1 <= value <= 281slotHour*|Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
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}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
kind*string"geo""rank""crawl"Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/clear-collection-schedule' \ -H 'Content-Type: application/json' \ -d '{ "kind": "geo"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
body*string1 <= length <= 4000dealId?string1 <= lengthDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/add-note' \ -H 'Content-Type: application/json' \ -d '{ "body": "string"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
The figures.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X GET 'https://api.usedashly.com/v1/clients/string/actions/services'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/services' \ -H 'Content-Type: application/json' \ -d '{}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
serviceId*stringDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/add-service' \ -H 'Content-Type: application/json' \ -d '{ "serviceId": "string"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
serviceId*stringnote?|nullclientVisible?booleanDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/update-service' \ -H 'Content-Type: application/json' \ -d '{ "serviceId": "string"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
serviceId*stringDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/remove-service' \ -H 'Content-Type: application/json' \ -d '{ "serviceId": "string"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/start-offboarding'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
position*integer0 <= value <= 9007199254740991done*booleanDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/toggle-offboarding-step' \ -H 'Content-Type: application/json' \ -d '{ "position": 0, "done": true}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/cancel-offboarding'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/complete-offboarding'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/request-nps'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/withdraw-nps'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
title*string2 <= length <= 160description?stringlength <= 2000effort?stringlength <= 80benefit?stringlength <= 300projectId?string1 <= lengthDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/propose-suggestion' \ -H 'Content-Type: application/json' \ -d '{ "title": "string"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/sync-connectors'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
type*string"clients""contacts""leads""deals"csv*string1 <= length <= 2000000mapping*dryRun?booleanfalseallowDuplicates?booleanfalseDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
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" }}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
targetType*string"account""contact""project""ticket""deal""user""proposal"targetId*string1 <= length <= 60Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/link-object' \ -H 'Content-Type: application/json' \ -d '{ "targetType": "account", "targetId": "string"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
targetType*string"account""contact""project""ticket""deal""user""proposal"targetId*string1 <= length <= 60Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/unlink-object' \ -H 'Content-Type: application/json' \ -d '{ "targetType": "account", "targetId": "string"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
managerId*|nullDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/set-manager' \ -H 'Content-Type: application/json' \ -d '{ "managerId": "string"}'{ "data": null}Assign the team
DeprecatedAssigns 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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
teamId*|nullDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/set-team' \ -H 'Content-Type: application/json' \ -d '{ "teamId": "string"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
logo*|nullDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/set-logo' \ -H 'Content-Type: application/json' \ -d '{ "logo": "string"}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
rows*array<>items <= 40Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/actions/set-overview-layout' \ -H 'Content-Type: application/json' \ -d '{ "rows": [ "string" ]}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
enabled*booleanDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/set-weekly-bilan' \ -H 'Content-Type: application/json' \ -d '{ "enabled": true}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
The figures.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X GET 'https://api.usedashly.com/v1/clients/string/actions/weekly-bilan'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/weekly-bilan'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
days?integer2 <= value <= 365from?string^\d{4}-\d{2}-\d{2}$to?string^\d{4}-\d{2}-\d{2}$The figures.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X GET 'https://api.usedashly.com/v1/clients/string/actions/site-statistics'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255application/json- body
days?integer2 <= value <= 365from?string^\d{4}-\d{2}-\d{2}$to?string^\d{4}-\d{2}-\d{2}$Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/site-statistics' \ -H 'Content-Type: application/json' \ -d '{}'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
The figures.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X GET 'https://api.usedashly.com/v1/clients/string/actions/ai-visibility'{ "data": null}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.
bearerAuthAuthorizationBearer <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.
id*stringThe 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.
Idempotency-Key?stringA 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.
8 <= length <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/clients/string/actions/ai-visibility'{ "data": null}