Portal branding
`/branding` - 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: branding: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/branding'{ "data": [ { "id": "string", "logoUrl": "string", "accentColor": "string", "welcomeMessage": "string", "welcomeVideoUrl": "string", "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: branding: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/branding/string'{ "data": { "id": "string", "logoUrl": "string", "accentColor": "string", "welcomeMessage": "string", "welcomeVideoUrl": "string", "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: branding: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/branding/actions'{ "data": [ { "name": "string", "label": "string", "description": "string", "target": "item", "readOnly": true, "path": "string", "input": {} } ]}Writes the client portal's branding - logo, accent colour as #RRGGBB, welcome message and video. An empty string clears a field. Requires a plan with branding (Pro and above, trials included).
Does what the dashboard's saveBrandingAction does - same implementation, so the two cannot diverge.
Required scope: branding: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
logoUrl?|stringaccentColor?|stringwelcomeMessage?|stringwelcomeVideoUrl?|stringDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/branding/actions/save' \ -H 'Content-Type: application/json' \ -d '{}'{ "data": null}Shows or hides a built-in portal section, on the agency's template or for one client. Hiding never removes a right and showing never grants one: the section stays subject to the client's permissions.
Does what the dashboard's setSectionVisibilityAction does - same implementation, so the two cannot diverge.
Required scope: branding: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
clientId?|nullkey*string"home""assistant""projects""roadmap""tickets""suggestions""documents""docs""sharedDocs""messages""stats""aiVisibility""reports""decks""retainer""invoices""status""seoAudit""contracts"visible*booleanDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/branding/actions/set-section-visibility' \ -H 'Content-Type: application/json' \ -d '{ "key": "home", "visible": true}'{ "data": null}Renames a built-in portal section, 40 characters maximum. An empty or null label restores the original name, and the section is shown again either way.
Does what the dashboard's renameSectionAction does - same implementation, so the two cannot diverge.
Required scope: branding: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
clientId?|nullkey*string"home""assistant""projects""roadmap""tickets""suggestions""documents""docs""sharedDocs""messages""stats""aiVisibility""reports""decks""retainer""invoices""status""seoAudit""contracts"label?|nullDone.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/branding/actions/rename-section' \ -H 'Content-Type: application/json' \ -d '{ "key": "home"}'{ "data": null}Removes a section's customisation: a block disappears, and a built-in section goes back to what it inherits - the agency's template, or the product's catalogue.
Does what the dashboard's removeSectionAction does - same implementation, so the two cannot diverge.
Required scope: branding: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
clientId?|nullkey*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/branding/actions/remove-section' \ -H 'Content-Type: application/json' \ -d '{ "key": "string"}'{ "data": null}Sets the order of the portal's sections: each one's position is its rank in the list you send, first to last.
Does what the dashboard's reorderSectionsAction does - same implementation, so the two cannot diverge.
Required scope: branding: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
clientId?|nullordered*array<>1 <= items <= 60Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/branding/actions/reorder-sections' \ -H 'Content-Type: application/json' \ -d '{ "ordered": [ { "key": "string", "type": "native" } ]}'{ "data": null}Removes every customisation on this client's portal, its blocks included, so it follows the agency's template in full again.
Does what the dashboard's resetClientPortalAction does - same implementation, so the two cannot diverge.
Required scope: branding: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
clientId*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/branding/actions/reset-client-portal' \ -H 'Content-Type: application/json' \ -d '{ "clientId": "string"}'{ "data": null}Creates or updates a portal block (richtext, link, embed or file) on the agency's template or on one client. The key returned is what edits the same block later. A file travels as base64, 5 MB maximum once decoded.
Does what the dashboard's saveBlockAction does - same implementation, so the two cannot diverge.
Required scope: branding: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
clientId?|nullkey?string1 <= length <= 80label?stringlength <= 60position?integer0 <= value <= 9999kind*stringhtml*string1 <= length <= 20000Done.
application/json- response
data*unknownThe action's result; its shape depends on the verb.
curl -X POST 'https://api.usedashly.com/v1/branding/actions/save-block' \ -H 'Content-Type: application/json' \ -d '{ "kind": "richtext", "html": "string"}'{ "data": null}