Skip to main content

All REST requests and MCP tools

This catalog contains all 103 public registered operations. The application also uses internal routes; those are not the client API. REST: https://api.signailist.com/v1. MCP: https://api.signailist.com/mcp.

OpenAPI · MCP setup · Workflow prompts · Intake and webhooks

Using the reference​

REST uses an API key bound to one workspace; MCP uses an OAuth grant. Replace all IDs/placeholders before running examples. Supply SIGNAILIST_API_KEY from your secret store. Every mutation requires a stable Idempotency-Key: retry the same intent with the same key and body. GET does not require this header. These are request templates; documentation does not execute them.

The paid-start label reflects the registry, not a guarantee that all downstream work is free. Enabling a schedule can start future paid stages. Creating a source with automatic title lookup can require run scope and a paid metadata request. Check capabilities, readiness and budget first.

Field tables and collapsible JSON Schema show the actual public validation schema. Operations with a generic object schema have additional checks in the shared handler; they do not accept arbitrary fields. Use the documented workflow examples; fill request.json with your operation's body. Write fields can differ from stored fields in list responses. Do not supply a caller-selected workspaceId: the key pins the workspace. A saved document's nested workspaceId must match the connected workspace.

Only the cursor operations identified below return items and nextCursor. billing_usage uses page/pageSize. list_webhooks returns up to 100 subscriptions without a cursor. Other results can be objects, arrays or nested structures; do not assume a universal list envelope.

Results and errors​

200/201 indicate a result/creation, 202 acceptance and 204 success without a body. A handler can also return 200/201 with queued job identifiers: that is not completion. Keep the returned IDs and inspect the job, source, digest or delivery receipt. There is no universal jobId field for every start operation.

{
"error": {
"code": "INSUFFICIENT_SCOPE",
"requestId": "REQUEST_ID",
"retryable": false
}
}

400 invalid input; 401 missing, expired or revoked credentials; 402 balance/daily limit; 403 permissions/workspace; 404 object/route; 409 revision/idempotency conflict or uncertain prior execution; 413 size; 429 rate/concurrency, honor Retry-After. Limits: 120 requests/minute per connection and five concurrent mutations or paid stages. OAuth uses its own standard errors.

Catalog​

MCPRESTScopePaid start
author_overviewGET /v1/author/overviewreadNo¹
edit_telegram_publicationPOST /v1/accounts/telegram/{id}/messages/editpublishNo¹
verify_telegram_publicationsPOST /v1/accounts/telegram/{id}/messages/checkreadNo¹
regenerate_author_versionPOST /v1/author/editions/{id}/regenerate-versionrunYes
resume_author_editionPOST /v1/author/editions/{id}/resumerunYes
check_telegram_channelsPOST /v1/accounts/telegram/{id}/channels/checkconfigureNo¹
sync_telegram_channelsPOST /v1/accounts/telegram/{id}/channels/syncconfigureNo¹
list_content_catalogsGET /v1/author/catalogsreadNo¹
create_content_catalogPOST /v1/author/catalogsconfigureNo¹
get_content_catalogGET /v1/author/catalogs/{id}readNo¹
sync_content_catalogPOST /v1/author/catalogs/{id}/syncconfigureNo¹
list_catalog_itemsGET /v1/author/catalogs/{id}/itemsreadNo¹
put_catalog_itemPUT /v1/author/catalogs/{id}/itemsconfigureNo¹
list_author_seriesGET /v1/author/seriesreadNo¹
create_author_seriesPOST /v1/author/seriesconfigureNo¹
get_author_seriesGET /v1/author/series/{id}readNo¹
update_author_seriesPUT /v1/author/series/{id}configureNo¹
set_author_automationPOST /v1/author/series/{id}/automationconfigureNo¹
trial_author_seriesPOST /v1/author/series/{id}/trialrunYes
list_author_editionsGET /v1/author/series/{id}/editionsreadNo¹
get_author_editionGET /v1/author/editions/{id}readNo¹
publish_author_editionPOST /v1/author/editions/{id}/publishpublishYes
delete_sourceDELETE /v1/sources/{id}configureNo¹
delete_templateDELETE /v1/templates/{id}configureNo¹
delete_scheduleDELETE /v1/schedules/{id}configureNo¹
list_publicationsGET /v1/publicationsreadNo¹
list_telegram_accountsGET /v1/accounts/telegramreadNo¹
get_source_topic_trackingGET /v1/source-topic-trackingreadNo¹
list_sourcesGET /v1/sourcesreadNo¹
create_sourcePOST /v1/sourcesconfigureNo¹
update_sourcePATCH /v1/sources/{id}configureNo¹
collect_sourcePOST /v1/sources/{id}/collectrunYes
prepare_sourcePOST /v1/sources/{id}/preparerunYes
track_source_topicsPOST /v1/source-topic-trackingconfigureNo¹
source_statusGET /v1/sources/{id}/analysis-statusreadNo¹
source_materialsGET /v1/sources/{id}/materialsreadNo¹
source_resultsGET /v1/sources/{id}/resultsreadNo¹
list_topicsGET /v1/topicsreadNo¹
create_topicPOST /v1/topicsconfigureNo¹
update_topicPATCH /v1/topics/{id}configureNo¹
delete_topicDELETE /v1/topics/{id}configureNo¹
list_templatesGET /v1/templatesreadNo¹
create_templatePOST /v1/templatesconfigureNo¹
update_templatePATCH /v1/templates/{id}configureNo¹
generate_templatePOST /v1/templates/generaterunYes
list_digestsGET /v1/digestsreadNo¹
digest_candidatesGET /v1/digest-candidatesreadNo¹
create_digestPOST /v1/digestsconfigureNo¹
get_digestGET /v1/digests/{id}readNo¹
update_digestPATCH /v1/digests/{id}configureNo¹
generate_digest_textPOST /v1/digests/{id}/generate-textrunYes
generate_digest_imagePOST /v1/digests/{id}/generate-imagerunYes
score_materialPOST /v1/materials/{id}/scorerunYes
get_documentGET /v1/digests/{id}/documentreadNo¹
save_documentPUT /v1/digests/{id}/documentconfigureNo¹
approve_documentPOST /v1/digests/{id}/approvepublishNo¹
publish_documentPOST /v1/digests/{id}/publishpublishYes
list_connectionsGET /v1/connectionsreadNo¹
create_discord_connectionPOST /v1/connectionspublishNo¹
revoke_connectionPOST /v1/connections/{id}/revokepublishNo¹
list_targetsGET /v1/targetsreadNo¹
create_targetPOST /v1/targetspublishNo¹
update_targetPATCH /v1/targets/{id}publishNo¹
list_schedulesGET /v1/schedulesreadNo¹
create_schedulePOST /v1/schedulesconfigureNo¹
update_schedulePATCH /v1/schedules/{id}publishNo¹
enable_schedulePOST /v1/schedules/{id}/enablepublishNo¹
pause_schedulePOST /v1/schedules/{id}/pauseconfigureNo¹
trigger_schedulePOST /v1/schedules/{id}/triggerpublishYes
list_candidatesGET /v1/publication-candidatesreadNo¹
approve_candidatePOST /v1/publication-candidates/{id}/approvepublishYes
reject_candidatePOST /v1/publication-candidates/{id}/rejectpublishNo¹
get_deliveryGET /v1/deliveries/{id}readNo¹
retry_deliveryPOST /v1/deliveries/{id}/retrypublishYes
cancel_publicationPOST /v1/publications/{id}/cancelconfigureNo¹
list_jobsGET /v1/jobsreadNo¹
cancel_jobPOST /v1/jobs/{id}/cancelconfigureNo¹
list_assetsGET /v1/assetsreadNo¹
upload_assetPOST /v1/assetsrunYes
list_signalsGET /v1/signalsreadNo¹
create_signalPOST /v1/signalsconfigureNo¹
update_signalPATCH /v1/signals/{id}configureNo¹
enable_signalPOST /v1/signals/{id}/enablerunNo¹
pause_signalPOST /v1/signals/{id}/pauseconfigureNo¹
billing_summaryGET /v1/billing/summarybilling:readNo¹
billing_usageGET /v1/billing/usagebilling:readNo¹
get_jobGET /v1/jobs/{id}readNo¹
list_modelsGET /v1/modelsreadNo¹
list_reservationsGET /v1/reservationsbilling:readNo¹
capabilitiesGET /v1/capabilitiesreadNo¹
create_external_sourcePOST /v1/external-sourcesconfigureNo¹
ingest_materialsPOST /v1/external-sources/{id}/itemsingestNo¹
budgetGET /v1/budgetbilling:readNo¹
estimatePOST /v1/estimatesbilling:readNo¹
get_integrationGET /v1/integrationreadNo¹
revoke_integrationPOST /v1/integration/revokereadNo¹
create_webhookPOST /v1/webhookswebhooksNo¹
list_webhooksGET /v1/webhookswebhooksNo¹
list_webhook_deliveriesGET /v1/webhooks/deliverieswebhooksNo¹
rotate_webhookPOST /v1/webhooks/{id}/rotatewebhooksNo¹
pause_webhookPOST /v1/webhooks/{id}/pausewebhooksNo¹
resume_webhookPOST /v1/webhooks/{id}/resumewebhooksNo¹
retry_webhookPOST /v1/webhooks/deliveries/{id}/retrywebhooksNo¹

