Skip to content
POST /dashboard/import-pins

Requires `dashboard:create`. A pin already on the dashboard (same origin widget) or whose snapshot fails the widget schema is skipped; the import stops with `limit_reached` at the widget, page or size ceiling.

Request Body

cursorstring
dashboard_idstring

Response Body

dashboardobject
access_summary
access_viastring
agent_edit_blocked_bystring,null
Possible values:
assistant_disabledllm_not_configurednot_permittednull
can_agent_editboolean,null
can_discard_draftboolean

can_manage, there is a draft, and the dashboard has been published (a never-published dashboard has no live version to go back to).

can_manageboolean
can_publishboolean

can_manage and there is a draft to publish.

can_revoke_shareboolean
can_see_sharesboolean
can_shareboolean
can_transferboolean
created_atstring
definition
descriptionstring
draftobject,null

The pending draft, present only for a caller with can_manage; everyone else sees the published definition.

8 properties
definition
descriptionstring
draft_revisioninteger
namestring
updated_atstring
updated_by_namestring,null
updated_clientstring,null

The AI client's display name, as on the dashboard itself.

updated_viastring,null
draft_changesobject
4 properties
countinteger
ever_publishedboolean
itemsarray
moreinteger
draft_revisioninteger

The guard on PUT /dashboard/{id}/draft. Moves on every draft save, publish and discard.

ever_publishedboolean
has_draftboolean

A pending draft exists. Only a caller with can_manage is ever shown the draft itself.

idstring
labelsobject
1 property
widgets
live_changed_since_draftboolean

The live dashboard was saved after the pending draft began, so publishing would replace that save. Only ever true for a caller with can_manage; the Elaichi app warns in words and sends live_revision on publish only after the person confirms.

namestring
owner_avatar_urlstring,null

The person's picture: their stored profile picture, else a Gravatar URL (d=404, 96px) derived from their email (the address itself is not sent), else null. Draw initials when it is null or the image fails to load.

owner_display_namestring,null
owner_user_idstring
page_countinteger
provenance
public_links
publish_blocked_reasonstring,null

Why publishing would fail right now (a widget that does not validate), else null. A source the publisher cannot read is checked by the publish itself.

revisioninteger
source_previewobject[]

At most three sources the caller can read. The total is source_summary; the full set is sources on the detail.

4 properties
logostring,null
namestring
resource_typestring
Possible values:
collectiontoolboxautomation
slugstring,null

The connector slug when the source has exactly one; null otherwise, never guessed.

source_summaryobject
2 properties
collection_idsstring[]
toolbox_idsstring[]
sourcesobject[]
5 properties
caller_can_readboolean
namestring,null
resource_idstring
resource_typestring
widget_countinteger
statusstring

draft_only: never published, so only editors can open it. published_with_changes: live, with a pending draft.

Possible values:
publisheddraft_onlypublished_with_changes
updated_atstring
updated_bystring,null
updated_by_namestring,null
updated_clientstring,null

The connected AI client's display name ("Claude") when updated_via is mcp; null when that client is unknown. Never an internal id.

updated_viastring,null

How the last edit was made; null for edits that predate the draft layer.

Possible values:
consoleagentmcpapinull
widget_countinteger
importedinteger
limit_reachedboolean
next_cursorstring,null
skippedinteger
curl -X POST 'https://api.elaichi.ai/dashboard/import-pins' \
  -H 'Authorization: Bearer $ELAICHI_API_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"dashboard_id":"your_dashboard_id","cursor":"your_cursor"}'
const body = {
  "dashboard_id": "your_dashboard_id",
  "cursor": "your_cursor"
};

const response = await fetch('https://api.elaichi.ai/dashboard/import-pins', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer ' + process.env.ELAICHI_API_TOKEN,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify(body),
});

const data = await response.json();
console.log(data);
import os
import requests

url = "https://api.elaichi.ai/dashboard/import-pins"
headers = {
    "Authorization": f"Bearer {os.environ['ELAICHI_API_TOKEN']}",
    "Content-Type": "application/json",
}
payload = {
    "dashboard_id": "your_dashboard_id",
    "cursor": "your_cursor"
}

response = requests.post(url, headers=headers, json=payload)
print(response.json())