Skip to content

InterlinedList API Reference

Generated from the live OpenAPI 3.1 document (350 endpoints). Base URL https://interlinedlist.com/v1. Developer overview

Getting Started

  1. Create a personal access token in Settings → Developer, choosing only the scopes you need. It is shown once.
  2. Send it on every request: Authorization: Bearer ilp_…
  3. Try it: curl -H "Authorization: Bearer $IL_TOKEN" https://interlinedlist.com/v1/me

Conventions

  • Errors always look like {"error":{"code","message","details"}}; that shape is omitted from each endpoint below.
  • Collections return {"data":[…],"page":{"next_cursor","has_more"}}; pass cursor and limit to page.
  • Public endpoints work without a token; Token endpoints need one; Admin endpoints need a moderator or admin role.
  • Token scopes: profile:read, profile:write, messages:read, messages:write, lists:read, lists:write, documents:read, documents:write, dm:read, dm:write, notifications:read, social:read, social:write, media:write, exports:run, webhooks:manage. A request without the scope an endpoint needs fails with scope_missing.

ai

get/v1/ai/statusAI availability and remaining quotaToken
post/v1/ai/previewStart an AI preview (202; streamed as ai.delta / ai.done on /user/{usr})Token

Link to this endpoint

Request body (application/json)
FieldTypeNotes
feature*"compose_assist" | "suggest_tags" | "alt_text" | "summarize" | "generate_list" | "generate_document" | "schedule_series" | "rewrite" | "translate"
inputany
optionsobject (map)default {}

202Accepted

Response body
FieldTypeNotes
generation_id*string
channel*string
post/v1/ai/confirmApply a preview (creates list, docs, scheduled series); counts as one actionToken

Link to this endpoint

Request body (application/json)
FieldTypeNotes
generation_id*string
editsany
syndicationobject
syndication.targets*object[]≤ 20 items
syndication.targets[].account_id*stringpattern ^sa_[0-7][0-9A-HJKMNP-TV-Z]{25}$
syndication.targets[].target_refstring | nulldefault null
syndication.linkedin_link_as_first_commentbooleandefault false

200OK

auth

post/v1/auth/signupSign up (SubstratalApps); returns verification_sent and, when subscribed, device tokensPublic

Link to this endpoint

Request body (application/json)
FieldTypeNotes
email*string (email)
password*string12–128 chars
display_name*string1–100 chars
client_kind"ios" | "macos" | "android" | "cli" | "desktop" | "web"default "cli"

200OK

post/v1/auth/loginSign in → device tokens, or an MFA challengePublic

Link to this endpoint

Request body (application/json)
FieldTypeNotes
email*string (email)
password*string1–128 chars
client_kind"ios" | "macos" | "android" | "cli" | "desktop" | "web"default "cli"
device_labelstring≤ 80 chars

200OK

post/v1/auth/mfa/verifyComplete MFAPublic

Link to this endpoint

Request body (application/json)
FieldTypeNotes
mfa_ticket*string
codestring
recovery_codestring
client_kind"ios" | "macos" | "android" | "cli" | "desktop" | "web"default "cli"

200OK

post/v1/auth/refreshRotate an IL device token pairPublic

Link to this endpoint

Request body (application/json)
FieldTypeNotes
refresh_token*string

200OK

post/v1/auth/logoutRevoke this device token (or all of mine)Token

Link to this endpoint

Request body (application/json)
FieldTypeNotes
all_sessionsbooleandefault false

200OK

get/v1/auth/accessAccess status for the current tokenPublic
post/v1/auth/password/forgotPassword reset email (always 202) (proxied)Public
post/v1/auth/password/resetReset the password with the emailed token (proxied)Public
post/v1/auth/email/verifyVerify the email address (proxied)Public
post/v1/auth/email/verify/resendResend the verification email (proxied)Token
post/v1/auth/reauthenticateStep-up re-authentication (proxied)Token
post/v1/auth/invitations/acceptAccept a SubstratalApps organization invitation (proxied)Public

developer

get/v1/me/tokensMy personal access tokensToken
post/v1/me/tokensCreate a personal access token (shown once; step-up)Token

Link to this endpoint

Request body (application/json)
FieldTypeNotes
name*string1–80 chars
scopes*"profile:read" | "profile:write" | "messages:read" | "messages:write" | "lists:read" | "lists:write" | "documents:read" | "documents:write" | "dm:read" | "dm:write" | "notifications:read" | "social:read" | "social:write" | "media:write" | "exports:run" | "webhooks:manage"[]≥ 1 items
expires_in_daysinteger | null1–365 · default 90

200OK

delete/v1/me/tokens/{id}Revoke a tokenToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/me/webhooksMy webhooksToken
post/v1/me/webhooksAdd a webhook (the signing secret is shown once)Token

Link to this endpoint

Request body (application/json)
FieldTypeNotes
url*string (uri)≤ 2048 chars
events*"message.created" | "message.updated" | "message.deleted" | "mention.created" | "follow.created" | "list.row.created" | "list.row.updated" | "list.row.deleted" | "list.updated" | "document.updated" | "document.published" | "share.granted" | "syndication.failed" | "export.ready"[]≥ 1 items

200OK

patch/v1/me/webhooks/{id}Update URL, events or status (active|paused)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
urlstring (uri)≤ 2048 chars
events"message.created" | "message.updated" | "message.deleted" | "mention.created" | "follow.created" | "list.row.created" | "list.row.updated" | "list.row.deleted" | "list.updated" | "document.updated" | "document.published" | "share.granted" | "syndication.failed" | "export.ready"[]≥ 1 items
status"active" | "paused"

200OK

delete/v1/me/webhooks/{id}Delete a webhookToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/me/webhooks/{id}/testSend a test event (202)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/me/webhooks/{id}/rotate-secretRotate the signing secret (shown once)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/me/webhooks/{id}/deliveriesDelivery log (30 days)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/me/webhooks/{id}/deliveries/{did}/redeliverRedeliver one delivery (202)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
did*pathstring

200OK

get/v1/me/usageMy API, AI and storage usage (?since=&until=&group_by=token|route)Token

Link to this endpoint

Parameters
NameInTypeNotes
sincequerystring (date-time)
untilquerystring (date-time)
group_byquery"token" | "route"default "token"

200OK

dm

get/v1/dm/conversationsConversations (?folder=inbox|trash)Token

Link to this endpoint

Parameters
NameInTypeNotes
folderquery"inbox" | "trash"default "inbox"
limitqueryinteger1–100 · default 25
cursorquerystring

200OK

post/v1/dm/conversationsStart a conversation (direct ones are de-duplicated)Token

Link to this endpoint

Request body (application/json)
FieldTypeNotes
participant_ids*string[]1–31 items
titlestring | null≤ 100 chars

200OK

get/v1/dm/conversations/{id}A conversationToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

patch/v1/dm/conversations/{id}Title (groups) and muteToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
titlestring | null≤ 100 chars
muted_untilstring | null (date-time)
muteboolean

200OK

post/v1/dm/conversations/{id}/leaveLeave (moves to trash)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/dm/conversations/{id}/messagesMessages (newest first; ?cursor= for older, or ?after= for newer, oldest first)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
limitqueryinteger1–100 · default 50
cursorquerystring
afterquerystring

200OK

post/v1/dm/conversations/{id}/messagesSend (Idempotency-Key required)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Idempotency-Key*headerstring1–255 chars
Request body (application/json)
FieldTypeNotes
bodystring≤ 10000 chars · default ""
media_idsstring[]≤ 8 items · default []
reply_to_idstring | null

200OK

patch/v1/dm/messages/{id}Edit within 15 minutes (sender)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
body*string1–10000 chars

200OK

delete/v1/dm/messages/{id}Delete for me (moves to trash; ?for=everyone by the sender within 15 minutes)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
forquery"me" | "everyone"default "me"

200OK

get/v1/dm/messages/deletedMy trashed messages, newest-deleted first (Archived / Deleted)Token

Link to this endpoint

Parameters
NameInTypeNotes
limitqueryinteger1–100 · default 50
cursorquerystring

200OK