¹ Downstream stages can be paid; see the explanation above and billing.

Connection and capabilities​

list_models​

List current curated AI model choices for new configurations.

REST: GET /v1/models · MCP: list_models · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/models' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

capabilities​

List capabilities and workflow guidance.

REST: GET /v1/capabilities · MCP: capabilities · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/capabilities' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

get_integration​

Inspect your connection and limits.

REST: GET /v1/integration · MCP: get_integration · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/integration' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

revoke_integration​

Revoke your own connection.

REST: POST /v1/integration/revoke · MCP: revoke_integration · Scope: read

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/integration/revoke' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

Sources and topic tracking​

delete_source​

Delete an unused source; saved history constraints remain enforced.

REST: DELETE /v1/sources/{id} · MCP: delete_source · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request DELETE 'https://api.signailist.com/v1/sources/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

get_source_topic_tracking​

Read source-to-topic assignments.

REST: GET /v1/source-topic-tracking · MCP: get_source_topic_tracking · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/source-topic-tracking' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

list_sources​

List source configuration and collection state.

REST: GET /v1/sources · MCP: list_sources · Scope: read

Query fieldRequiredFormat
cursorNostring
limitNointeger; default=50; max=100

Result: { items, nextCursor }. Pass nextCursor as cursor on the next request; null means the end.

curl --fail-with-body --request GET 'https://api.signailist.com/v1/sources' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

create_source​

Create a Telegram or RSS source. Collection starts paused.

REST: POST /v1/sources · MCP: create_source · Scope: configure

