Agency settings
`/agency-settings` - read-only
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: agency-settings: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.
"-updatedAt""updatedAt""-updatedAt"The requested page.
application/json- response
data*array<>meta*curl -X GET 'https://api.usedashly.com/v1/agency-settings'{ "data": [ { "id": "string", "timezone": "string", "portalShowForfaitHours": true, "reviewLinks": null, "clientCreateFields": null, "recordDeletionEnabled": true, "npsTemplate": null, "locale": "fr", "updatedAt": "2019-08-24T14:15:22Z" } ], "meta": { "page": 0, "perPage": 0, "total": 0, "totalPages": 0 }}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: agency-settings: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/agency-settings/string'{ "data": { "id": "string", "timezone": "string", "portalShowForfaitHours": true, "reviewLinks": null, "clientCreateFields": null, "recordDeletionEnabled": true, "npsTemplate": null, "locale": "fr", "updatedAt": "2019-08-24T14:15:22Z" }}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: agency-settings: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/agency-settings/actions'{ "data": [ { "name": "string", "label": "string", "description": "string", "target": "item", "readOnly": true, "path": "string", "input": {} } ]}Writes the agency's operational preferences - IANA time zone, whether retainer hours show on the portal, review links - replacing the whole map.
Does what the dashboard's saveAgencySettingsAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
currency*string^[A-Z]{3}$timezone*stringportalShowForfaitHours*booleanreviewLinks*array<>items <= 10Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/save-settings' \ -H 'Content-Type: application/json' \ -d '{ "currency": "string", "timezone": "string", "portalShowForfaitHours": true, "reviewLinks": [ { "label": "string", "url": "http://example.com" } ]}'{ "data": null}Chooses which built-in columns (sector, website, siren) the add-client form asks for. An empty list is valid; the name is always asked for.
Does what the dashboard's saveClientCreateFieldsAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
fields*array<>Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/save-client-create-fields' \ -H 'Content-Type: application/json' \ -d '{ "fields": [ "sector" ]}'{ "data": null}Writes the agency's own NPS request e-mail - template: { subject, body }, plain text, with {{client}}, {{agence}} and {{lien}} substituted at send time - or template: null to go back to the product's copy in each reader's language.
Does what the dashboard's saveNpsTemplateAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
template*|nullDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/save-nps-template' \ -H 'Content-Type: application/json' \ -d '{ "template": { "subject": "string", "body": "string" }}'{ "data": null}Sets the agency's language (locale: fr or en) - the language of messages with no single reader: Slack notifications and the request button in the agency's channel, periodic reports (the document and its announcement), the weekly summary posted to Slack, invitations to people without an account (partner invitations use the partner's own agency language when it has one). Each person keeps their own language for what is addressed to them. changed is false when the agency already had that language (nothing is written or audited).
Does what the dashboard's saveAgencyLocaleAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
locale*string"fr""en"Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/set-locale' \ -H 'Content-Type: application/json' \ -d '{ "locale": "fr"}'{ "data": null}Sets the revenue the agency aims to sign each month - cents: whole cents excluding tax, in the agency's currency, positive - or cents: null to remove it. Today's 'Monthly target' widget draws the deals won this month against it.
Does what the dashboard's setRevenueTargetAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
cents*|nullDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/set-revenue-target' \ -H 'Content-Type: application/json' \ -d '{ "cents": 1}'{ "data": null}Turns the automatic client reminder on or off (enabled, off by default) and sets afterDays (1 to 30): a ticket assigned to its client side - a portal member or the organisation - that stays without any client action (a comment of theirs) for that many days is reminded to them, again at twice the delay. The reminder is a bell notification always, an e-mail only for a signed client. Before the feature's migration, 409 client_reminders_not_installed.
Does what the dashboard's saveClientRemindersAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
enabled*booleanafterDays*integer1 <= value <= 30Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/set-client-reminders' \ -H 'Content-Type: application/json' \ -d '{ "enabled": true, "afterDays": 1}'{ "data": null}Sets what an unestimated ticket weighs in the team's week, in minutes, by difficulty: easy, medium, hard (each 5 to 4800, easy <= medium <= hard; defaults 60, 180, 480). A ticket's own estimateMinutes always wins; a ticket with neither weighs medium.
Does what the dashboard's saveDifficultyDurationsAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
easy*integer5 <= value <= 4800medium*integer5 <= value <= 4800hard*integer5 <= value <= 4800Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/set-difficulty-durations' \ -H 'Content-Type: application/json' \ -d '{ "easy": 5, "medium": 5, "hard": 5}'{ "data": null}The agency's default schedule for each kind of recurring collection (own is null when the agency never set one and the product default applies: weekly on Monday 06:00, crawls off) and the time zone its slots are in. Read-only.
Reads the same data as the in-app getAgencyPlanning - same implementation. Changes nothing; also answers GET with the same fields as query parameters.
Required scope: agency-settings: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 figures.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X GET 'https://api.usedashly.com/v1/agency-settings/actions/collection-schedules'{ "data": null}The agency's default schedule for each kind of recurring collection (own is null when the agency never set one and the product default applies: weekly on Monday 06:00, crawls off) and the time zone its slots are in. Read-only.
Reads the same data as the in-app getAgencyPlanning - same implementation. Changes nothing; also answers GET with the same fields as query parameters.
Required scope: agency-settings: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.
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/agency-settings/actions/collection-schedules' \ -H 'Content-Type: application/json' \ -d '{}'{ "data": null}Sets when one kind of recurring collection runs for every client without an exception: 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). A slot that is full spills into the next free one.
Does what the dashboard's saveAgencyCollectionScheduleAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
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/agency-settings/actions/set-collection-schedule' \ -H 'Content-Type: application/json' \ -d '{ "kind": "geo", "frequency": "daily", "slotHour": 0}'{ "data": null}Turns deletion of CRM records - leads, organisations, people, deals - on or off for the whole agency. This is the switch every deletion checks before it acts.
Does what the dashboard's saveRecordDeletionAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
enabled*booleanDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/set-record-deletion' \ -H 'Content-Type: application/json' \ -d '{ "enabled": true}'{ "data": null}Turns the agency's contribution to Dashly's cross-agency SEO pattern library on (the default) or off. Only anonymised derived figures of its periodic reports are shared; off stops future contributions, past ones carry no agency id and cannot be removed individually.
Does what the dashboard's savePatternContributionAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
enabled*booleanDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/set-pattern-contribution' \ -H 'Content-Type: application/json' \ -d '{ "enabled": true}'{ "data": null}Creates an API key for the agency and returns its plaintext ONCE - only the hash is stored. scopes narrows what it may do; without it, the key has full access.
Does what the dashboard's createApiKeyAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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*string2 <= length <= 120scopes?array<>1 <= items <= 50Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/create-api-key' \ -H 'Content-Type: application/json' \ -d '{ "name": "string"}'{ "data": null}Permanently revokes the API key named by its display prefix. Revoking the key making the call is allowed, and takes effect immediately.
Does what the dashboard's revokeApiKeyAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
prefix*string4 <= length <= 20Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/revoke-api-key' \ -H 'Content-Type: application/json' \ -d '{ "prefix": "string"}'{ "data": null}Assigns the key named by its prefix to the given member (an id from GET /v1/members). From the next call on, the key's usage is charged to that member. A key always has an owner: detaching one would also detach it from the owner's personal cap.
Does what the dashboard's setApiKeyOwnerAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
prefix*string4 <= length <= 20ownerId*string1 <= length <= 120Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/set-api-key-owner' \ -H 'Content-Type: application/json' \ -d '{ "prefix": "string", "ownerId": "string"}'{ "data": null}Returns the agency's token pool for the current cycle - allowance, spent, remaining, reset date - and how it breaks down per member. The same figures ride on every response in the X-Quota-* headers.
Does what the dashboard's getApiUsageAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: agency-settings: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 <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/get-api-usage'{ "data": null}Recomputes the monthly pool from the plan and the seat count, and applies it. Reserved to platform administrators (a key acting for anyone else is refused with platform_admin_required): it would undo a pool support set by hand. The caller supplies no number, so the resulting allowance never exceeds what the plan grants.
Does what the dashboard's resyncApiQuotaAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: agency-settings: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 <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/resync-api-quota'{ "data": null}Registers a public HTTPS URL that will receive every event of the domain as a signed POST, and returns its signing secret ONCE.
Does what the dashboard's createWebhookAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
url*stringurilength <= 2000Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/create-webhook' \ -H 'Content-Type: application/json' \ -d '{ "url": "http://example.com"}'{ "data": null}Deletes the webhook or webhooks registered for the exact URL given. Deliveries stop immediately.
Does what the dashboard's deleteWebhookAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
url*stringurilength <= 2000Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/delete-webhook' \ -H 'Content-Type: application/json' \ -d '{ "url": "http://example.com"}'{ "data": null}Grants or removes a permission (module.action, e.g. tickets.delete) on the role named by its key. The Owner role is never editable.
Does what the dashboard's toggleRolePermissionAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
roleKey*string1 <= length <= 60permissionKey*stringenabled*booleanDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/toggle-role-permission' \ -H 'Content-Type: application/json' \ -d '{ "roleKey": "string", "permissionKey": "string", "enabled": true}'{ "data": null}Resets a system role's permissions (member, partner, client_admin, client_member) to their original preset, discarding the agency's adjustments.
Does what the dashboard's resetRoleToPresetAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
roleKey*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/agency-settings/actions/reset-role-to-preset' \ -H 'Content-Type: application/json' \ -d '{ "roleKey": "string"}'{ "data": null}Saves or replaces a marketplace connector's API key at agency level (ahrefs, semrush, fathom_analytics, pennylane, bing_webmaster, tiktok_ads). The key is encrypted and never readable again. Requires a plan with connectors (Pro and above, trials included; pennylane needs Scale).
Does what the dashboard's saveConnectorKeyAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
connectorId*string"ahrefs""semrush""fathom_analytics""pennylane""bing_webmaster""tiktok_ads"apiKey*string10 <= length <= 500Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/save-connector-key' \ -H 'Content-Type: application/json' \ -d '{ "connectorId": "ahrefs", "apiKey": "stringstri"}'{ "data": null}Deletes the agency-level credentials of a marketplace connector (ahrefs, semrush, fathom_analytics, webflow, pennylane, bing_webmaster, tiktok_ads, meta_ads, linkedin_ads). Per-client connections and the capture history are kept.
Does what the dashboard's disconnectConnectorAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
connectorId*string"ahrefs""semrush""fathom_analytics""webflow""pennylane""bing_webmaster""tiktok_ads""meta_ads""linkedin_ads"Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/disconnect-connector' \ -H 'Content-Type: application/json' \ -d '{ "connectorId": "ahrefs"}'{ "data": null}Revokes the agency's Google Ads OAuth consent - the refresh token is revoked at Google, then deleted. Per-client connections and history are kept.
Does what the dashboard's disconnectGoogleAdsAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: agency-settings: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 <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/disconnect-google-ads'{ "data": null}Revokes the agency's Google Analytics / Search Console OAuth consent - the refresh token is revoked at Google, then deleted. Per-client connections and history are kept.
Does what the dashboard's disconnectGoogleAnalyticsAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: agency-settings: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 <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/disconnect-google-analytics'{ "data": null}Revokes the agency's Google Business Profile OAuth consent - its own consent, so revoking it leaves Analytics, Ads and YouTube untouched. Per-client connections and history are kept.
Does what the dashboard's disconnectGoogleBusinessAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: agency-settings: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 <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/disconnect-google-business'{ "data": null}Revokes the agency's YouTube Analytics OAuth consent - its own consent, so revoking it leaves the other Google connections untouched. Per-client connections and history are kept.
Does what the dashboard's disconnectGoogleYoutubeAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: agency-settings: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 <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/disconnect-google-youtube'{ "data": null}Removes the agency's Google Drive connection, destroying the stored OAuth tokens. Folders already linked to clients stay in the database but cannot be read until Drive is reconnected.
Does what the dashboard's disconnectDriveAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: agency-settings: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 <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/disconnect-google-drive'{ "data": null}Removes the agency's Google Calendar connection, destroying the stored OAuth tokens, and empties the cached calendar. The events themselves stay at Google.
Does what the dashboard's disconnectGoogleCalendarAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: agency-settings: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 <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/disconnect-google-calendar'{ "data": null}Deletes the agency's GitHub webhook secret. Events GitHub sends are refused from then on, having no verifiable signature - the webhook should be removed on the repository side too.
Does what the dashboard's disconnectGithubAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: agency-settings: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 <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/disconnect-github'{ "data": null}Forgets the agency's GitHub App installation (Dashly ticket e3gb94xvys): private repositories are no longer read. The App stays installed on GitHub until it is uninstalled there. Connecting goes through GitHub's consent in the browser (Settings › Connections).
Does what the dashboard's disconnectGithubAppAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: agency-settings: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 <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/disconnect-github-app'{ "data": null}Mints or rotates the agency's GitHub webhook secret and returns it in plaintext ONCE, to paste into the GitHub webhook settings. The previous secret is invalidated immediately.
Does what the dashboard's generateGithubSecretAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: agency-settings: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 <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/generate-github-secret'{ "data": null}Removes the agency's legacy Fathom connection, from before per-member connections: the webhook is withdrawn at Fathom first, then the stored credentials are destroyed. Members' personal connections and already-imported notes are kept.
Does what the dashboard's disconnectLegacyFathomAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: agency-settings: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 <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/disconnect-legacy-fathom'{ "data": null}Re-reads the last 30 days of meeting notes from Fathom for every connection of the agency and attaches them to clients. Idempotent - an already-imported note is updated, never duplicated - and capped at 10 pages per connection, but it calls Fathom once per connection: use it to catch up on a missed webhook, not as a sync loop.
Does what the dashboard's syncFathomAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: agency-settings: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 <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/sync-fathom'{ "data": null}Re-reads the agency's Connect account at Stripe, records its capabilities - charges, payouts, details submitted - and returns them. Idempotent and free of side effects at Stripe, but the account.updated webhook already keeps this status current: use it to catch up, not as a polling loop.
Does what the dashboard's refreshConnectStatusAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: agency-settings: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 <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/refresh-connect-status'{ "data": null}Removes the link between the agency and its Slack workspace, along with the bot token stored there. Slack commands and notifications stop immediately, and reconnecting requires fresh OAuth consent.
Does what the dashboard's disconnectSlackAction does - same implementation, so the two cannot diverge. Takes no body.
Required scope: agency-settings: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 <= 255Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/disconnect-slack'{ "data": null}Posts the message carrying the "New request" button into a Slack channel - the only way a client reaches Dashly from a shared channel, since slash commands do not cross Slack Connect.
Does what the dashboard's postRequestButtonAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
channel*stringlength <= 120Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/post-slack-request-button' \ -H 'Content-Type: application/json' \ -d '{ "channel": "string"}'{ "data": null}Sets the Slack channel the agency's notifications go to, after checking the bot can post there. An empty value clears the setting. This channel is shared by the whole agency and every ticket names its client in it, so pointing it at a channel shared with one client would show them the others.
Does what the dashboard's setNotifyChannelAction does - same implementation, so the two cannot diverge.
Required scope: agency-settings: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
channel*stringlength <= 120Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/set-slack-notify-channel' \ -H 'Content-Type: application/json' \ -d '{ "channel": "string"}'{ "data": null}The agency dashboard's key figures for the current month (default) or quarter: active clients and new ones (clients:read), open tickets and tickets created per week over 12 weeks (tickets:read), minutes logged this week and per week (time-logs:read), monthly forfait consumption per client, most consumed first (forfaits:read). A section the key may not read is absent.
Reads the same data as the in-app workspace_overview - same implementation. Changes nothing; also answers GET with the same fields as query parameters.
Required scope: none - each section needs its own <resource>:read and is absent without it.
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.
period?string"month""quarter"The figures.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X GET 'https://api.usedashly.com/v1/agency-settings/actions/overview'{ "data": null}The agency dashboard's key figures for the current month (default) or quarter: active clients and new ones (clients:read), open tickets and tickets created per week over 12 weeks (tickets:read), minutes logged this week and per week (time-logs:read), monthly forfait consumption per client, most consumed first (forfaits:read). A section the key may not read is absent.
Reads the same data as the in-app workspace_overview - same implementation. Changes nothing; also answers GET with the same fields as query parameters.
Required scope: none - each section needs its own <resource>:read and is absent without it.
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
period?string"month""quarter"Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/agency-settings/actions/overview' \ -H 'Content-Type: application/json' \ -d '{}'{ "data": null}