post/v1/dm/messages/{id}/restoreRestore from my trashToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

put/v1/dm/messages/{id}/reactions/{emoji}ReactToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
emoji*pathstring

200OK

delete/v1/dm/messages/{id}/reactions/{emoji}Remove reactionToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
emoji*pathstring

200OK

post/v1/dm/conversations/{id}/readMark read up to a messageToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
last_read_message_id*string

200OK

get/v1/dm/unread-countUnread DMs across conversationsToken
get/v1/dm/recipientsPeople I can message (?q=)Token

Link to this endpoint

Parameters
NameInTypeNotes
qquerystring≤ 60 chars · default ""

200OK

get/v1/dm/eligibility/{userId}Can I message this person?Token

Link to this endpoint

Parameters
NameInTypeNotes
userId*pathstring

200OK

post/v1/dm/conversations/{id}/reportReport a conversation (staff may review the reported messages)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
reason*"spam" | "harassment" | "misinformation" | "inappropriate" | "illegal" | "other"
detailstring | null≤ 2000 chars
message_idsstring[]≤ 20 items · default []

200OK

documents

get/v1/documentsMy documents (?scope=mine|shared|watching|all|trash&folder_id=&q=)Token

Link to this endpoint

Parameters
NameInTypeNotes
limitqueryinteger1–100
cursorquerystring
scopequery"mine" | "shared" | "watching" | "all" | "trash"default "mine"
folder_idquerystring
qquerystring≤ 200 chars

200OK

post/v1/documentsCreate a documentToken

Link to this endpoint

Request body (application/json)
FieldTypeNotes
title*string1–200 chars
folder_idstring | null
markdownstring
template_idstring | null
visibility"private" | "link" | "public"default "private"

200OK

get/v1/documents/treeFolders and documents as a treeToken
get/v1/documents/syncDelta sync for the CLI and desktop (?since=ISO)Token

Link to this endpoint

Parameters
NameInTypeNotes
sincequerystring (date-time)
limitqueryinteger1–100 · default 100

200OK

post/v1/documents/syncPush local changes; per-item results (207)Token

Link to this endpoint

Request body (application/json)
FieldTypeNotes
documents*object[]1–100 items
documents[].idstring
documents[].title*string1–200 chars
documents[].folder_idstring | null
documents[].markdown*string
documents[].base_versioninteger
documents[].base_hashstring
documents[].deletedboolean

200OK

get/v1/documents/templatesMy document templates (flagged, or in a _templates folder)Token
post/v1/documents/templates/seed-defaultsCreate the default templates (idempotent)Token
post/v1/documents/from-templateNew document from a templateToken

Link to this endpoint

Request body (application/json)
FieldTypeNotes
template_id*string
titlestring1–200 chars
folder_idstring | null
visibility"private" | "link" | "public"

200OK

get/v1/documents/{id}Metadata + markdown (SSR/read); ?expand=owner adds the ownerPublic

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

patch/v1/documents/{id}Title, folder, visibility, slug (manager+)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
titlestring1–200 chars
folder_idstring | null
visibility"private" | "link" | "public"
slugstring | nullpattern ^[a-z0-9][a-z0-9-]{0,119}$

200OK

delete/v1/documents/{id}Delete (owner; soft)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/documents/{id}/stateBinary Yjs state (compacted state merged with pending updates); ETag = update watermarkToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200Yjs update (application/octet-stream)

Response body: any JSON

post/v1/documents/{id}/updatesAppend a binary Yjs update batch (≤ 256 KB); published to /doc/{id}Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

Request body (application/octet-stream): any JSON

200OK

put/v1/documents/{id}/contentNon-collaborative write {markdown} + If-Match (merged into the Yjs doc server-side)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
markdown*string

200OK

post/v1/documents/{id}/restoreRestore a deleted document (owner)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/documents/{id}/versionsVersion history (automatic + named snapshots)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/documents/{id}/versionsSave a named version (label optional)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
labelstring | null≤ 120 chars

200OK

get/v1/documents/{id}/versions/{vid}A version with its MarkdownToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
vid*pathstring

200OK

post/v1/documents/{id}/versions/{vid}/restoreRestore a version: its content is applied as a new update (the current content is kept as a 'Before restore' version)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
vid*pathstring

200OK

get/v1/documents/{id}/commentsDocument comments (?include_resolved=true)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/documents/{id}/commentsComment (commenter+)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
body*string1–5000 chars
parent_idstring | null
anchorobject (map) | null

200OK

patch/v1/documents/{id}/comments/{cid}Edit my commentToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
cid*pathstring
Request body (application/json)
FieldTypeNotes
body*string1–5000 chars

200OK

delete/v1/documents/{id}/comments/{cid}Delete a comment (author or manager)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
cid*pathstring

200OK

post/v1/documents/{id}/comments/{cid}/resolveResolve (or reopen with {resolved:false})Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
cid*pathstring
Request body (application/json)
FieldTypeNotes
resolvedbooleandefault true

200OK

get/v1/documents/{id}/exportExport (?format=md|html|pdf); pdf is an export jobToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
formatquery"md" | "html" | "pdf"default "md"
inlinequery"true" | "false"

200OK

post/v1/documents/{id}/publishPublish as a blog post (now or at publish_at)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
slugstringpattern ^[a-z0-9][a-z0-9-]{0,119}$
excerptstring | null≤ 500 chars
hero_media_idstring | null
tagsstring[]≤ 10 items · default []
publish_atstring | null (date-time)
announceobject | null
announce.syndicationany

200OK

delete/v1/documents/{id}/publishUnpublishToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/doc-foldersMy document foldersToken
post/v1/doc-foldersCreate a document folderToken

Link to this endpoint

Request body (application/json)
FieldTypeNotes
name*string1–80 chars
parent_idstring | null
is_templatesbooleandefault false

200OK

patch/v1/doc-folders/{id}Rename or move a document folderToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
namestring1–80 chars
parent_idstring | null

200OK

delete/v1/doc-folders/{id}Delete a document folder (documents move to the parent)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/doc-folders/{id}/exportExport a folder of documents (202)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
format"md" | "html" | "pdf"default "md"

200OK

get/v1/blogThe official blog: published posts flagged official (public, regardless of owner claim status)Public

Link to this endpoint

Parameters
NameInTypeNotes
officialquery"true" | "false"
tagquerystring1–64 chars
limitqueryinteger1–100
cursorquerystring

200OK

get/v1/blog/{slug}One official blog post by blog slug (legacy /blog/{slug} URLs)Public

Link to this endpoint

Parameters
NameInTypeNotes
slug*pathstring

200OK

post/v1/blog/subscribeSubscribe to the official blog or a member blog (double opt-in; always 202)Public

Link to this endpoint

Request body (application/json)
FieldTypeNotes
email*string (email)≤ 320 chars
blog*string1–64 chars
websitestring≤ 200 chars

200OK

post/v1/blog/subscribe/confirmConfirm a blog subscription from the emailed link (single use)Public

Link to this endpoint

Request body (application/json)
FieldTypeNotes
token*string8–200 chars

200OK

exports

get/v1/exportsMy exportsToken
post/v1/exportsStart an export (202; Idempotency-Key required)Token

Link to this endpoint

Parameters
NameInTypeNotes
Idempotency-Key*headerstring1–255 chars
Request body (application/json)
FieldTypeNotes
kinds*"messages" | "lists" | "list_rows" | "documents" | "follows" | "bookmarks" | "blog"[]≥ 1 items
format"csv" | "json" | "md"default "json"
scope"mine" | "shared" | "all"default "mine"
include_platform_bundlebooleandefault false

200OK

get/v1/exports/countsRecord counts per export kind for a scope (what an export would include)Token

Link to this endpoint

Parameters
NameInTypeNotes
scopequery"mine" | "shared" | "all"default "mine"

200OK

get/v1/exports/{id}Export status with a 24 h presigned download URL when readyToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

imports

post/v1/importsStart an import from an uploaded file (202)Token

Link to this endpoint