Body fieldRequiredType
providerNostring
titleNostring
urlNostring (uri)
usernameNostring
enabledNoboolean
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
"rss",
"telegram"
]
},
"title": {
"type": "string",
"maxLength": 500
},
"url": {
"type": "string",
"format": "uri"
},
"username": {
"type": "string"
},
"enabled": {
"type": "boolean"
}
},
"additionalProperties": {}
}
Example body
{
"provider": "rss",
"title": "NASA",
"url": "https://www.nasa.gov/news-release/feed/",
"enabled": false
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/sources' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

update_source​

Update a source or pause collection.

REST: PATCH /v1/sources/{id} · MCP: update_source · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{
"enabled": false
}
curl --fail-with-body --request PATCH 'https://api.signailist.com/v1/sources/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

collect_source​

Queue source collection. Requires balance.

REST: POST /v1/sources/{id}/collect · MCP: collect_source · Scope: run

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/sources/OBJECT_ID/collect' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

prepare_source​

Queue processing of saved source materials.

REST: POST /v1/sources/{id}/prepare · MCP: prepare_source · Scope: run

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/sources/OBJECT_ID/prepare' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

track_source_topics​

Assign source materials to analysis topics.

REST: POST /v1/source-topic-tracking · MCP: track_source_topics · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{
"topicId": "TOPIC_ID",
"sourceIds": [
"SOURCE_ID"
],
"enabled": true
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/source-topic-tracking' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

source_status​

Read source analysis state.

REST: GET /v1/sources/{id}/analysis-status · MCP: source_status · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/sources/OBJECT_ID/analysis-status' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

source_materials​

Read saved source materials.

REST: GET /v1/sources/{id}/materials · MCP: source_materials · Scope: read

Query fieldRequiredFormat
cursorNostring
limitNointeger; default=50; max=100

Result: { items, nextCursor }. Pass nextCursor as cursor on the next request; null means the end.

curl --fail-with-body --request GET 'https://api.signailist.com/v1/sources/OBJECT_ID/materials' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

source_results​

Read processed source materials.

REST: GET /v1/sources/{id}/results · MCP: source_results · Scope: read

Query fieldRequiredFormat
cursorNostring
limitNointeger; default=50; max=100

Result: { items, nextCursor }. Pass nextCursor as cursor on the next request; null means the end.

curl --fail-with-body --request GET 'https://api.signailist.com/v1/sources/OBJECT_ID/results' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

Analysis topics​

list_topics​

List analysis topics.

REST: GET /v1/topics · MCP: list_topics · Scope: read

Query fieldRequiredFormat
cursorNostring
limitNointeger; default=50; max=100

Result: { items, nextCursor }. Pass nextCursor as cursor on the next request; null means the end.

curl --fail-with-body --request GET 'https://api.signailist.com/v1/topics' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

create_topic​

Create an analysis topic.

REST: POST /v1/topics · MCP: create_topic · Scope: configure

Body fieldRequiredType
nameYesstring
promptYesstring
negativePromptNostring
aiModelNostring
isActiveNoboolean
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 160
},
"prompt": {
"type": "string",
"minLength": 1
},
"negativePrompt": {
"type": "string"
},
"aiModel": {
"type": "string"
},
"isActive": {
"type": "boolean"
}
},
"required": [
"name",
"prompt"
],
"additionalProperties": {}
}
Example body
{
"name": "Science",
"prompt": "Score factual science news.",
"aiModel": "openai/gpt-6-luna"
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/topics' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

update_topic​

Update an analysis topic.

REST: PATCH /v1/topics/{id} · MCP: update_topic · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{
"name": "Science news"
}
curl --fail-with-body --request PATCH 'https://api.signailist.com/v1/topics/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

delete_topic​

Delete an analysis topic.

REST: DELETE /v1/topics/{id} · MCP: delete_topic · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request DELETE 'https://api.signailist.com/v1/topics/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

Digest templates​

delete_template​

Delete a digest template.

REST: DELETE /v1/templates/{id} · MCP: delete_template · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request DELETE 'https://api.signailist.com/v1/templates/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

list_templates​

List digest templates.

REST: GET /v1/templates · MCP: list_templates · Scope: read

Query fieldRequiredFormat
cursorNostring
limitNointeger; default=50; max=100

Result: { items, nextCursor }. Pass nextCursor as cursor on the next request; null means the end.

curl --fail-with-body --request GET 'https://api.signailist.com/v1/templates' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

create_template​

Create a digest template.

REST: POST /v1/templates · MCP: create_template · Scope: configure

Body fieldRequiredType
nameYesstring
tonePromptYesstring
renderTemplateYesstring
sourceIdNostring
imageEnabledNoboolean
textAiModelNostring
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"tonePrompt": {
"type": "string",
"minLength": 1,
"maxLength": 20000
},
"renderTemplate": {
"type": "string",
"minLength": 1,
"maxLength": 40000
},
"sourceId": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"imageEnabled": {
"type": "boolean"
},
"textAiModel": {
"type": "string"
}
},
"required": [
"name",
"tonePrompt",
"renderTemplate"
],
"additionalProperties": {}
}
Example body
{
"name": "Weekly digest",
"tonePrompt": "Summarize the previous seven days with source links.",
"renderTemplate": "{{ai}}",
"textAiModel": "openai/gpt-6-luna",
"imageEnabled": false,
"periodDays": 7
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/templates' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

update_template​

Update a digest template.

REST: PATCH /v1/templates/{id} · MCP: update_template · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{
"textAiModel": "openai/gpt-6-luna"
}
curl --fail-with-body --request PATCH 'https://api.signailist.com/v1/templates/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

generate_template​

Queue AI template generation.

REST: POST /v1/templates/generate · MCP: generate_template · Scope: run

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/templates/generate' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

Digests and AI​

author_overview​

Read current author series, recent editions and per-channel delivery receipts, including MCP-created automations.

REST: GET /v1/author/overview · MCP: author_overview · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/author/overview' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

edit_telegram_publication​

Edit the text or caption of a known sent workspace publication in place. Requires exact expectedText; preserves the message ID and photo and records a verified edit receipt.

REST: POST /v1/accounts/telegram/{id}/messages/edit · MCP: edit_telegram_publication · Scope: publish

Body fieldRequiredType
publicationJobIdYesstring
expectedTextYesstring
textYesstring
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"publicationJobId": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"expectedText": {
"type": "string",
"maxLength": 4096
},
"text": {
"type": "string",
"minLength": 1,
"maxLength": 8000
}
},
"required": [
"publicationJobId",
"expectedText",
"text"
],
"additionalProperties": false
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/accounts/telegram/OBJECT_ID/messages/edit' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

verify_telegram_publications​

Read back sent workspace publication messages and verify their text/photo without sending anything.

REST: POST /v1/accounts/telegram/{id}/messages/check · MCP: verify_telegram_publications · Scope: read

Body fieldRequiredType
publicationJobIdsYesarray
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"publicationJobIds": {
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
}
},
"required": [
"publicationJobIds"
],
"additionalProperties": false
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/accounts/telegram/OBJECT_ID/messages/check' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

regenerate_author_version​

Explicitly regenerate one unpublished language/style version. Frozen objects, shared image and other versions are reused.

REST: POST /v1/author/editions/{id}/regenerate-version · MCP: regenerate_author_version · Scope: run

Body fieldRequiredType
versionIdYesstring
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"versionId": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"versionId"
],
"additionalProperties": false
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/author/editions/OBJECT_ID/regenerate-version' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

resume_author_edition​

Resume a failed frozen edition using durable paid outputs; uncertain provider calls are never repeated.

REST: POST /v1/author/editions/{id}/resume · MCP: resume_author_edition · Scope: run

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/author/editions/OBJECT_ID/resume' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

check_telegram_channels​

Read publish rights and discussion links without sending messages.

REST: POST /v1/accounts/telegram/{id}/channels/check · MCP: check_telegram_channels · Scope: configure

Body fieldRequiredType
channelsYesarray
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"channels": {
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"pattern": "^@[a-zA-Z0-9_]{4,32}$"
}
}
},
"required": [
"channels"
],
"additionalProperties": false
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/accounts/telegram/OBJECT_ID/channels/check' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

sync_telegram_channels​

Discover connected Telegram account admin channels.

REST: POST /v1/accounts/telegram/{id}/channels/sync · MCP: sync_telegram_channels · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/accounts/telegram/OBJECT_ID/channels/sync' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

list_content_catalogs​

List private content catalogs.

REST: GET /v1/author/catalogs · MCP: list_content_catalogs · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/author/catalogs' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

create_content_catalog​

Create a manual or API content catalog; bearerToken is write-only.

REST: POST /v1/author/catalogs · MCP: create_content_catalog · Scope: configure

Body fieldRequiredType
kindYesstring
titleYesstring
baseUrlNostring (uri)
bearerTokenNostring
manifestNoobject
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"api",
"manual"
]
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"baseUrl": {
"type": "string",
"format": "uri"
},
"bearerToken": {
"type": "string",
"maxLength": 2000
},
"manifest": {
"type": "object",
"properties": {
"schemaVersion": {
"type": "number",
"const": 1
},
"id": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"languages": {
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 2,
"maxLength": 35
}
},
"collections": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"required": [
"id",
"title"
],
"additionalProperties": false
}
}
},
"required": [
"schemaVersion",
"id",
"title",
"languages",
"collections"
],
"additionalProperties": false
}
},
"required": [
"kind",
"title"
],
"additionalProperties": false
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/author/catalogs' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

