Dashly Docs

Portal branding

`/branding` - read-only

List portal branding

GET
/branding

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.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Query Parameters

page?integer

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

Range1 <= value
Default1
per_page?integer

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

Range1 <= value <= 200
Default50
sort?string

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

Default"-updatedAt"
Value in"updatedAt""-updatedAt"

Response Body

The requested page.

application/json
  1. response
data*array<>
meta*
Example Request
curl -X GET 'https://api.usedashly.com/v1/branding'
Example Response
{  "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  }}
GET
/branding/{id}

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

Required scope: branding:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Path Parameters

id*string

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

Response Body

Found.

application/json
  1. response
data*
Example Request
curl -X GET 'https://api.usedashly.com/v1/branding/string'
Example Response
{  "data": {    "id": "string",    "logoUrl": "string",    "accentColor": "string",    "welcomeMessage": "string",    "welcomeVideoUrl": "string",    "updatedAt": "2019-08-24T14:15:22Z"  }}

List available actions

GET
/branding/actions

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

Required scope: branding:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Response Body

The available verbs.

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

Save the portal branding

POST
/branding/actions/save

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.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Request Body

application/json
  1. body
logoUrl?|string
accentColor?|string
welcomeMessage?|string
welcomeVideoUrl?|string

Response Body

Done.

application/json
  1. response
data*unknown

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

Example Request
curl -X POST 'https://api.usedashly.com/v1/branding/actions/save' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "data": null}
POST
/branding/actions/set-section-visibility

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.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Request Body

application/json
  1. body
clientId?|null
key*string
Value in"home""assistant""projects""roadmap""tickets""suggestions""documents""docs""sharedDocs""messages""stats""aiVisibility""reports""decks""retainer""invoices""status""seoAudit""contracts"
visible*boolean

Response Body

Done.

application/json
  1. response
data*unknown

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

Example Request
curl -X POST 'https://api.usedashly.com/v1/branding/actions/set-section-visibility' \  -H 'Content-Type: application/json' \  -d '{  "key": "home",  "visible": true}'
Example Response
{  "data": null}

Rename a portal section

POST
/branding/actions/rename-section

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.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Request Body

application/json
  1. body
clientId?|null
key*string
Value in"home""assistant""projects""roadmap""tickets""suggestions""documents""docs""sharedDocs""messages""stats""aiVisibility""reports""decks""retainer""invoices""status""seoAudit""contracts"
label?|null

Response Body

Done.

application/json
  1. response
data*unknown

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

Example Request
curl -X POST 'https://api.usedashly.com/v1/branding/actions/rename-section' \  -H 'Content-Type: application/json' \  -d '{  "key": "home"}'
Example Response
{  "data": null}
POST
/branding/actions/remove-section

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.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Request Body

application/json
  1. body
clientId?|null
key*string
Length1 <= length <= 80

Response Body

Done.

application/json
  1. response
data*unknown

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

Example Request
curl -X POST 'https://api.usedashly.com/v1/branding/actions/remove-section' \  -H 'Content-Type: application/json' \  -d '{  "key": "string"}'
Example Response
{  "data": null}
POST
/branding/actions/reorder-sections

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.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Request Body

application/json
  1. body
clientId?|null
ordered*array<>
Items1 <= items <= 60

Response Body

Done.

application/json
  1. response
data*unknown

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

Example Request
curl -X POST 'https://api.usedashly.com/v1/branding/actions/reorder-sections' \  -H 'Content-Type: application/json' \  -d '{  "ordered": [    {      "key": "string",      "type": "native"    }  ]}'
Example Response
{  "data": null}

Reset a client's portal

POST
/branding/actions/reset-client-portal

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.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Request Body

application/json
  1. body
clientId*string
Length1 <= length <= 60

Response Body

Done.

application/json
  1. response
data*unknown

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

Example Request
curl -X POST 'https://api.usedashly.com/v1/branding/actions/reset-client-portal' \  -H 'Content-Type: application/json' \  -d '{  "clientId": "string"}'
Example Response
{  "data": null}

Save a portal block

POST
/branding/actions/save-block

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.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Request Body

application/json
  1. body
clientId?|null
key?string
Length1 <= length <= 80
label?string
Lengthlength <= 60
position?integer
Range0 <= value <= 9999
kind*string
html*string
Length1 <= length <= 20000

Response Body

Done.

application/json
  1. response
data*unknown

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

Example Request
curl -X POST 'https://api.usedashly.com/v1/branding/actions/save-block' \  -H 'Content-Type: application/json' \  -d '{  "kind": "richtext",  "html": "string"}'
Example Response
{  "data": null}