Request body (application/json)
FieldTypeNotes
kind*"list_csv" | "markdown_zip" | "mastodon_archive" | "bluesky_car"
media_id*string
optionsobject (map)default {}

200OK

get/v1/imports/{id}Import statusToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

integrations

get/v1/integrationsConnected accounts with healthToken
post/v1/integrations/{id}/verifyLive provider check (X and Bluesky are queued to the worker: 202)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

patch/v1/integrations/{id}Set default / labelToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
is_defaultboolean
labelstring | null≤ 80 chars

200OK

delete/v1/integrations/{id}Disconnect (tokens are destroyed)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/integrations/linkedin/targetsLinkedIn targets (profile and company pages)Token
put/v1/integrations/linkedin/defaultsDefault LinkedIn targetsToken

Link to this endpoint

Request body (application/json)
FieldTypeNotes
target_ids*string[]≤ 20 items

200OK

get/v1/integrations/github/reposAll my GitHub repositories, or one organization’s (?org=); fully paginatedToken

Link to this endpoint

Parameters
NameInTypeNotes
orgquerystringpattern ^[a-zA-Z0-9](?:[a-zA-Z0-9]|-(?=[a-zA-Z0-9])){0,38}$

200OK

get/v1/integrations/github/orgsMy GitHub organizations (fully paginated)Token
get/v1/integrations/github/repos/{o}/{r}/labelsRepository labels (fully paginated)Token

Link to this endpoint

Parameters
NameInTypeNotes
o*pathstring
r*pathstring

200OK

get/v1/integrations/github/repos/{o}/{r}/assigneesRepository assignees (fully paginated)Token

Link to this endpoint

Parameters
NameInTypeNotes
o*pathstring
r*pathstring

200OK

get/v1/integrations/github/repos/{o}/{r}/next-issue-numberThe number GitHub will give the next issue (issues and PRs share one sequence)Token

Link to this endpoint

Parameters
NameInTypeNotes
o*pathstring
r*pathstring

200OK

get/v1/integrations/github/issuesIssues in a repository (?repo=owner/name&state=open|closed|all), newest first; pull requests are left outToken

Link to this endpoint

Parameters
NameInTypeNotes
repo*querystringpattern ^[\w.-]+\/[\w.-]+$
statequery"open" | "closed" | "all"default "open"
limitqueryinteger1–100 · default 25
cursorquerystringpattern ^[1-9]\d{0,4}$

200OK

post/v1/integrations/github/issuesCreate an issueToken

Link to this endpoint

Request body (application/json)
FieldTypeNotes
repo*stringpattern ^[\w.-]+\/[\w.-]+$
title*string1–256 chars
bodystring≤ 65536 chars
labelsstring[]≤ 100 items
assigneesstring[]≤ 10 items

200OK

patch/v1/integrations/github/issues/{o}/{r}/{n}Update an issue (title, body, state, labels, assignees)Token

Link to this endpoint

Parameters
NameInTypeNotes
o*pathstring
r*pathstring
n*pathstring
Request body (application/json)
FieldTypeNotes
titlestring1–256 chars
bodystring | null≤ 65536 chars
state"open" | "closed"
labelsstring[]≤ 100 items
assigneesstring[]≤ 10 items

200OK

post/v1/integrations/github/issues/{o}/{r}/{n}/commentsComment on an issueToken

Link to this endpoint

Parameters
NameInTypeNotes
o*pathstring
r*pathstring
n*pathstring
Request body (application/json)
FieldTypeNotes
body*string1–65536 chars

200OK

lists

get/v1/listsMy lists (?scope=mine|shared|watching|all|trash&folder_id=&q=); trash is my deleted listsToken

Link to this endpoint

Parameters
NameInTypeNotes
limitqueryinteger1–100
cursorquerystring
scopequery"mine" | "shared" | "watching" | "all" | "trash"default "mine"
folder_idquerystring
qquerystring≤ 200 chars

200OK

post/v1/listsCreate a list (fields, template, initial rows)Token

Link to this endpoint

Request body (application/json), optional: See 05-api-specification.md (recursive schema)

200OK

get/v1/lists/graphNodes and edges for the ERD and tree viewsToken
get/v1/lists/{id}A list (?expand=fields,views,owner,my_role)Public

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

patch/v1/lists/{id}Update title, description, folder, parent, visibility, collaborative, searchable_rows (manager+)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
titlestring1–200 chars
descriptionstring | null≤ 5000 chars
folder_idstring | null
parent_list_idstring | null
visibility"private" | "link" | "public"
collaborativeboolean
searchable_rowsboolean

200OK

delete/v1/lists/{id}Delete (owner; soft, 30 days)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/lists/{id}/restoreRestore a deleted list (owner)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/lists/{id}/duplicateDuplicate into my lists (fields, views, rows)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
titlestring≤ 200 chars
include_rowsbooleandefault true

200OK

post/v1/lists/{id}/transferTransfer ownership (owner); the previous owner keeps managerToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
to_user_idstring
handlestring1–64 chars

200OK

get/v1/lists/{id}/fieldsFields (?include_archived=true)Public

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/lists/{id}/fieldsAdd a field (manager+; If-Match schema version)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

Request body (application/json), optional: See 05-api-specification.md (recursive schema)

200OK

patch/v1/lists/{id}/fields/{key}Change a field; type changes are non-destructive (?dry_run=true lists failing rows); null clears an optional propertyToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
key*pathstring

Request body (application/json), optional: See 05-api-specification.md (recursive schema)

200OK

delete/v1/lists/{id}/fields/{key}Archive a field (data kept 30 days)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
key*pathstring

200OK

post/v1/lists/{id}/fields/{key}/restoreRestore an archived fieldToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
key*pathstring

200OK

put/v1/lists/{id}/fields:orderReorder fieldsToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
keys*string[]1–200 items

200OK

get/v1/lists/{id}/rowsRows with server-side filter/sort (?view_id=&filter=<RuleGroup JSON>&sort=field:asc&q=); keyset, or ?offset= for numbered pagesPublic

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
limitqueryinteger1–100
cursorquerystring
view_idquerystring
filterquerystring≤ 10000 chars
sortquerystring≤ 200 chars
qquerystring≤ 200 chars
offsetqueryinteger | null0–10000

200OK

post/v1/lists/{id}/rowsAdd a row (editor+)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
data*object (map)
after_idstring

200OK

post/v1/lists/{id}/rows:batchAdd ≤ 500 rows, all-or-nothing validation (Idempotency-Key required)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Idempotency-Key*headerstring1–255 chars
Request body (application/json)
FieldTypeNotes
rows*object (map)[]1–500 items

200OK

post/v1/lists/{id}/rows:batch-deleteSoft-delete ≤ 500 rows, all-or-nothing (editor+)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
row_ids*string[]1–500 items

200OK

get/v1/lists/{id}/rows/{rowId}A rowPublic

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
rowId*pathstring

200OK

patch/v1/lists/{id}/rows/{rowId}{changes, expect} + If-Match → 200, or 409 {conflicts[]} (field-level merge in one statement)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
rowId*pathstring
Request body (application/json)
FieldTypeNotes
changes*object (map)
expectobject (map)

200OK

delete/v1/lists/{id}/rows/{rowId}Delete a row (soft; on a GitHub-backed list, closes the issue and keeps the row)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
rowId*pathstring

200OK

post/v1/lists/{id}/rows/{rowId}/restoreRestore a deleted row (on a GitHub-backed list, reopens the issue)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
rowId*pathstring

200OK

put/v1/lists/{id}/rows/{rowId}/positionMove a row ({after_id | before_id}; fractional index)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
rowId*pathstring
Request body (application/json)
FieldTypeNotes
after_idstring | null
before_idstring | null

200OK

get/v1/lists/{id}/rows/{rowId}/historyRow historyToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
rowId*pathstring
limitqueryinteger1–100
cursorquerystring

200OK

post/v1/lists/{id}/rows/{rowId}/history/{version}/restoreRestore a row to a historical versionToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
rowId*pathstring
version*pathstring

200OK

get/v1/lists/{id}/rows/{rowId}/commentsRow commentsToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
rowId*pathstring

200OK

