Dashly Docs

Decks

`/decks`

List decks

GET
/decks

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: decks: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""createdAt""-createdAt""name""-name"
q?string

Case-insensitive "contains", across: name.

filter[portalVisible]?string

Exact match on portalVisible.

Value in"true""false"
filter[providerVisible]?string

Exact match on providerVisible.

Value in"true""false"
filter[dataMode]?string

Exact match on dataMode.

Response Body

The requested page.

application/json
  1. response
data*array<>
meta*
Example Request
curl -X GET 'https://api.usedashly.com/v1/decks'
Example Response
{  "data": [    {      "id": "string",      "name": "string",      "layout": null,      "periodConfig": null,      "dataMode": "string",      "portalVisible": true,      "providerVisible": true,      "viewCount": 0,      "createdAt": "2019-08-24T14:15:22Z",      "updatedAt": "2019-08-24T14:15:22Z"    }  ],  "meta": {    "page": 0,    "perPage": 0,    "total": 0,    "totalPages": 0  }}

Create a deck

POST
/decks

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: decks:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Request Body

application/json
  1. body
name*string
Length1 <= length <= 200
layout?array<unknown>
periodConfig?
dataMode?string
Value in"live""frozen"
portalVisible?boolean
providerVisible?boolean
clientId*string
projectId?string|null
createdAt?string

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

Formatdate-time

Response Body

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

application/json
  1. response