get_content_catalog​

Read a catalog and sync status without credentials.

REST: GET /v1/author/catalogs/{id} · MCP: get_content_catalog · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/author/catalogs/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

sync_content_catalog​

Validate and sync the external catalog.

REST: POST /v1/author/catalogs/{id}/sync · MCP: sync_content_catalog · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/author/catalogs/OBJECT_ID/sync' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

list_catalog_items​

Browse catalog objects with cursor pagination.

REST: GET /v1/author/catalogs/{id}/items · MCP: list_catalog_items · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/author/catalogs/OBJECT_ID/items' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

put_catalog_item​

Save a manual catalog object and image descriptions.

REST: PUT /v1/author/catalogs/{id}/items · MCP: put_catalog_item · Scope: configure

Body fieldRequiredType
idYesstring
revisionYesstring
localizedYesobject
tagsYesarray
attributesYesobject
imagesYesarray
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"revision": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"localized": {
"type": "object",
"propertyNames": {
"type": "string",
"pattern": "^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
},
"additionalProperties": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 500
},
"description": {
"type": "string",
"maxLength": 30000
}
},
"required": [
"title",
"description"
],
"additionalProperties": false
}
},
"tags": {
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"maxLength": 100
}
},
"attributes": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"images": {
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"url": {
"type": "string",
"maxLength": 2048,
"format": "uri"
},
"collectionId": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"mimeType": {
"type": "string",
"enum": [
"image/jpeg",
"image/png",
"image/webp"
]
},
"revision": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"description": {
"type": "string",
"maxLength": 4000
}
},
"required": [
"id",
"url",
"collectionId",
"mimeType",
"revision",
"description"
],
"additionalProperties": false
}
}
},
"required": [
"id",
"revision",
"localized",
"tags",
"attributes",
"images"
],
"additionalProperties": false
}
curl --fail-with-body --request PUT 'https://api.signailist.com/v1/author/catalogs/OBJECT_ID/items' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

list_author_series​

List authored series and next run.

REST: GET /v1/author/series · MCP: list_author_series · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/author/series' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

create_author_series​

Create a paused authored series with language/style versions and independent placements.

REST: POST /v1/author/series · MCP: create_author_series · Scope: configure

Body fieldRequiredType
titleYesstring
catalogIdYesstring
configYesobject
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"catalogId": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"config": {
"type": "object",
"properties": {
"count": {
"default": 2,
"type": "integer",
"minimum": 1,
"maximum": 10
},
"selection": {
"default": "random",
"type": "string",
"enum": [
"random",
"sequential",
"tags"
]
},
"tags": {
"default": [],
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"maxLength": 100
}
},
"repeatWindow": {
"default": 7,
"type": "integer",
"minimum": 0,
"maximum": 365
},
"instruction": {
"type": "string",
"minLength": 1,
"maxLength": 16000
},
"generation": {
"type": "object",
"properties": {
"titles": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
},
"includeItemTitles": {
"default": true,
"type": "boolean"
},
"itemRoles": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
}
},
"sections": {
"default": [],
"maxItems": 30,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]{1,80}$"
},
"titles": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
},
"instruction": {
"default": "",
"type": "string",
"maxLength": 2000
}
},
"required": [
"id",
"titles",
"instruction"
],
"additionalProperties": false
}
},
"maxCharacters": {
"default": 3000,
"type": "integer",
"minimum": 300,
"maximum": 10000
},
"maxTokens": {
"default": 3200,
"type": "integer",
"minimum": 500,
"maximum": 8000
}
},
"required": [
"titles",
"includeItemTitles",
"itemRoles",
"sections",
"maxCharacters",
"maxTokens"
],
"additionalProperties": false
},
"presentation": {
"type": "object",
"properties": {
"headingEmoji": {
"default": "",
"type": "string",
"maxLength": 16
},
"boldHeading": {
"default": false,
"type": "boolean"
},
"ctaUrl": {
"type": "string",
"format": "uri"
},
"ctaLabels": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"maxLength": 180
}
}
},
"required": [
"headingEmoji",
"boldHeading",
"ctaLabels"
],
"additionalProperties": false
},
"image": {
"type": "object",
"properties": {
"mode": {
"default": "generate",
"type": "string",
"enum": [
"none",
"original",
"album",
"generate"
]
},
"required": {
"default": true,
"type": "boolean"
},
"collectionId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"model": {
"default": "google/nano-banana-2",
"type": "string",
"enum": [
"google/nano-banana-2",
"google/nano-banana-pro"
]
},
"prompt": {
"default": "Create an original composition based on the supplied subject images. Preserve recognizable subjects. No added text, labels or watermarks.",
"type": "string",
"maxLength": 12000
},
"styleReferenceAssetIds": {
"default": [],
"maxItems": 2,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
}
},
"required": [
"mode",
"required",
"model",
"prompt",
"styleReferenceAssetIds"
],
"additionalProperties": false
},
"schedule": {
"type": "object",
"properties": {
"kind": {
"default": "daily",
"type": "string",
"enum": [
"daily",
"weekly",
"monthly"
]
},
"time": {
"type": "string"
},
"timezone": {
"type": "string"
},
"weekdays": {
"default": [],
"type": "array",
"items": {
"type": "integer",
"minimum": 1,
"maximum": 7
}
},
"monthDays": {
"default": [],
"type": "array",
"items": {
"type": "integer",
"minimum": 1,
"maximum": 31
}
}
},
"required": [
"kind",
"time",
"timezone",
"weekdays",
"monthDays"
],
"additionalProperties": false
},
"versions": {
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"language": {
"type": "string",
"pattern": "^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
},
"templateId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"image": {
"type": "object",
"properties": {
"mode": {
"default": "generate",
"type": "string",
"enum": [
"none",
"original",
"album",
"generate"
]
},
"required": {
"default": true,
"type": "boolean"
},
"collectionId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"model": {
"default": "google/nano-banana-2",
"type": "string",
"enum": [
"google/nano-banana-2",
"google/nano-banana-pro"
]
},
"prompt": {
"default": "Create an original composition based on the supplied subject images. Preserve recognizable subjects. No added text, labels or watermarks.",
"type": "string",
"maxLength": 12000
},
"styleReferenceAssetIds": {
"default": [],
"maxItems": 2,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
}
},
"required": [
"mode",
"required",
"model",
"prompt",
"styleReferenceAssetIds"
],
"additionalProperties": false
}
},
"required": [
"id",
"language",
"templateId"
],
"additionalProperties": false
}
},
"placements": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"versionId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"targetId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"time": {
"type": "string"
},
"timezone": {
"type": "string"
}
},
"required": [
"id",
"versionId",
"targetId",
"time",
"timezone"
],
"additionalProperties": false
}
}
},
"required": [
"count",
"selection",
"tags",
"repeatWindow",
"instruction",
"image",
"schedule",
"versions",
"placements"
],
"additionalProperties": false
}
},
"required": [
"title",
"catalogId",
"config"
],
"additionalProperties": false
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/author/series' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