post/v1/lists/{id}/rows/{rowId}/commentsComment on a row (commenter+)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
rowId*pathstring
Request body (application/json)
FieldTypeNotes
body*string1–5000 chars
parent_idstring | null

200OK

patch/v1/lists/{id}/rows/{rowId}/comments/{commentId}Edit my commentToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
rowId*pathstring
commentId*pathstring
Request body (application/json)
FieldTypeNotes
body*string1–5000 chars

200OK

delete/v1/lists/{id}/rows/{rowId}/comments/{commentId}Delete a comment (author or manager)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
rowId*pathstring
commentId*pathstring

200OK

post/v1/lists/{id}/importImport CSV/TSV into the list (202; import job)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
media_id*string
mappingobject (map)default {}

200OK

get/v1/lists/{id}/exportExport (?format=csv|json|md); small lists inline, large ones become an export jobToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
formatquery"csv" | "json" | "md"default "csv"

200OK

post/v1/lists/{id}/syncRefresh a GitHub-backed listToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/lists/{id}/rssRSS of recent rows (public lists only)Public

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/lists/{id}/contributorsPeople who created or edited rowsToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/lists/{id}/viewsShared views plus my personal viewsToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/lists/{id}/viewsCreate a view (shared views need manager+)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

Request body (application/json), optional: See 05-api-specification.md (recursive schema)

200OK

patch/v1/lists/{id}/views/{viewId}Update a viewToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
viewId*pathstring

Request body (application/json), optional: See 05-api-specification.md (recursive schema)

200OK

delete/v1/lists/{id}/views/{viewId}Delete a viewToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
viewId*pathstring

200OK

post/v1/lists/{id}/views/{viewId}/forkFork a view into a personal copyToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
viewId*pathstring

200OK

put/v1/lists/{id}/views/prefsMy last/default viewToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
last_view_idstring | null
default_view_idstring | null

200OK

get/v1/list-foldersMy list foldersToken
post/v1/list-foldersCreate a list folderToken

Link to this endpoint

Request body (application/json)
FieldTypeNotes
name*string1–80 chars
parent_idstring | null

200OK

patch/v1/list-folders/{id}Rename or move a list folderToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
namestring1–80 chars
parent_idstring | null
positionstring≤ 64 chars

200OK