data*
Example Request
curl -X POST 'https://api.usedashly.com/v1/decks' \  -H 'Content-Type: application/json' \  -d '{  "name": "string",  "clientId": "string"}'
Example Response
{  "data": {    "id": "string",    "name": "string",    "layout": null,    "periodConfig": null,    "dataMode": "string",    "portalVisible": true,    "providerVisible": true,    "viewCount": 0,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z"  }}

Retrieve a deck

GET
/decks/{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: decks: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/decks/string'
Example Response
{  "data": {    "id": "string",    "name": "string",    "layout": null,    "periodConfig": null,    "dataMode": "string",    "portalVisible": true,    "providerVisible": true,    "viewCount": 0,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z"  }}

Update a deck

PATCH
/decks/{id}

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

Required scope: decks:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Path Parameters

id*string

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

Request Body

application/json
  1. body
name?string
Length1 <= length <= 200
layout?array<unknown>
periodConfig?
dataMode?string
Value in"live""frozen"
portalVisible?boolean
providerVisible?boolean
clientId?string
projectId?string|null

Response Body

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

application/json
  1. response
data*
Example Request
curl -X PATCH 'https://api.usedashly.com/v1/decks/string' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "data": {    "id": "string",    "name": "string",    "layout": null,    "periodConfig": null,    "dataMode": "string",    "portalVisible": true,    "providerVisible": true,    "viewCount": 0,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z"  }}

Delete a deck

DELETE
/decks/{id}

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

Required scope: decks:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Path Parameters

id*string

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

Response Body

Deleted. Empty body.

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

List available actions

GET
/decks/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: decks: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/decks/actions'
Example Response
{  "data": [    {      "name": "string",      "label": "string",      "description": "string",      "target": "item",      "readOnly": true,      "path": "string",      "input": {}    }  ]}

Duplicate

POST
/decks/{id}/actions/duplicate

Copies the deck ("… (copie)") onto the same client and project. The copy starts in live mode, with no public link and no portal publication.

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

Required scope: decks:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Path Parameters

id*string

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Response Body

Done.

application/json
  1. response
data*unknown

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

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

Switch back to live

POST
/decks/{id}/actions/unfreeze

Puts a frozen deck back into live mode: the frozen data is cleared and every view recomputes the figures from the latest captures.

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

Required scope: decks:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Path Parameters

id*string

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Response Body

Done.

application/json
  1. response
data*unknown

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

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

Save the guides

POST
/decks/{id}/actions/save-guides

Replaces the editor's ruler guides - pixel positions on the 1280×720 canvas, as v and h lists. A placement aid only; it changes nothing in the output.

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

Required scope: decks:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Path Parameters

id*string

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Request Body

application/json
  1. body
guides*

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/decks/string/actions/save-guides' \  -H 'Content-Type: application/json' \  -d '{  "guides": {}}'
Example Response
{  "data": null}

Freeze

POST
/decks/{id}/actions/freeze

Resolves the live widgets one last time, from the connectors' latest captures, and freezes the result: the deck stops following the data and shows that point in time.

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

Required scope: decks:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Path Parameters

id*string

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Response Body

Done.

application/json
  1. response
data*unknown

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

Example Request
curl -X POST 'https://api.usedashly.com/v1/decks/string/actions/freeze'
Example Response
{  "data": null}
POST
/decks/{id}/actions/set-sharing

Turns the deck's public link on, rotates it, or turns it off. enabled: true on a deck with no link activates it - freezing a still-live deck, as the dashboard does; on an already-shared deck it rotates the token. enabled: false cuts the link. Responds with the token, or null.

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

Required scope: decks:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Path Parameters

id*string

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Request Body

application/json
  1. body
enabled*boolean

Response Body

Done.

application/json
  1. response
data*unknown

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

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

Save a theme

POST
/decks/actions/save-theme

Creates the theme with this name, or replaces its tokens if it already exists. An agency's first theme becomes its default. The name identifies the theme, so two themes sharing one make the call fail.

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

Required scope: decks:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Request Body

application/json
  1. body
name*string
Length1 <= length <= 80
tokens*
isDefault?boolean
Defaultfalse

Response Body

Done.

application/json
  1. response
data*unknown

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

Example Request
curl -X POST 'https://api.usedashly.com/v1/decks/actions/save-theme' \  -H 'Content-Type: application/json' \  -d '{  "name": "string",  "tokens": {    "palette": {      "bg": "string",      "surface": "string",      "text": "string",      "muted": "string",      "accent": "string",      "onAccent": "string",      "chart": [        "string",        "string",        "string"      ]    },    "fonts": {      "heading": "sans",      "body": "sans"    },    "text": {      "title": {        "px": 8,        "weight": 100,        "color": "bg",        "font": "heading"      },      "heading": {        "px": 8,        "weight": 100,        "color": "bg",        "font": "heading"      },      "subheading": {        "px": 8,        "weight": 100,        "color": "bg",        "font": "heading"      },      "body": {        "px": 8,        "weight": 100,        "color": "bg",        "font": "heading"      },      "caption": {        "px": 8,        "weight": 100,        "color": "bg",        "font": "heading"      }    }  }}'
Example Response
{  "data": null}

Adopt a preset theme

POST
/decks/actions/add-theme-preset

Copies one of the shipped themes into the agency's catalogue, where it becomes editable (ardoise, encre, papier, foret, nuit). The call fails when a theme already carries that name, so an edited palette is never overwritten.

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

Required scope: decks: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
preset*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/decks/actions/add-theme-preset' \  -H 'Content-Type: application/json' \  -d '{  "preset": "string"}'
Example Response
{  "data": null}

Delete a theme

POST
/decks/actions/delete-theme

Removes the theme from the agency's catalogue. Decks that followed it fall back to the default theme, their slides unchanged.

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

Required scope: decks: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
theme*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/decks/actions/delete-theme' \  -H 'Content-Type: application/json' \  -d '{  "theme": "string"}'
Example Response
{  "data": null}

Apply a theme

POST
/decks/{id}/actions/set-theme

Points the deck at the named theme, or at the agency's default when theme is null. Only the link is written: an element set to a token repaints, an element set to a raw value keeps it.

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

Required scope: decks:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Path Parameters

id*string

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Request Body

application/json
  1. body
theme*|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/decks/string/actions/set-theme' \  -H 'Content-Type: application/json' \  -d '{  "theme": "string"}'
Example Response
{  "data": null}

Save as a template

POST
/decks/{id}/actions/save-as-template

Copies the deck's layout and period into a reusable agency template under the name you give. The template then seeds a new deck or a monthly generation; it is not readable through the API.

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

Required scope: decks:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Path Parameters

id*string

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Request Body

application/json
  1. body
name*string
Length1 <= length <= 120

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/decks/string/actions/save-as-template' \  -H 'Content-Type: application/json' \  -d '{  "name": "string"}'
Example Response
{  "data": null}

Schedule a monthly deck

POST
/decks/actions/save-schedule

Turns on automatic generation of a deck for this client from the named template, on the 1st of each month. Calling it again with the same client and template updates the schedule rather than creating a second one.

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

Required scope: decks: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
template*string
Length1 <= length <= 120
portalVisible?boolean
Defaulttrue

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/decks/actions/save-schedule' \  -H 'Content-Type: application/json' \  -d '{  "clientId": "string",  "template": "string"}'
Example Response
{  "data": null}

Read the speaker notes

GET
/decks/{id}/actions/slide-notes

The presenter's notes of every slide, in slide order, as {slideId, index, body}. Agency-only data: never shown on the portal, the public link or to a provider. Read-only.

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

Required scope: decks:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Path Parameters

id*string

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

Response Body

The figures.

application/json
  1. response
data*unknown

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

Example Request
curl -X GET 'https://api.usedashly.com/v1/decks/string/actions/slide-notes'
Example Response
{  "data": null}

Read the speaker notes

POST
/decks/{id}/actions/slide-notes

The presenter's notes of every slide, in slide order, as {slideId, index, body}. Agency-only data: never shown on the portal, the public link or to a provider. Read-only.

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

Required scope: decks:read.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Path Parameters

id*string

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Request Body

application/json
  1. body

Response Body

Done.

application/json
  1. response
data*unknown

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

Example Request
curl -X POST 'https://api.usedashly.com/v1/decks/string/actions/slide-notes' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "data": null}
POST
/decks/{id}/actions/save-slide-notes

Replaces the presenter's notes of one slide, addressed by its slideId (the slide's i in the layout). An empty body clears them. Answers every note of the deck.

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

Required scope: decks:write.

Authorization

bearerAuth
headerAuthorizationBearer <token>

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

Path Parameters

id*string

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

Header Parameters

Idempotency-Key?string

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

Length8 <= length <= 255

Request Body

application/json
  1. body
slideId*string
Length1 <= length <= 40
body*string
Lengthlength <= 4000

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/decks/string/actions/save-slide-notes' \  -H 'Content-Type: application/json' \  -d '{  "slideId": "string",  "body": "string"}'
Example Response
{  "data": null}