get_author_series​

Read authored series configuration.

REST: GET /v1/author/series/{id} · MCP: get_author_series · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/author/series/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

update_author_series​

Update authored series; existing editions remain immutable.

REST: PUT /v1/author/series/{id} · MCP: update_author_series · Scope: configure

Body fieldRequiredType
expectedRevisionNostring
titleYesstring
catalogIdYesstring
configYesobject
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"expectedRevision": {
"type": "string",
"maxLength": 100
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"catalogId": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"config": {
"type": "object",
"properties": {
"count": {
"default": 2,
"type": "integer",
"minimum": 1,
"maximum": 10
},
"selection": {
"default": "random",
"type": "string",
"enum": [
"random",
"sequential",
"tags"
]
},
"tags": {
"default": [],
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"maxLength": 100
}
},
"repeatWindow": {
"default": 7,
"type": "integer",
"minimum": 0,
"maximum": 365
},
"instruction": {
"type": "string",
"minLength": 1,
"maxLength": 16000
},
"generation": {
"type": "object",
"properties": {
"titles": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
},
"includeItemTitles": {
"default": true,
"type": "boolean"
},
"itemRoles": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
}
},
"sections": {
"default": [],
"maxItems": 30,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]{1,80}$"
},
"titles": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
},
"instruction": {
"default": "",
"type": "string",
"maxLength": 2000
}
},
"required": [
"id",
"titles",
"instruction"
],
"additionalProperties": false
}
},
"maxCharacters": {
"default": 3000,
"type": "integer",
"minimum": 300,
"maximum": 10000
},
"maxTokens": {
"default": 3200,
"type": "integer",
"minimum": 500,
"maximum": 8000
}
},
"required": [
"titles",
"includeItemTitles",
"itemRoles",
"sections",
"maxCharacters",
"maxTokens"
],
"additionalProperties": false
},
"presentation": {
"type": "object",
"properties": {
"headingEmoji": {
"default": "",
"type": "string",
"maxLength": 16
},
"boldHeading": {
"default": false,
"type": "boolean"
},
"ctaUrl": {
"type": "string",
"format": "uri"
},
"ctaLabels": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"maxLength": 180
}
}
},
"required": [
"headingEmoji",
"boldHeading",
"ctaLabels"
],
"additionalProperties": false
},
"image": {
"type": "object",
"properties": {
"mode": {
"default": "generate",
"type": "string",
"enum": [
"none",
"original",
"album",
"generate"
]
},
"required": {
"default": true,
"type": "boolean"
},
"collectionId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"model": {
"default": "google/nano-banana-2",
"type": "string",
"enum": [
"google/nano-banana-2",
"google/nano-banana-pro"
]
},
"prompt": {
"default": "Create an original composition based on the supplied subject images. Preserve recognizable subjects. No added text, labels or watermarks.",
"type": "string",
"maxLength": 12000
},
"styleReferenceAssetIds": {
"default": [],
"maxItems": 2,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
}
},
"required": [
"mode",
"required",
"model",
"prompt",
"styleReferenceAssetIds"
],
"additionalProperties": false
},
"schedule": {
"type": "object",
"properties": {
"kind": {
"default": "daily",
"type": "string",
"enum": [
"daily",
"weekly",
"monthly"
]
},
"time": {
"type": "string"
},
"timezone": {
"type": "string"
},
"weekdays": {
"default": [],
"type": "array",
"items": {
"type": "integer",
"minimum": 1,
"maximum": 7
}
},
"monthDays": {
"default": [],
"type": "array",
"items": {
"type": "integer",
"minimum": 1,
"maximum": 31
}
}
},
"required": [
"kind",
"time",
"timezone",
"weekdays",
"monthDays"
],
"additionalProperties": false
},
"versions": {
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"language": {
"type": "string",
"pattern": "^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
},
"templateId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"image": {
"type": "object",
"properties": {
"mode": {
"default": "generate",
"type": "string",
"enum": [
"none",
"original",
"album",
"generate"
]
},
"required": {
"default": true,
"type": "boolean"
},
"collectionId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"model": {
"default": "google/nano-banana-2",
"type": "string",
"enum": [
"google/nano-banana-2",
"google/nano-banana-pro"
]
},
"prompt": {
"default": "Create an original composition based on the supplied subject images. Preserve recognizable subjects. No added text, labels or watermarks.",
"type": "string",
"maxLength": 12000
},
"styleReferenceAssetIds": {
"default": [],
"maxItems": 2,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 180
}
}
},
"required": [
"mode",
"required",
"model",
"prompt",
"styleReferenceAssetIds"
],
"additionalProperties": false
}
},
"required": [
"id",
"language",
"templateId"
],
"additionalProperties": false
}
},
"placements": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"versionId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"targetId": {
"type": "string",
"minLength": 1,
"maxLength": 180
},
"time": {
"type": "string"
},
"timezone": {
"type": "string"
}
},
"required": [
"id",
"versionId",
"targetId",
"time",
"timezone"
],
"additionalProperties": false
}
}
},
"required": [
"count",
"selection",
"tags",
"repeatWindow",
"instruction",
"image",
"schedule",
"versions",
"placements"
],
"additionalProperties": false
}
},
"required": [
"title",
"catalogId",
"config"
],
"additionalProperties": false
}
curl --fail-with-body --request PUT 'https://api.signailist.com/v1/author/series/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

set_author_automation​

Explicitly enable/pause automation; autoPublish requires publish scope and enabled requires run scope.

REST: POST /v1/author/series/{id}/automation · MCP: set_author_automation · Scope: configure

Body fieldRequiredType
enabledYesboolean
autoPublishYesboolean
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"enabled": {
"type": "boolean"
},
"autoPublish": {
"type": "boolean"
}
},
"required": [
"enabled",
"autoPublish"
],
"additionalProperties": false
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/author/series/OBJECT_ID/automation' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

trial_author_series​

Queue a paid authored edition with a stable intentKey. No delivery without explicit publication or saved autoPublish.

REST: POST /v1/author/series/{id}/trial · MCP: trial_author_series · Scope: run

Body fieldRequiredType
intentKeyYesstring
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"intentKey": {
"type": "string",
"minLength": 1,
"maxLength": 120
}
},
"required": [
"intentKey"
],
"additionalProperties": false
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/author/series/OBJECT_ID/trial' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

list_author_editions​

List editions and outcomes.

REST: GET /v1/author/series/{id}/editions · MCP: list_author_editions · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/author/series/OBJECT_ID/editions' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

