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
| MCP | REST | Scope | Paid start |
|---|---|---|---|
| author_overview | GET /v1/author/overview | read | No¹ |
| edit_telegram_publication | POST /v1/accounts/telegram/{id}/messages/edit | publish | No¹ |
| verify_telegram_publications | POST /v1/accounts/telegram/{id}/messages/check | read | No¹ |
| regenerate_author_version | POST /v1/author/editions/{id}/regenerate-version | run | Yes |
| resume_author_edition | POST /v1/author/editions/{id}/resume | run | Yes |
| check_telegram_channels | POST /v1/accounts/telegram/{id}/channels/check | configure | No¹ |
| sync_telegram_channels | POST /v1/accounts/telegram/{id}/channels/sync | configure | No¹ |
| list_content_catalogs | GET /v1/author/catalogs | read | No¹ |
| create_content_catalog | POST /v1/author/catalogs | configure | No¹ |
| get_content_catalog | GET /v1/author/catalogs/{id} | read | No¹ |
| sync_content_catalog | POST /v1/author/catalogs/{id}/sync | configure | No¹ |
| list_catalog_items | GET /v1/author/catalogs/{id}/items | read | No¹ |
| put_catalog_item | PUT /v1/author/catalogs/{id}/items | configure | No¹ |
| list_author_series | GET /v1/author/series | read | No¹ |
| create_author_series | POST /v1/author/series | configure | No¹ |
| get_author_series | GET /v1/author/series/{id} | read | No¹ |
| update_author_series | PUT /v1/author/series/{id} | configure | No¹ |
| set_author_automation | POST /v1/author/series/{id}/automation | configure | No¹ |
| trial_author_series | POST /v1/author/series/{id}/trial | run | Yes |
| list_author_editions | GET /v1/author/series/{id}/editions | read | No¹ |
| get_author_edition | GET /v1/author/editions/{id} | read | No¹ |
| publish_author_edition | POST /v1/author/editions/{id}/publish | publish | Yes |
| delete_source | DELETE /v1/sources/{id} | configure | No¹ |
| delete_template | DELETE /v1/templates/{id} | configure | No¹ |
| delete_schedule | DELETE /v1/schedules/{id} | configure | No¹ |
| list_publications | GET /v1/publications | read | No¹ |
| list_telegram_accounts | GET /v1/accounts/telegram | read | No¹ |
| get_source_topic_tracking | GET /v1/source-topic-tracking | read | No¹ |
| list_sources | GET /v1/sources | read | No¹ |
| create_source | POST /v1/sources | configure | No¹ |
| update_source | PATCH /v1/sources/{id} | configure | No¹ |
| collect_source | POST /v1/sources/{id}/collect | run | Yes |
| prepare_source | POST /v1/sources/{id}/prepare | run | Yes |
| track_source_topics | POST /v1/source-topic-tracking | configure | No¹ |
| source_status | GET /v1/sources/{id}/analysis-status | read | No¹ |
| source_materials | GET /v1/sources/{id}/materials | read | No¹ |
| source_results | GET /v1/sources/{id}/results | read | No¹ |
| list_topics | GET /v1/topics | read | No¹ |
| create_topic | POST /v1/topics | configure | No¹ |
| update_topic | PATCH /v1/topics/{id} | configure | No¹ |
| delete_topic | DELETE /v1/topics/{id} | configure | No¹ |
| list_templates | GET /v1/templates | read | No¹ |
| create_template | POST /v1/templates | configure | No¹ |
| update_template | PATCH /v1/templates/{id} | configure | No¹ |
| generate_template | POST /v1/templates/generate | run | Yes |
| list_digests | GET /v1/digests | read | No¹ |
| digest_candidates | GET /v1/digest-candidates | read | No¹ |
| create_digest | POST /v1/digests | configure | No¹ |
| get_digest | GET /v1/digests/{id} | read | No¹ |
| update_digest | PATCH /v1/digests/{id} | configure | No¹ |
| generate_digest_text | POST /v1/digests/{id}/generate-text | run | Yes |
| generate_digest_image | POST /v1/digests/{id}/generate-image | run | Yes |
| score_material | POST /v1/materials/{id}/score | run | Yes |
| get_document | GET /v1/digests/{id}/document | read | No¹ |
| save_document | PUT /v1/digests/{id}/document | configure | No¹ |
| approve_document | POST /v1/digests/{id}/approve | publish | No¹ |
| publish_document | POST /v1/digests/{id}/publish | publish | Yes |
| list_connections | GET /v1/connections | read | No¹ |
| create_discord_connection | POST /v1/connections | publish | No¹ |
| revoke_connection | POST /v1/connections/{id}/revoke | publish | No¹ |
| list_targets | GET /v1/targets | read | No¹ |
| create_target | POST /v1/targets | publish | No¹ |
| update_target | PATCH /v1/targets/{id} | publish | No¹ |
| list_schedules | GET /v1/schedules | read | No¹ |
| create_schedule | POST /v1/schedules | configure | No¹ |
| update_schedule | PATCH /v1/schedules/{id} | publish | No¹ |
| enable_schedule | POST /v1/schedules/{id}/enable | publish | No¹ |
| pause_schedule | POST /v1/schedules/{id}/pause | configure | No¹ |
| trigger_schedule | POST /v1/schedules/{id}/trigger | publish | Yes |
| list_candidates | GET /v1/publication-candidates | read | No¹ |
| approve_candidate | POST /v1/publication-candidates/{id}/approve | publish | Yes |
| reject_candidate | POST /v1/publication-candidates/{id}/reject | publish | No¹ |
| get_delivery | GET /v1/deliveries/{id} | read | No¹ |
| retry_delivery | POST /v1/deliveries/{id}/retry | publish | Yes |
| cancel_publication | POST /v1/publications/{id}/cancel | configure | No¹ |
| list_jobs | GET /v1/jobs | read | No¹ |
| cancel_job | POST /v1/jobs/{id}/cancel | configure | No¹ |
| list_assets | GET /v1/assets | read | No¹ |
| upload_asset | POST /v1/assets | run | Yes |
| list_signals | GET /v1/signals | read | No¹ |
| create_signal | POST /v1/signals | configure | No¹ |
| update_signal | PATCH /v1/signals/{id} | configure | No¹ |
| enable_signal | POST /v1/signals/{id}/enable | run | No¹ |
| pause_signal | POST /v1/signals/{id}/pause | configure | No¹ |
| billing_summary | GET /v1/billing/summary | billing:read | No¹ |
| billing_usage | GET /v1/billing/usage | billing:read | No¹ |
| get_job | GET /v1/jobs/{id} | read | No¹ |
| list_models | GET /v1/models | read | No¹ |
| list_reservations | GET /v1/reservations | billing:read | No¹ |
| capabilities | GET /v1/capabilities | read | No¹ |
| create_external_source | POST /v1/external-sources | configure | No¹ |
| ingest_materials | POST /v1/external-sources/{id}/items | ingest | No¹ |
| budget | GET /v1/budget | billing:read | No¹ |
| estimate | POST /v1/estimates | billing:read | No¹ |
| get_integration | GET /v1/integration | read | No¹ |
| revoke_integration | POST /v1/integration/revoke | read | No¹ |
| create_webhook | POST /v1/webhooks | webhooks | No¹ |
| list_webhooks | GET /v1/webhooks | webhooks | No¹ |
| list_webhook_deliveries | GET /v1/webhooks/deliveries | webhooks | No¹ |
| rotate_webhook | POST /v1/webhooks/{id}/rotate | webhooks | No¹ |
| pause_webhook | POST /v1/webhooks/{id}/pause | webhooks | No¹ |
| resume_webhook | POST /v1/webhooks/{id}/resume | webhooks | No¹ |
| retry_webhook | POST /v1/webhooks/deliveries/{id}/retry | webhooks | No¹ |
¹ 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": {}
}
{}
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": {}
}
{}
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 field | Required | Format |
|---|---|---|
cursor | No | string |
limit | No | integer; 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 field | Required | Type |
|---|---|---|
provider | No | string |
title | No | string |
url | No | string (uri) |
username | No | string |
enabled | No | boolean |
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": {}
}
{
"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": {}
}
{
"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": {}
}
{}
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": {}
}
{}
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": {}
}
{
"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 field | Required | Format |
|---|---|---|
cursor | No | string |
limit | No | integer; 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 field | Required | Format |
|---|---|---|
cursor | No | string |
limit | No | integer; 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 field | Required | Format |
|---|---|---|
cursor | No | string |
limit | No | integer; 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 field | Required | Type |
|---|---|---|
name | Yes | string |
prompt | Yes | string |
negativePrompt | No | string |
aiModel | No | string |
isActive | No | boolean |
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": {}
}
{
"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": {}
}
{
"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": {}
}
{}
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": {}
}
{}
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 field | Required | Format |
|---|---|---|
cursor | No | string |
limit | No | integer; 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 field | Required | Type |
|---|---|---|
name | Yes | string |
tonePrompt | Yes | string |
renderTemplate | Yes | string |
sourceId | No | string |
imageEnabled | No | boolean |
textAiModel | No | string |
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": {}
}
{
"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": {}
}
{
"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 field | Required | Type |
|---|---|---|
publicationJobId | Yes | string |
expectedText | Yes | string |
text | Yes | string |
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 field | Required | Type |
|---|---|---|
publicationJobIds | Yes | array |
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 field | Required | Type |
|---|---|---|
versionId | Yes | string |
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 field | Required | Type |
|---|---|---|
channels | Yes | array |
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 field | Required | Type |
|---|---|---|
kind | Yes | string |
title | Yes | string |
baseUrl | No | string (uri) |
bearerToken | No | string |
manifest | No | object |
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 field | Required | Type |
|---|---|---|
id | Yes | string |
revision | Yes | string |
localized | Yes | object |
tags | Yes | array |
attributes | Yes | object |
images | Yes | array |
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 field | Required | Type |
|---|---|---|
title | Yes | string |
catalogId | Yes | string |
config | Yes | object |
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 field | Required | Type |
|---|---|---|
expectedRevision | No | string |
title | Yes | string |
catalogId | Yes | string |
config | Yes | object |
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 field | Required | Type |
|---|---|---|
enabled | Yes | boolean |
autoPublish | Yes | boolean |
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 field | Required | Type |
|---|---|---|
intentKey | Yes | string |
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 field | Required | Type |
|---|---|---|
immediate | No | boolean |
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 field | Required | Format |
|---|---|---|
cursor | No | string |
limit | No | integer; 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 field | Required | Format |
|---|---|---|
periodStart | Yes | string (date-time) |
periodEnd | Yes | string (date-time) |
sourceIds | No | string |
q | No | string |
ai | No | string |
limit | No | integer; 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 field | Required | Type |
|---|---|---|
templateId | Yes | string |
periodStart | Yes | string (date-time) |
periodEnd | Yes | string (date-time) |
selectedProcessedItemIds | Yes | array |
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": {}
}
{
"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": {}
}
{}
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": {}
}
{}
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 field | Required | Type |
|---|---|---|
title | Yes | string |
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
}
{
"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 field | Required | Type |
|---|---|---|
items | Yes | array |
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
}
{
"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 field | Required | Format |
|---|---|---|
cursor | No | string |
limit | No | integer; 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": {}
}
{
"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": {}
}
{}
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 field | Required | Format |
|---|---|---|
cursor | No | string |
limit | No | integer; 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": {}
}
{
"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": {}
}
{}
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 field | Required | Format |
|---|---|---|
cursor | No | string |
limit | No | integer; 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": {}
}
{
"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": {}
}
{
"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": {}
}
{}
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": {}
}
{}
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": {}
}
{}
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 field | Required | Format |
|---|---|---|
cursor | No | string |
limit | No | integer; 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": {}
}
{}
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 field | Required | Format |
|---|---|---|
cursor | No | string |
limit | No | integer; 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 field | Required | Type |
|---|---|---|
expectedRevision | Yes | integer |
document | Yes | object |
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
}
{
"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 field | Required | Type |
|---|---|---|
revision | Yes | integer |
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
}
{
"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.