delete/v1/list-folders/{id}Delete a list folder (?contents=keep moves its lists and subfolders to the parent; delete also deletes my lists anywhere inside it, soft, and its subfolders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
contentsquery"keep" | "delete"default "keep"

200OK

get/v1/list-connectionsConnections between my lists (?list_id=)Token

Link to this endpoint

Parameters
NameInTypeNotes
list_idquerystring

200OK

post/v1/list-connectionsConnect two listsToken

Link to this endpoint

Request body (application/json)
FieldTypeNotes
from_list_id*string
to_list_id*string
labelstring | null≤ 80 chars

200OK

delete/v1/list-connections/{id}Remove a connectionToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/list-templatesGlobal and my list templatesToken
post/v1/list-templatesCreate a personal list templateToken

Link to this endpoint

Request body (application/json), optional: See 05-api-specification.md (recursive schema)

200OK

post/v1/lists/{id}/save-as-templateSave a list’s fields (and up to 10 sample rows) as a templateToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
namestring1–120 chars
include_rowsbooleandefault false

200OK

materialize

post/v1/materialize/previewPropose a schema, rows and Markdown from sourcesToken

Link to this endpoint

Request body (application/json)
FieldTypeNotes
source*object
source.type*"messages" | "list" | "rows" | "document" | "selection"
source.idsstring[]≤ 500 items · default []
source.list_idstring
source.selectionobject
source.selection.text*string≤ 100000 chars
target*"list" | "document" | "list_and_document" | "message"
optionsobjectdefault {}
options.titlestring≤ 200 chars

200OK

post/v1/materializeCreate from sources (re-fetches and re-authorizes all sources)Token

Link to this endpoint

Request body (application/json), optional: See 05-api-specification.md (recursive schema)

200OK

me

get/v1/meThe signed-in user: projection, profile, handle, access, standingToken

Link to this endpoint

200Me

Response body
FieldTypeNotes
id*stringpattern ^u_[0-7][0-9A-HJKMNP-TV-Z]{25}$
handle*stringpattern ^[a-z0-9_]{3,30}$
display_name*string≤ 100 chars
avatar_url*string | null (uri)
header_url*string | null (uri)
bio*string | null≤ 500 chars
links*object[]≤ 4 items
links[].url*string (uri)≤ 2048 chars
links[].labelstring≤ 60 chars
links[].verifiedbooleandefault false
pronouns*string | null≤ 40 chars
location_label*string | null≤ 100 chars
is_private*boolean
noindex*boolean
inactive*boolean
redacted*boolean
counts*object
counts.messages*integer≥ 0
counts.followers*integer≥ 0
counts.following*integer≥ 0
counts.listsinteger≥ 0
counts.documentsinteger≥ 0
pinned*object[]≤ 3 items
pinned[].type*"message" | "list" | "document"
pinned[].id*string
created_at*string (date-time)
viewerobject
viewer.following*"none" | "pending" | "accepted"
viewer.followed_by*boolean
viewer.blocking*boolean
viewer.muting*boolean
substratal_user_id*string
email_verified*boolean
access*"active" | "none" | "lapsed"
standing*"active" | "restricted" | "suspended" | "banned"
timezone*string | null
locale*string | null
get/v1/me/capabilitiesCapabilities from the single server-side functionToken

Link to this endpoint

200Capabilities

Response body
FieldTypeNotes
access*"active" | "none" | "lapsed"
roles*string[]
permissions*string[]
standing*"active" | "restricted" | "suspended" | "banned"
email_verified*boolean
limits*object (map)
can*object (map)
denials*object (map)
patch/v1/me/profileUpdate profile (display_name writes through to SubstratalApps)Token

Link to this endpoint

Request body (application/json)
FieldTypeNotes
display_namestring1–100 chars
biostring | null≤ 500 chars
linksobject[]≤ 4 items
links[].url*string (uri)≤ 2048 chars
links[].labelstring≤ 60 chars
pronounsstring | null≤ 40 chars
location_labelstring | null≤ 100 chars
pinnedobject[]≤ 3 items
pinned[].type*"message" | "list" | "document"
pinned[].id*string

200OK

put/v1/me/handleClaim or change the handle (409 handle_taken, 429 once per 30 days)Token

Link to this endpoint

Request body (application/json)
FieldTypeNotes
handle*string1–40 chars

200OK

get/v1/handles/{handle}/availabilityIs a handle available?Public

Link to this endpoint

Parameters
NameInTypeNotes
handle*pathstring

200OK

get/v1/me/settingsPer-app settings (resolved/overrides) plus SQL-projected fieldsToken
patch/v1/me/settingsUpdate settings; SQL-filtered keys are copied onto the users row in the same requestToken

Link to this endpoint

Request body (application/json)
FieldTypeNotes
is_privateboolean
dm_policy"mutuals" | "following" | "anyone"
mention_policy"anyone" | "following" | "nobody"
discoverableboolean
noindexboolean
show_replies_in_timelineboolean
timezonestring1–64 chars
default_timeline_tab"following" | "everything" | "mine" | "followers"
remember_timeline_tabboolean
message_soft_limitinteger | null100–5000

200OK

post/v1/me/header/uploadsStart a profile header image upload (IL media flow)Token

Link to this endpoint

Request body (application/json)
FieldTypeNotes
content_type*string
bytes*integer

200OK

get/v1/me/emailCurrent and pending email (proxied to SubstratalApps)Token
post/v1/me/emailChange email (pending verification; proxied to SubstratalApps)Token

Link to this endpoint

Request body (application/json)
FieldTypeNotes
email*string (email)≤ 254 chars

200OK

post/v1/me/avatar/from-urlSet the avatar from an image URL: fetched server-side (SSRF-safe), then the SubstratalApps avatar flowToken

Link to this endpoint

Request body (application/json)
FieldTypeNotes
url*string1–2048 chars

200OK

post/v1/me/avatar/uploadsStart an avatar upload (SubstratalApps avatar flow) (proxied to SubstratalApps)Token
post/v1/me/avatar/uploads/{id}/completeComplete an avatar upload (proxied to SubstratalApps)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

delete/v1/me/avatarRemove the avatar (proxied to SubstratalApps)Token
get/v1/me/sessionsList platform sessions (proxied to SubstratalApps)Token
delete/v1/me/sessions/{id}Revoke a session (proxied to SubstratalApps)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/me/sessions/revoke-allRevoke all other sessions (proxied to SubstratalApps)Token
post/v1/me/mfa/totpStart TOTP enrollment (step-up) (proxied to SubstratalApps)Token
post/v1/me/mfa/totp/confirmConfirm TOTP (proxied to SubstratalApps)Token
post/v1/me/mfa/totp/disableDisable TOTP (proxied to SubstratalApps)Token
post/v1/me/passwordChange password (proxied to SubstratalApps)Token
get/v1/me/subscriptionSubstratalApps subscription summary (proxied to SubstratalApps)Token
post/v1/me/subscription/portalBilling portal session (proxied to SubstratalApps)Token
post/v1/me/deletionRequest account deletion (step-up) (proxied to SubstratalApps)Token
delete/v1/me/deletionCancel account deletion (proxied to SubstratalApps)Token
get/v1/me/devicesPush devices (proxied to SubstratalApps)Token
post/v1/me/devicesRegister a push device (proxied to SubstratalApps)Token
delete/v1/me/devices/{id}Remove a push device (proxied to SubstratalApps)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

media

post/v1/media/uploadsStart an upload: presigned S3 POST to raw/Token

Link to this endpoint

Request body (application/json)
FieldTypeNotes
kind"image" | "video" | "file"default "image"
content_type*string3–100 chars
bytes*integer
purpose"message" | "dm" | "document" | "list_cell" | "header" | "blog_hero" | "import"default "message"

200OK

get/v1/media/{id}Media status, variants and (signed) URLsToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

patch/v1/media/{id}Set alt textToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
alt_text*string | null≤ 1500 chars

200OK

post/v1/media/{id}/alt-text:suggestAI alt-text suggestion (async; ai.done on user channel)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/media/cookiesCloudFront signed cookies for private media (/media/s/*), 1 hour; the BFF sets themToken

messages

post/v1/messagesCompose a message (201 with syndication[] pending). Idempotency-Key requiredToken

Link to this endpoint

Parameters
NameInTypeNotes
Idempotency-Key*headerstring1–255 chars
Request body (application/json)
FieldTypeNotes
contentstring≤ 5000 chars · default ""
tagsstring[]≤ 10 items · default []
visibility*"public" | "followers" | "private" | "org"
org_idstring | nullpattern ^org_[0-9A-Za-z]+$ · default null
content_warningstring | null≤ 200 chars · default null
kind"post" | "reply" | "quote"default "post"
parent_idstring | nullpattern ^m_[0-7][0-9A-HJKMNP-TV-Z]{25}$ · default null
subject_idstring | nullpattern ^m_[0-7][0-9A-HJKMNP-TV-Z]{25}$ · default null
media_idsstring[]≤ 8 items · default []
scheduled_atstring | null (date-time)default null
syndicationobject
syndication.targets*object[]≤ 20 items
syndication.targets[].account_id*stringpattern ^sa_[0-7][0-9A-HJKMNP-TV-Z]{25}$
syndication.targets[].target_refstring | nulldefault null
syndication.linkedin_link_as_first_commentbooleandefault false
draft_idstring | nullpattern ^m_[0-7][0-9A-HJKMNP-TV-Z]{25}$ · default null
link_previewbooleandefault true

200OK

get/v1/messages/{id}A message (?expand=thread_context,subject)Public

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

patch/v1/messages/{id}Edit content/CW/visibility (narrowing only); scheduled messages can be rescheduled and their cross-post targets changed. If-MatchToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
contentstring≤ 5000 chars
content_warningstring | null≤ 200 chars
visibility"public" | "followers" | "private"
tagsstring[]≤ 10 items
scheduled_atstring | null (date-time)
syndicate_editboolean
syndicationobject | null
syndication.targets*object[]≤ 20 items
syndication.targets[].account_id*stringpattern ^sa_[0-7][0-9A-HJKMNP-TV-Z]{25}$
syndication.targets[].target_refstring | nulldefault null
syndication.linkedin_link_as_first_commentbooleandefault false

200OK

delete/v1/messages/{id}Delete (soft); cross-posted copies are always deleted tooToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/messages/{id}/editsEdit history (if the message is visible)Public

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/messages/{id}/thread{ancestors[], message, replies (tree, depth ≤ 6)}Public

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/messages/{id}/repliesDirect replies (paged, oldest first)Public

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
limitqueryinteger1–100
cursorquerystring

200OK

put/v1/messages/{id}/digDig (idempotent)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

delete/v1/messages/{id}/digRemove a digToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/messages/{id}/diggersWho dug (author only, D-12)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
limitqueryinteger1–100
cursorquerystring

200OK

post/v1/messages/{id}/pushPush (repost); public messages only. Boosts the remote copy of the original from the chosen/default accounts on each network it reachedToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
syndicationobject
syndication.targets*object[]≤ 20 items
syndication.targets[].account_id*string
syndication.targets[].target_refstring | nulldefault null

200OK

delete/v1/messages/{id}/pushUndo a pushToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

put/v1/me/bookmarks/{messageId}BookmarkToken

Link to this endpoint

Parameters
NameInTypeNotes
messageId*pathstring
Request body (application/json)
FieldTypeNotes
folderstring | null≤ 80 chars

200OK

delete/v1/me/bookmarks/{messageId}Remove a bookmarkToken

Link to this endpoint

Parameters
NameInTypeNotes
messageId*pathstring

200OK

get/v1/me/bookmarksBookmarks (?folder=)Token

Link to this endpoint

Parameters
NameInTypeNotes
limitqueryinteger1–100
cursorquerystring
folderquerystring

200OK

get/v1/me/draftsDrafts (autosaved)Token

Link to this endpoint

Parameters
NameInTypeNotes
limitqueryinteger1–100
cursorquerystring

200OK

post/v1/me/draftsSave a draftToken

Link to this endpoint

Request body (application/json)
FieldTypeNotes
contentstring≤ 5000 chars · default ""
tagsstring[]≤ 10 items · default []
visibility"public" | "followers" | "private"default "public"
content_warningstring | null≤ 200 chars · default null
kind"post" | "reply" | "quote"default "post"
parent_idstring | nulldefault null
subject_idstring | nulldefault null
media_idsstring[]≤ 8 items · default []
syndicationany

200OK

get/v1/me/scheduledScheduled messages (?from=&to= window on scheduled_at; from inclusive, to exclusive)Token

Link to this endpoint

Parameters
NameInTypeNotes
limitqueryinteger1–100
cursorquerystring
fromquerystring (date-time)
toquerystring (date-time)

200OK

get/v1/me/messagesMy published messages (incl. pushes), newest first, with a per-account syndication summaryToken

Link to this endpoint

Parameters
NameInTypeNotes
limitqueryinteger1–100
cursorquerystring

200OK

get/v1/me/syndication/failed-deletesCross-posted copies of my deleted messages that could not be deleted (retry via /messages/{id}/syndication/{jobId}/retry)Token
patch/v1/me/drafts/{id}Update a draftToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
contentstring≤ 5000 chars
tagsstring[]≤ 10 items
visibility"public" | "followers" | "private"
content_warningstring | null≤ 200 chars
kind"post" | "reply" | "quote"
parent_idstring | null
subject_idstring | null
media_idsstring[]≤ 8 items
syndicationany

200OK

delete/v1/me/drafts/{id}Delete a draftToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/me/drafts/{id}/publishPublish a draft (optionally scheduled)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
scheduled_atstring | null (date-time)

200OK

post/v1/messages/{id}/publish-nowPublish a scheduled message nowToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/messages/{id}/unscheduleCancel a scheduled message back to a draftToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/messages/{id}/syndicationSyndication jobs for my messageToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/me/engagementDigs, pushes and replies I received (?window=day|week|month) and recent eventsToken

Link to this endpoint

Parameters
NameInTypeNotes
windowquery"day" | "week" | "month"default "week"

200OK

get/v1/me/syndication/failuresMy recently failed cross-posts (?days=1..30, default 7)Token

Link to this endpoint

Parameters
NameInTypeNotes
daysqueryinteger1–30 · default 7

200OK

post/v1/messages/{id}/external-counts/refreshRefresh engagement counts from cross-posted copies (at most every 10 minutes)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/messages/{id}/syndication/{jobId}/retryRetry a failed syndication job (on a deleted message, only its remote deletes)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
jobId*pathstring

200OK

post/v1/messages/{id}/link-previews/refreshRe-fetch the link cards of your message, bypassing the preview cache (once per 5 minutes per message; link_preview.ready on the user channel)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

meta

get/healthShallow health check (no database call)Public
get/v1/limitsPublic fair-use limits and accepted media formats (the only source for help, pricing and composer)Public

Link to this endpoint

200Limits

Response body
FieldTypeNotes
limits*object (map)
media_formatsany
get/v1/sitemap/{kind}Indexable public URLs with lastmod for one sitemap kind (profiles|posts|lists|documents|tags)Public

Link to this endpoint

Parameters
NameInTypeNotes
kind*pathstring

200OK

notifications

get/v1/notificationsNotification inbox (SubstratalApps), hydrated with IL objectsToken

Link to this endpoint

Parameters
NameInTypeNotes
statequery"unread" | "read" | "archived"
categoryquerystring≤ 64 chars
limitqueryinteger1–100 · default 25
cursorquerystring

200OK

get/v1/notifications/unread-countUnread countToken
patch/v1/notifications/{id}Mark read/unread/archived (IL "delete" archives)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
state*"read" | "unread" | "archived"

200OK

post/v1/notifications/mark-readMark read ({ids[]} or {before})Token

Link to this endpoint

Request body (application/json)
FieldTypeNotes
idsstring[]≤ 100 items
beforestring (date-time)

200OK

get/v1/me/notification-preferencesNotification matrix (category × in_app/push/email)Token
put/v1/me/notification-preferencesReplace the notification matrixToken

Link to this endpoint

Request body (application/json)
FieldTypeNotes
matrix*object (map)

200OK

get/v1/unsubscribeOne-click unsubscribe (?t= signed token from the email footer)Public

Link to this endpoint

Parameters
NameInTypeNotes
t*querystring≤ 2000 chars

200OK

post/v1/unsubscribeRFC 8058 List-Unsubscribe-Post target (?t=)Public

realtime

post/v1/realtime/ticketShort-lived ticket listing allowed channels (validated by interlinedlist-rt-auth)Token

Link to this endpoint

Request body (application/json)
FieldTypeNotes
channelsstring[]≤ 50 items · default []

200OK

safety

post/v1/users/{id}/reportReport a user (reporting again updates the report)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
reason*"spam" | "harassment" | "misinformation" | "inappropriate" | "illegal" | "other"
detailstring | null≤ 2000 chars

200OK

put/v1/me/blocks/{id}Block (removes follows both ways)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

delete/v1/me/blocks/{id}UnblockToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/me/blocksBlocked accountsToken

Link to this endpoint

Parameters
NameInTypeNotes
limitqueryinteger1–100
cursorquerystring

200OK

put/v1/me/mutes/{id}Mute (optionally until)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
untilstring | null (date-time)

200OK

delete/v1/me/mutes/{id}UnmuteToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/me/mutesMuted accountsToken

Link to this endpoint

Parameters
NameInTypeNotes
limitqueryinteger1–100
cursorquerystring

200OK

get/v1/me/muted-wordsMuted wordsToken
post/v1/me/muted-wordsAdd a muted wordToken

Link to this endpoint

Request body (application/json)
FieldTypeNotes
phrase*string1–100 chars
whole_wordbooleandefault false
untilstring | null (date-time)

200OK

delete/v1/me/muted-words/{id}Remove a muted wordToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/messages/{id}/reportReport a message (reporting again updates the report)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
reason*"spam" | "harassment" | "misinformation" | "inappropriate" | "illegal" | "other"
detailstring | null≤ 2000 chars

200OK

get/v1/exploreTrending, featured, new peoplePublic

sharing

get/v1/lists/{id}/accessEffective grants, links and invites + my_role (lists)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/lists/{id}/grantsGrant access (manager+; up to your own role) (lists)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
principal_type*"user" | "org"
principal_idstring
handlestring
role*"viewer" | "commenter" | "editor" | "manager"
expires_atstring | null (date-time)
notify_emailboolean

200OK

patch/v1/lists/{id}/grants/{grantId}Change a grant (lists)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
grantId*pathstring
Request body (application/json)
FieldTypeNotes
role"viewer" | "commenter" | "editor" | "manager"
expires_atstring | null (date-time)

200OK

delete/v1/lists/{id}/grants/{grantId}Revoke a grant (manager+, or the grantee removing themself) (lists)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
grantId*pathstring

200OK

post/v1/lists/{id}/linksCreate a share link; the token is shown once (lists)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
role*"viewer" | "commenter" | "editor"
expires_atstring (date-time) | "never" | "1d" | "7d" | "30d" | nulldefault "never"
passwordstring4–128 chars

200OK

post/v1/lists/{id}/invitesInvite by email (lists)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
email*string (email)≤ 320 chars
role*"viewer" | "commenter" | "editor" | "manager"
expires_atstring | null

200OK

delete/v1/lists/{id}/invites/{inviteId}Revoke an invite (lists)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
inviteId*pathstring

200OK

put/v1/lists/{id}/watchWatch for changes (lists)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
mode"digest" | "immediate"default "digest"

200OK

delete/v1/lists/{id}/watchStop watching (lists)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/documents/{id}/accessEffective grants, links and invites + my_role (documents)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/documents/{id}/grantsGrant access (manager+; up to your own role) (documents)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
principal_type*"user" | "org"
principal_idstring
handlestring
role*"viewer" | "commenter" | "editor" | "manager"
expires_atstring | null (date-time)
notify_emailboolean

200OK

patch/v1/documents/{id}/grants/{grantId}Change a grant (documents)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
grantId*pathstring
Request body (application/json)
FieldTypeNotes
role"viewer" | "commenter" | "editor" | "manager"
expires_atstring | null (date-time)

200OK

delete/v1/documents/{id}/grants/{grantId}Revoke a grant (manager+, or the grantee removing themself) (documents)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
grantId*pathstring

200OK

post/v1/documents/{id}/linksCreate a share link; the token is shown once (documents)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
role*"viewer" | "commenter" | "editor"
expires_atstring (date-time) | "never" | "1d" | "7d" | "30d" | nulldefault "never"
passwordstring4–128 chars

200OK

post/v1/documents/{id}/invitesInvite by email (documents)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
email*string (email)≤ 320 chars
role*"viewer" | "commenter" | "editor" | "manager"
expires_atstring | null

200OK

delete/v1/documents/{id}/invites/{inviteId}Revoke an invite (documents)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
inviteId*pathstring

200OK

put/v1/documents/{id}/watchWatch for changes (documents)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
mode"digest" | "immediate"default "digest"

200OK

delete/v1/documents/{id}/watchStop watching (documents)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/list-folders/{id}/accessEffective grants, links and invites + my_role (list-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/list-folders/{id}/grantsGrant access (manager+; up to your own role) (list-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
principal_type*"user" | "org"
principal_idstring
handlestring
role*"viewer" | "commenter" | "editor" | "manager"
expires_atstring | null (date-time)
notify_emailboolean

200OK

patch/v1/list-folders/{id}/grants/{grantId}Change a grant (list-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
grantId*pathstring
Request body (application/json)
FieldTypeNotes
role"viewer" | "commenter" | "editor" | "manager"
expires_atstring | null (date-time)

200OK

delete/v1/list-folders/{id}/grants/{grantId}Revoke a grant (manager+, or the grantee removing themself) (list-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
grantId*pathstring

200OK

post/v1/list-folders/{id}/linksCreate a share link; the token is shown once (list-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
role*"viewer" | "commenter" | "editor"
expires_atstring (date-time) | "never" | "1d" | "7d" | "30d" | nulldefault "never"
passwordstring4–128 chars

200OK

post/v1/list-folders/{id}/invitesInvite by email (list-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
email*string (email)≤ 320 chars
role*"viewer" | "commenter" | "editor" | "manager"
expires_atstring | null

200OK

delete/v1/list-folders/{id}/invites/{inviteId}Revoke an invite (list-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
inviteId*pathstring

200OK

put/v1/list-folders/{id}/watchWatch for changes (list-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
mode"digest" | "immediate"default "digest"

200OK

delete/v1/list-folders/{id}/watchStop watching (list-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/doc-folders/{id}/accessEffective grants, links and invites + my_role (doc-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/doc-folders/{id}/grantsGrant access (manager+; up to your own role) (doc-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
principal_type*"user" | "org"
principal_idstring
handlestring
role*"viewer" | "commenter" | "editor" | "manager"
expires_atstring | null (date-time)
notify_emailboolean

200OK

patch/v1/doc-folders/{id}/grants/{grantId}Change a grant (doc-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
grantId*pathstring
Request body (application/json)
FieldTypeNotes
role"viewer" | "commenter" | "editor" | "manager"
expires_atstring | null (date-time)

200OK

delete/v1/doc-folders/{id}/grants/{grantId}Revoke a grant (manager+, or the grantee removing themself) (doc-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
grantId*pathstring

200OK

post/v1/doc-folders/{id}/linksCreate a share link; the token is shown once (doc-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
role*"viewer" | "commenter" | "editor"
expires_atstring (date-time) | "never" | "1d" | "7d" | "30d" | nulldefault "never"
passwordstring4–128 chars

200OK

post/v1/doc-folders/{id}/invitesInvite by email (doc-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
email*string (email)≤ 320 chars
role*"viewer" | "commenter" | "editor" | "manager"
expires_atstring | null

200OK

delete/v1/doc-folders/{id}/invites/{inviteId}Revoke an invite (doc-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
inviteId*pathstring

200OK

put/v1/doc-folders/{id}/watchWatch for changes (doc-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
mode"digest" | "immediate"default "digest"

200OK

delete/v1/doc-folders/{id}/watchStop watching (doc-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/shared/{token}Resolve a share link (password in X-Share-Password)Public

Link to this endpoint

Parameters
NameInTypeNotes
token*pathstring

200OK

post/v1/shared/{token}/claimAttach a link’s role to the signed-in user as a grantToken

Link to this endpoint

Parameters
NameInTypeNotes
token*pathstring

200OK

get/v1/invites/{token}Resolve an email invite for its landing pagePublic

Link to this endpoint

Parameters
NameInTypeNotes
token*pathstring

200OK

post/v1/invites/{token}/acceptAccept an email invite (verified email must match)Token

Link to this endpoint

Parameters
NameInTypeNotes
token*pathstring

200OK

get/v1/shared-with-meEverything shared with me (?type=lists|documents|list-folders|doc-folders)Token

Link to this endpoint

Parameters
NameInTypeNotes
typequery"lists" | "documents" | "list-folders" | "doc-folders"

200OK

social

post/v1/users/{id}/followFollow (returns accepted|pending)Token

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

delete/v1/users/{id}/followUnfollow or cancel a requestToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

get/v1/me/follow-requests/countPending follow request counts {incoming, outgoing}Token
get/v1/me/follow-requestsFollow requests (?direction=incoming|outgoing)Token

Link to this endpoint

Parameters
NameInTypeNotes
limitqueryinteger1–100
cursorquerystring
directionquery"incoming" | "outgoing"default "incoming"

200OK

post/v1/me/follow-requests/{usr}/approveApprove a follow requestToken

Link to this endpoint

Parameters
NameInTypeNotes
usr*pathstring

200OK

post/v1/me/follow-requests/{usr}/rejectReject a follow requestToken

Link to this endpoint

Parameters
NameInTypeNotes
usr*pathstring

200OK

delete/v1/me/followers/{id}Remove a followerToken

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring

200OK

subscribe

get/v1/subscribe/pricesSubstratalApps Standard prices (live)Public
post/v1/subscribe/checkoutStart checkout (platform session; Idempotency-Key required)Token

Link to this endpoint

Parameters
NameInTypeNotes
Idempotency-Key*headerstring1–255 chars

200OK

post/v1/subscribe/confirmConfirm checkout and mint accessToken

tags

get/v1/tags/autocompleteTag autocomplete (?q=)Public

Link to this endpoint

Parameters
NameInTypeNotes
q*querystring1–64 chars
limitqueryinteger1–20 · default 10

200OK

get/v1/tags/{tag}/messagesMessages with a tagPublic

Link to this endpoint

Parameters
NameInTypeNotes
tag*pathstring
limitqueryinteger1–100
cursorquerystring

200OK

put/v1/me/tag-follows/{tag}Follow a tagToken

Link to this endpoint

Parameters
NameInTypeNotes
tag*pathstring

200OK

delete/v1/me/tag-follows/{tag}Unfollow a tagToken

Link to this endpoint

Parameters
NameInTypeNotes
tag*pathstring

200OK

get/v1/me/tag-followsFollowed tagsToken

timeline

get/v1/timelineTimeline (?tab=following|everything|mine|followers); keysetPublic

Link to this endpoint

Parameters
NameInTypeNotes
limitqueryinteger1–100
cursorquerystring
tabquery"following" | "everything" | "mine" | "followers"default "following"

200OK

get/v1/timeline/updatesCount + newest id since a message id (realtime covers this normally)Token

Link to this endpoint

Parameters
NameInTypeNotes
since*querystring
tabquery"following" | "everything"default "following"

200OK

users

get/v1/users/suggestionsWho to followToken

Link to this endpoint

Parameters
NameInTypeNotes
limitqueryinteger1–50 · default 10

200OK

get/v1/users/{idOrHandle}Public profile (viewer-aware; private accounts redacted)Public

Link to this endpoint

Parameters
NameInTypeNotes
idOrHandle*pathstring

200Profile

Response body
FieldTypeNotes
id*stringpattern ^u_[0-7][0-9A-HJKMNP-TV-Z]{25}$
handle*stringpattern ^[a-z0-9_]{3,30}$
display_name*string≤ 100 chars
avatar_url*string | null (uri)
header_url*string | null (uri)
bio*string | null≤ 500 chars
links*object[]≤ 4 items
links[].url*string (uri)≤ 2048 chars
links[].labelstring≤ 60 chars
links[].verifiedbooleandefault false
pronouns*string | null≤ 40 chars
location_label*string | null≤ 100 chars
is_private*boolean
noindex*boolean
inactive*boolean
redacted*boolean
counts*object
counts.messages*integer≥ 0
counts.followers*integer≥ 0
counts.following*integer≥ 0
counts.listsinteger≥ 0
counts.documentsinteger≥ 0
pinned*object[]≤ 3 items
pinned[].type*"message" | "list" | "document"
pinned[].id*string
created_at*string (date-time)
viewerobject
viewer.following*"none" | "pending" | "accepted"
viewer.followed_by*boolean
viewer.blocking*boolean
viewer.muting*boolean
get/v1/users/{id}/messagesA user's messages (?kind=posts|replies|media|dug)Public

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
limitqueryinteger1–100
cursorquerystring
kindquery"posts" | "replies" | "media" | "dug"default "posts"

200OK

get/v1/users/{id}/listsA user's public listsPublic

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
limitqueryinteger1–100
cursorquerystring

200OK

get/v1/users/{id}/documentsA user's public documentsPublic

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
limitqueryinteger1–100
cursorquerystring

200OK

get/v1/users/{id}/blogA user's published blog postsPublic

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
limitqueryinteger1–100
cursorquerystring

200OK

get/v1/users/{handle}/lists/{slug}A list by owner handle and slug (or id)Public

Link to this endpoint

Parameters
NameInTypeNotes
handle*pathstring
slug*pathstring

200OK

get/v1/users/{handle}/documents/{slug}A document by owner handle and slug (or id)Public

Link to this endpoint

Parameters
NameInTypeNotes
handle*pathstring
slug*pathstring

200OK

get/v1/users/{handle}/blog/{slug}A published blog post by slugPublic

Link to this endpoint

Parameters
NameInTypeNotes
handle*pathstring
slug*pathstring

200OK

get/v1/users/{id}/followersfollowers (honors privacy)Public

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
limitqueryinteger1–100
cursorquerystring

200OK

get/v1/users/{id}/followingfollowing (honors privacy)Public

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
limitqueryinteger1–100
cursorquerystring

200OK

get/v1/users/{id}/mutualsmutuals (honors privacy)Public

Link to this endpoint

Parameters
NameInTypeNotes
id*pathstring
limitqueryinteger1–100
cursorquerystring

200OK

webhooks

post/hooks/substratalSubstratalApps webhook receiver (signed, de-duplicated, handled inline)
post/hooks/githubGitHub webhooks for GitHub-backed lists
post/hooks/sesSES bounce/complaint notifications via SNS

admin

get/v1/admin/reportsReport queue (?status=)Admin

Link to this endpoint · Requires an app role (moderator/admin).

Parameters
NameInTypeNotes
statusquery"open" | "in_review" | "actioned" | "dismissed"default "open"
limitqueryinteger1–100 · default 50

200OK

get/v1/admin/reports/{id}A report with snapshot and related actionsAdmin

Link to this endpoint · Requires an app role (moderator/admin).

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/admin/reports/{id}/actionsAct on a reportAdmin

Link to this endpoint · Requires an app role (moderator/admin).

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
action*"dismiss" | "in_review" | "remove_content" | "warn" | "restrict" | "suspend" | "ban"
reasonstring | null≤ 2000 chars
untilstring | null (date-time)

200OK

get/v1/admin/appealsAppeals queueAdmin

Link to this endpoint · Requires an app role (moderator/admin).

200OK

post/v1/admin/appeals/{id}/decideDecide an appealAdmin

Link to this endpoint · Requires an app role (moderator/admin).

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
decision*"upheld" | "overturned"
notestring≤ 2000 chars

200OK

get/v1/admin/usersFind users (?q=&standing=&verified=&sort=&page=&limit=&counts=1)Admin

Link to this endpoint · Requires an app role (moderator/admin).

Parameters
NameInTypeNotes
qquerystring≤ 100 chars · default ""
standingquery"active" | "restricted" | "suspended" | "banned"
verifiedquery"true" | "false"
sortquery"created_desc" | "created_asc" | "handle"default "created_desc"
countsquery"0" | "1"default "0"
pagequeryinteger1–10000 · default 1
limitqueryinteger1–100 · default 50

200OK

get/v1/admin/users/{id}User detail (staff view)Admin

Link to this endpoint · Requires an app role (moderator/admin).

Parameters
NameInTypeNotes
id*pathstring

200OK

post/v1/admin/users/{id}/standingChange standingAdmin

Link to this endpoint · Requires an app role (moderator/admin).

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
standing*"active" | "restricted" | "suspended" | "banned"
reasonstring | null≤ 2000 chars
untilstring | null (date-time)

200OK

post/v1/admin/users:bulk-standingBulk standing changeAdmin

Link to this endpoint · Requires an app role (moderator/admin).

Request body (application/json)
FieldTypeNotes
standing*"active" | "restricted" | "suspended" | "banned"
reasonstring | null≤ 2000 chars
untilstring | null (date-time)
user_ids*string[]1–200 items

200OK

post/v1/admin/users:bulk-spamMark accounts as spam: ban and remove their messagesAdmin

Link to this endpoint · Requires an app role (moderator/admin).

Request body (application/json)
FieldTypeNotes
user_ids*string[]1–200 items
dry_runbooleandefault true

200OK

post/v1/admin/purgePurge chosen content of a user (dry_run by default)Admin

Link to this endpoint · Requires an app role (moderator/admin).

Request body (application/json)
FieldTypeNotes
user_id*string
categories"messages" | "lists" | "documents" | "media"[]≥ 1 items · default ["messages","lists","documents","media"]
dry_runbooleandefault true

200OK

post/v1/admin/users:bulk-purgePurge chosen content of many users (dry_run by default)Admin

Link to this endpoint · Requires an app role (moderator/admin).

Request body (application/json)
FieldTypeNotes
user_ids*string[]1–200 items
categories"messages" | "lists" | "documents" | "media"[]≥ 1 items · default ["messages","lists","documents","media"]
dry_runbooleandefault true

200OK

get/v1/admin/auditIL audit merged with the SubstratalApps audit (?source=il|platform|both)Admin

Link to this endpoint · Requires an app role (moderator/admin).

Parameters
NameInTypeNotes
sourcequery"il" | "platform" | "both"default "both"
limitqueryinteger1–200 · default 100

200OK

get/v1/admin/blocked-email-domainsBlocked email domainsAdmin

Link to this endpoint · Requires an app role (moderator/admin).

200OK

post/v1/admin/blocked-email-domainsBlock an email domainAdmin

Link to this endpoint · Requires an app role (moderator/admin).

Request body (application/json)
FieldTypeNotes
domain*stringpattern ^[a-z0-9.-]+\.[a-z]{2,}$/i
reasonstring | null≤ 200 chars

200OK

delete/v1/admin/blocked-email-domains/{domain}Unblock a domainAdmin

Link to this endpoint · Requires an app role (moderator/admin).

Parameters
NameInTypeNotes
domain*pathstring

200OK

get/v1/admin/reserved-handlesReserved handlesAdmin

Link to this endpoint · Requires an app role (moderator/admin).

200OK

post/v1/admin/reserved-handlesReserve a handleAdmin

Link to this endpoint · Requires an app role (moderator/admin).

Request body (application/json)
FieldTypeNotes
handle*string
reasonstring | null≤ 200 chars

200OK

get/v1/admin/email-logEmail log with filters (?status=&template=&since=&recipient=&page=); hashed recipientsAdmin

Link to this endpoint · Requires an app role (moderator/admin).

Parameters
NameInTypeNotes
statusquery"sent" | "delivered" | "bounce" | "complaint" | "suppressed" | "deferred_unverified"
templatequerystring≤ 64 chars
sincequery"today" | "7d" | "30d" | "all"default "all"
recipientquerystring≤ 320 chars
pagequeryinteger1–10000 · default 1
limitqueryinteger1–100 · default 50

200OK

get/v1/admin/syndication/healthPer-platform account health and 24 h posting/failure countsAdmin

Link to this endpoint · Requires an app role (moderator/admin).

200OK

get/v1/admin/platform/usageSubstratalApps API usage (fetched on demand)Admin

Link to this endpoint · Requires an app role (moderator/admin).

200OK

get/v1/admin/limitsEffective limits and overridesAdmin

Link to this endpoint · Requires an app role (moderator/admin).

200OK

put/v1/admin/limitsReplace limit overrides (camelCase keys of the limits registry; body is {overrides} or the overrides object)Admin

Link to this endpoint · Requires an app role (moderator/admin).

Request body (application/json): any JSON

200OK

get/v1/admin/flagsFeature flagsAdmin

Link to this endpoint · Requires an app role (moderator/admin).

200OK

put/v1/admin/flagsReplace feature flags (body is {flags} or the flags object)Admin

Link to this endpoint · Requires an app role (moderator/admin).

Request body (application/json): any JSON

200OK

get/v1/admin/blogOfficial blog posts in any state (same officialness rule as /v1/blog)Admin

Link to this endpoint · Requires an app role (moderator/admin).

200OK

put/v1/admin/blog/{id}/officialAdd a blog post to, or remove it from, the official blogAdmin

Link to this endpoint · Requires an app role (moderator/admin).

Parameters
NameInTypeNotes
id*pathstring
Request body (application/json)
FieldTypeNotes
official*boolean

200OK