get_author_edition​

Inspect frozen source images, texts, generated cover and independent delivery receipts.

REST: GET /v1/author/editions/{id} · MCP: get_author_edition · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/author/editions/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

publish_author_edition​

Approve and deliver ready versions of a frozen edition; retry never regenerates.

REST: POST /v1/author/editions/{id}/publish · MCP: publish_author_edition · Scope: publish

Body fieldRequiredType
immediateNoboolean
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"immediate": {
"type": "boolean"
}
},
"additionalProperties": false
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/author/editions/OBJECT_ID/publish' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

list_digests​

List digests.

REST: GET /v1/digests · MCP: list_digests · Scope: read

Query fieldRequiredFormat
cursorNostring
limitNointeger; default=50; max=100

Result: { items, nextCursor }. Pass nextCursor as cursor on the next request; null means the end.

curl --fail-with-body --request GET 'https://api.signailist.com/v1/digests' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

digest_candidates​

Select processed materials for a digest.

REST: GET /v1/digest-candidates · MCP: digest_candidates · Scope: read

Query fieldRequiredFormat
periodStartYesstring (date-time)
periodEndYesstring (date-time)
sourceIdsNostring
qNostring
aiNostring
limitNointeger; default=200; max=500
curl --fail-with-body --request GET 'https://api.signailist.com/v1/digest-candidates?periodStart=2026-10-19T00%3A00%3A00Z&periodEnd=2026-10-26T00%3A00%3A00Z' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

create_digest​

Create a digest draft from selected materials.

REST: POST /v1/digests · MCP: create_digest · Scope: configure

Body fieldRequiredType
templateIdYesstring
periodStartYesstring (date-time)
periodEndYesstring (date-time)
selectedProcessedItemIdsYesarray
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"templateId": {
"type": "string",
"minLength": 1,
"maxLength": 512
},
"periodStart": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"periodEnd": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"selectedProcessedItemIds": {
"minItems": 1,
"maxItems": 200,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
}
},
"required": [
"templateId",
"periodStart",
"periodEnd",
"selectedProcessedItemIds"
],
"additionalProperties": {}
}
Example body
{
"templateId": "TEMPLATE_ID",
"periodStart": "2026-10-19T00:00:00Z",
"periodEnd": "2026-10-26T00:00:00Z",
"selectedProcessedItemIds": [
"PROCESSED_ID"
]
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/digests' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

get_digest​

Read a digest and generated results.

REST: GET /v1/digests/{id} · MCP: get_digest · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/digests/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

update_digest​

Edit a digest draft.

REST: PATCH /v1/digests/{id} · MCP: update_digest · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
curl --fail-with-body --request PATCH 'https://api.signailist.com/v1/digests/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

generate_digest_text​

Queue digest text generation.

REST: POST /v1/digests/{id}/generate-text · MCP: generate_digest_text · Scope: run

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/digests/OBJECT_ID/generate-text' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

generate_digest_image​

Queue digest cover generation.

REST: POST /v1/digests/{id}/generate-image · MCP: generate_digest_image · Scope: run

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/digests/OBJECT_ID/generate-image' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

score_material​

Queue AI topic scoring.

REST: POST /v1/materials/{id}/score · MCP: score_material · Scope: run

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/materials/OBJECT_ID/score' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

Incoming materials​

create_external_source​

Create a private external input source.

REST: POST /v1/external-sources · MCP: create_external_source · Scope: configure

Body fieldRequiredType
titleYesstring
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1,
"maxLength": 160
}
},
"required": [
"title"
],
"additionalProperties": false
}
Example body
{
"title": "Our system"
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/external-sources' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

ingest_materials​

Accept up to 50 versioned text materials.

REST: POST /v1/external-sources/{id}/items · MCP: ingest_materials · Scope: ingest

Body fieldRequiredType
itemsYesarray
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"items": {
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"externalId": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"version": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 1000
},
"text": {
"type": "string",
"minLength": 1,
"maxLength": 65536
},
"publishedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"url": {
"type": "string",
"format": "uri"
},
"metadata": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"externalId",
"version",
"title",
"text",
"publishedAt"
],
"additionalProperties": false
}
}
},
"required": [
"items"
],
"additionalProperties": false
}
Example body
{
"items": [
{
"externalId": "article-42",
"version": "1",
"title": "Release",
"text": "Release is available.",
"publishedAt": "2026-10-20T12:00:00Z"
}
]
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/external-sources/OBJECT_ID/items' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

Provider connections and destinations​

list_telegram_accounts​

List connected Telegram accounts and collection/publication capabilities, without session secrets.

REST: GET /v1/accounts/telegram · MCP: list_telegram_accounts · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/accounts/telegram' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

list_connections​

List publication connections without secrets.

REST: GET /v1/connections · MCP: list_connections · Scope: read

Query fieldRequiredFormat
cursorNostring
limitNointeger; default=50; max=100

Result: { items, nextCursor }. Pass nextCursor as cursor on the next request; null means the end.

curl --fail-with-body --request GET 'https://api.signailist.com/v1/connections' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

create_discord_connection​

Connect a Discord webhook. Store credentials encrypted.

REST: POST /v1/connections · MCP: create_discord_connection · Scope: publish

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{
"label": "Our Discord",
"webhookUrl": "https://discord.com/api/webhooks/WEBHOOK_ID/WEBHOOK_TOKEN"
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/connections' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

revoke_connection​

Revoke a publication connection.

REST: POST /v1/connections/{id}/revoke · MCP: revoke_connection · Scope: publish

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/connections/OBJECT_ID/revoke' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

list_targets​

List publication destinations.

REST: GET /v1/targets · MCP: list_targets · Scope: read

Query fieldRequiredFormat
cursorNostring
limitNointeger; default=50; max=100

Result: { items, nextCursor }. Pass nextCursor as cursor on the next request; null means the end.

curl --fail-with-body --request GET 'https://api.signailist.com/v1/targets' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

create_target​

Configure a publication destination.

REST: POST /v1/targets · MCP: create_target · Scope: publish

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{
"provider": "discord",
"connectionId": "CONNECTION_ID",
"channelTitle": "Our Discord"
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/targets' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

update_target​

Update a publication destination.

REST: PATCH /v1/targets/{id} · MCP: update_target · Scope: publish

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
curl --fail-with-body --request PATCH 'https://api.signailist.com/v1/targets/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

Schedules and candidates​

delete_schedule​

Delete a publication schedule.

REST: DELETE /v1/schedules/{id} · MCP: delete_schedule · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request DELETE 'https://api.signailist.com/v1/schedules/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

list_schedules​

List publication schedules.

REST: GET /v1/schedules · MCP: list_schedules · Scope: read

Query fieldRequiredFormat
cursorNostring
limitNointeger; default=50; max=100

Result: { items, nextCursor }. Pass nextCursor as cursor on the next request; null means the end.

curl --fail-with-body --request GET 'https://api.signailist.com/v1/schedules' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

create_schedule​

Create a disabled publication schedule.

REST: POST /v1/schedules · MCP: create_schedule · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{
"name": "Weekly digest",
"triggerMode": "schedule",
"topicId": "TOPIC_ID",
"templateId": "TEMPLATE_ID",
"publicationTargetId": "TARGET_ID",
"schedule": {
"kind": "weekly",
"weekdays": [
1
],
"time": "09:00",
"timezone": "Asia/Tbilisi",
"sourceIds": [
"SOURCE_ID"
]
},
"confirmationMode": "site",
"generateText": true,
"generateImage": false,
"isActive": false,
"clientMutationId": "weekly-setup-1"
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/schedules' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

update_schedule​

Edit a publication schedule.

REST: PATCH /v1/schedules/{id} · MCP: update_schedule · Scope: publish

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{
"name": "Weekly digest"
}
curl --fail-with-body --request PATCH 'https://api.signailist.com/v1/schedules/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

enable_schedule​

Explicitly enable automatic publication.

REST: POST /v1/schedules/{id}/enable · MCP: enable_schedule · Scope: publish

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/schedules/OBJECT_ID/enable' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

pause_schedule​

Pause a publication schedule.

REST: POST /v1/schedules/{id}/pause · MCP: pause_schedule · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/schedules/OBJECT_ID/pause' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

trigger_schedule​

Run a publication schedule now.

REST: POST /v1/schedules/{id}/trigger · MCP: trigger_schedule · Scope: publish

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/schedules/OBJECT_ID/trigger' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

list_candidates​

List publication candidates awaiting action.

REST: GET /v1/publication-candidates · MCP: list_candidates · Scope: read

Query fieldRequiredFormat
cursorNostring
limitNointeger; default=50; max=100

Result: { items, nextCursor }. Pass nextCursor as cursor on the next request; null means the end.

curl --fail-with-body --request GET 'https://api.signailist.com/v1/publication-candidates' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

approve_candidate​

Approve a candidate for publication.

REST: POST /v1/publication-candidates/{id}/approve · MCP: approve_candidate · Scope: publish

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/publication-candidates/OBJECT_ID/approve' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

reject_candidate​

Reject a publication candidate.

REST: POST /v1/publication-candidates/{id}/reject · MCP: reject_candidate · Scope: publish

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/publication-candidates/OBJECT_ID/reject' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

Documents and publication delivery​

list_publications​

List publication outcomes and receipts.

REST: GET /v1/publications · MCP: list_publications · Scope: read

Query fieldRequiredFormat
cursorNostring
limitNointeger; default=50; max=100

Result: { items, nextCursor }. Pass nextCursor as cursor on the next request; null means the end.

curl --fail-with-body --request GET 'https://api.signailist.com/v1/publications' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

get_document​

Read publication document, revision and provider previews.

REST: GET /v1/digests/{id}/document · MCP: get_document · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/digests/OBJECT_ID/document' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

save_document​

Save a publication document using expectedRevision.

REST: PUT /v1/digests/{id}/document · MCP: save_document · Scope: configure

Body fieldRequiredType
expectedRevisionYesinteger
documentYesobject
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"expectedRevision": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"document": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"expectedRevision",
"document"
],
"additionalProperties": false
}
Example body
{
"expectedRevision": 0,
"document": {
"schemaVersion": 1,
"id": "DOCUMENT_ID",
"workspaceId": "CONNECTED_WORKSPACE_ID",
"revision": 1,
"title": null,
"blocks": [
{
"type": "paragraph",
"text": "Reviewed text."
}
],
"attribution": null,
"sources": []
}
}
curl --fail-with-body --request PUT 'https://api.signailist.com/v1/digests/OBJECT_ID/document' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

approve_document​

Approve an exact document revision.

REST: POST /v1/digests/{id}/approve · MCP: approve_document · Scope: publish

Body fieldRequiredType
revisionYesinteger
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"revision": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"revision"
],
"additionalProperties": false
}
Example body
{
"revision": 1
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/digests/OBJECT_ID/approve' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

publish_document​

Queue publication of an approved revision to targetIds.

REST: POST /v1/digests/{id}/publish · MCP: publish_document · Scope: publish

Body fieldRequiredType
revisionYesinteger
targetIdsYesarray
logicalPublicationIdYesstring
scheduledAtNostring (date-time)
publisherAccountIdNostring
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"revision": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"targetIds": {
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"logicalPublicationId": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"scheduledAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"publisherAccountId": {
"type": "string",
"minLength": 1,
"maxLength": 512
}
},
"required": [
"revision",
"targetIds",
"logicalPublicationId"
],
"additionalProperties": false
}
Example body
{
"revision": 1,
"targetIds": [
"TARGET_ID"
],
"logicalPublicationId": "weekly-2026-10-26"
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/digests/OBJECT_ID/publish' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

get_delivery​

Read publication delivery receipts.

REST: GET /v1/deliveries/{id} · MCP: get_delivery · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/deliveries/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

retry_delivery​

Retry delivery; uncertain outcomes require acknowledgeDuplicateRisk.

REST: POST /v1/deliveries/{id}/retry · MCP: retry_delivery · Scope: publish

Body fieldRequiredType
acknowledgeDuplicateRiskNoboolean
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"acknowledgeDuplicateRisk": {
"type": "boolean"
}
},
"additionalProperties": false
}
Example body
{
"acknowledgeDuplicateRisk": false
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/deliveries/OBJECT_ID/retry' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

cancel_publication​

Cancel a pending publication.

REST: POST /v1/publications/{id}/cancel · MCP: cancel_publication · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/publications/OBJECT_ID/cancel' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

Jobs​

list_jobs​

Read queued and completed work.

REST: GET /v1/jobs · MCP: list_jobs · Scope: read

Query fieldRequiredFormat
cursorNostring
limitNointeger; default=50; max=100

Result: { items, nextCursor }. Pass nextCursor as cursor on the next request; null means the end.

curl --fail-with-body --request GET 'https://api.signailist.com/v1/jobs' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

cancel_job​

Cancel pending work.

REST: POST /v1/jobs/{id}/cancel · MCP: cancel_job · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/jobs/OBJECT_ID/cancel' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

get_job​

Read a job status and progress without internal payloads.

REST: GET /v1/jobs/{id} · MCP: get_job · Scope: read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/jobs/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

Assets​

list_assets​

List stored images.

REST: GET /v1/assets · MCP: list_assets · Scope: read

Query fieldRequiredFormat
cursorNostring
limitNointeger; default=50; max=100

Result: { items, nextCursor }. Pass nextCursor as cursor on the next request; null means the end.

curl --fail-with-body --request GET 'https://api.signailist.com/v1/assets' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

upload_asset​

Upload an image asset.

REST: POST /v1/assets · MCP: upload_asset · Scope: run

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/assets' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

Signals​

list_signals​

List signal and notification rules.

REST: GET /v1/signals · MCP: list_signals · Scope: read

Query fieldRequiredFormat
cursorNostring
limitNointeger; default=50; max=100

Result: { items, nextCursor }. Pass nextCursor as cursor on the next request; null means the end.

curl --fail-with-body --request GET 'https://api.signailist.com/v1/signals' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

create_signal​

Create a disabled notification rule.

REST: POST /v1/signals · MCP: create_signal · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/signals' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

update_signal​

Update notification settings.

REST: PATCH /v1/signals/{id} · MCP: update_signal · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
curl --fail-with-body --request PATCH 'https://api.signailist.com/v1/signals/OBJECT_ID' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

enable_signal​

Enable a notification rule.

REST: POST /v1/signals/{id}/enable · MCP: enable_signal · Scope: run

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/signals/OBJECT_ID/enable' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

pause_signal​

Pause a notification rule.

REST: POST /v1/signals/{id}/pause · MCP: pause_signal · Scope: configure

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/signals/OBJECT_ID/pause' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

Outgoing webhooks​

create_webhook​

Create a signed webhook subscription.

REST: POST /v1/webhooks · MCP: create_webhook · Scope: webhooks

Body fieldRequiredType
nameYesstring
urlYesstring (uri)
eventsYesarray
includeResultNoboolean
Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 160
},
"url": {
"type": "string",
"format": "uri"
},
"events": {
"minItems": 1,
"type": "array",
"items": {
"type": "string"
}
},
"includeResult": {
"type": "boolean"
}
},
"required": [
"name",
"url",
"events"
],
"additionalProperties": false
}
Example body
{
"name": "Result receiver",
"url": "https://receiver.example.com/signailist",
"events": [
"processing.completed"
],
"includeResult": true
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/webhooks' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

list_webhooks​

List webhook subscriptions.

REST: GET /v1/webhooks · MCP: list_webhooks · Scope: webhooks

curl --fail-with-body --request GET 'https://api.signailist.com/v1/webhooks' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

list_webhook_deliveries​

Read delivery attempts with cursor pagination.

REST: GET /v1/webhooks/deliveries · MCP: list_webhook_deliveries · Scope: webhooks

Query fieldRequiredFormat
cursorNostring
limitNointeger; default=50; max=100

Result: { items, nextCursor }. Pass nextCursor as cursor on the next request; null means the end.

curl --fail-with-body --request GET 'https://api.signailist.com/v1/webhooks/deliveries' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

rotate_webhook​

Rotate secret with 24-hour overlap.

REST: POST /v1/webhooks/{id}/rotate · MCP: rotate_webhook · Scope: webhooks

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/webhooks/OBJECT_ID/rotate' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

pause_webhook​

Pause webhook delivery.

REST: POST /v1/webhooks/{id}/pause · MCP: pause_webhook · Scope: webhooks

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/webhooks/OBJECT_ID/pause' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

resume_webhook​

Resume webhook delivery.

REST: POST /v1/webhooks/{id}/resume · MCP: resume_webhook · Scope: webhooks

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/webhooks/OBJECT_ID/resume' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

retry_webhook​

Retry a failed paid delivery, preserving event identity.

REST: POST /v1/webhooks/deliveries/{id}/retry · MCP: retry_webhook · Scope: webhooks

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/webhooks/deliveries/OBJECT_ID/retry' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data '{}'

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

Billing and reservations​

billing_summary​

Read workspace balance and spending.

REST: GET /v1/billing/summary · MCP: billing_summary · Scope: billing:read

Query fieldRequiredFormat
fromNostring (date-time)
toNostring (date-time)
daysNointeger; default=30; max=3650
curl --fail-with-body --request GET 'https://api.signailist.com/v1/billing/summary' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

billing_usage​

Read usage and operation history.

REST: GET /v1/billing/usage · MCP: billing_usage · Scope: billing:read

Query fieldRequiredFormat
fromNostring (date-time)
toNostring (date-time)
daysNointeger; default=30; max=3650
pageNointeger; default=1
pageSizeNointeger; default=20; max=200
groupByNostring
operationNostring
platformNostring
sourceIdNostring
curl --fail-with-body --request GET 'https://api.signailist.com/v1/billing/usage' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

list_reservations​

Read reservations and interrupted work with cursor pagination.

REST: GET /v1/reservations · MCP: list_reservations · Scope: billing:read

Query fieldRequiredFormat
cursorNostring
limitNointeger; default=50; max=100

Result: { items, nextCursor }. Pass nextCursor as cursor on the next request; null means the end.

curl --fail-with-body --request GET 'https://api.signailist.com/v1/reservations' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

budget​

Read available and reserved balance.

REST: GET /v1/budget · MCP: budget · Scope: billing:read

curl --fail-with-body --request GET 'https://api.signailist.com/v1/budget' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY"

estimate​

Estimate operation costs using the central pricing configuration.

REST: POST /v1/estimates · MCP: estimate · Scope: billing:read

Body: shared-handler JSON object; see the workflow and request example for write fields. The generic schema does not describe every business check.

Request JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
Example body
{
"operation": "generateDigest",
"model": "openai/gpt-6-luna",
"usage": {
"inputTokens": 1000,
"outputTokens": 500
}
}
curl --fail-with-body --request POST 'https://api.signailist.com/v1/estimates' \
--header "Authorization: Bearer $SIGNAILIST_API_KEY" \
--header "Idempotency-Key: YOUR_STABLE_REQUEST_KEY" \
--header 'Content-Type: application/json' \
--data-binary @request.json

For MCP pass the same fields in body, the path ID separately as id when present, and the stable key as idempotencyKey. URL-encode REST path IDs. One-time secrets are omitted from replay responses.

Authorization and public service endpoints​

These are protocol/schema HTTP endpoints, not extra business tools. Admin and session-only application routes are not part of the public REST API.

MethodURL/pathPurpose
GET/.well-known/oauth-protected-resourceOAuth resource metadata
GET/.well-known/oauth-authorization-serverOAuth server metadata
POST/oauth/registerDynamic client registration
GET/oauth/authorizeBrowser sign-in/consent redirect
POST/oauth/tokenCode/refresh token exchange
POST/oauth/revokeToken revocation
POST/mcpAuthenticated MCP JSON-RPC, not an arbitrary REST proxy
GET/v1/openapi.jsonPublic API specification

Relative endpoints use https://api.signailist.com. The owner issues keys, sets financial limits and reconciles interrupted holds in integration settings. These privileged actions are not agent tools for increasing its own access.