FlowState API (1.0.0)

Download OpenAPI specification:

FlowState is an enterprise sports-team asset generation platform. This API lets you operate FlowState programmatically with your organization's API key: create and manage templates, render single or batch assets, manage your sports-data entities, push data in through signed webhooks, and publish rendered assets to your destinations.

Authentication

Every endpoint is authenticated with a per-organization API key sent in the x-api-key header. Keys are generated by an org admin in the dashboard under Config -> API.

GET /api/v1/templates HTTP/1.1
Host: flowstate.bot
x-api-key: your_api_key_here

A request without a valid key returns 401. The key resolves your organization, and every resource you read or write is scoped to that organization automatically.

Scopes

API keys carry a list of scopes. Each operation below documents the scope it requires in its description. The available scopes are:

Scope Grants
read:jobs Read render jobs and their status
write:jobs Create, rerun, publish and delete render jobs (incl. renders and batches)
read:templates Read templates, versions, variants and sets
write:templates Create, update and publish templates; delete versions, variants and sets. Deleting a template itself needs admin:org
read:destinations Read publishing destinations
read:channel Poll and download one distribution channel's feed (channel subscriber keys; the key is bound to exactly one channel)
admin:org Super-scope: grants every other scope

Operations marked (any key) have no granular scope yet (the entity endpoints). They accept a key with an empty scope list or a key with admin:org. A key that carries specific scopes (for example only read:templates) is restricted to operations that require one of its scopes and receives 403 with error code api_key_scope_required on any (any key) operation. A 403 with { "error": "Insufficient API key scope", "required": [...], "missing": [...] } is returned when a key lacks the scope an operation needs.

Conventions

  • Base URL: https://flowstate.bot
  • Casing: Most resource responses are snake_case (for example template_id, created_at). The destination endpoints return raw payloads in camelCase; the affected fields are documented as-is in each schema.
  • Item envelope: single resources are wrapped as { "object": "<type>", "data": { ... } }.
  • List envelope: collections are wrapped as { "object": "list", "data": [ ... ], "has_more": <bool>, "next_cursor": <string|null> }, sometimes with extra fields such as total or stats.
  • Legacy { success: true } envelope: the destination endpoints use a flatter { "success": true, ... } shape instead of the item/list envelope.
  • Errors: the standard error envelope is { "error": { "type", "code", "message", "param" } }. In production, 5xx messages are generic; scope and legacy { success: false } errors use a flatter shape (see the Scopes section).
  • Idempotency: mutating /api/v1 requests accept an optional Idempotency-Key header; a replay with the same key returns the original response.
  • Rate limits: requests are limited per minute in three tiers - read (GET), write (POST/PUT/PATCH/DELETE) and render (/renders/sync). Depending on the route, a limit applies per API key or per client IP. The channel feed (/channel/...) adds a quota per API key on top (see the Channel Feed tag). Exceeding a limit returns 429 in the standard error envelope (type: rate_limit_error, code: rate_limited) with a Retry-After header (seconds until the window resets); RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset describe the current window.

Renders

Render a single asset synchronously from a template.

Render an asset synchronously

Render a single asset and return the resulting PNG directly in the response body. Requires the write:jobs scope. Image inputs are supplied either as uploaded files (one part per template field) or as URL fields named <fieldId>_url.

Authorizations:
ApiKeyAuth
Request Body schema: multipart/form-data
required
template
string

Template id or slug. Defaults to angled-logo.

team_name
string
variant_id
string
standings_league_id
string

League id for a standings render. Stamps jobs.league_id on the persisted job so a team-less league asset can auto-populate the League Hub.

color
string

Legacy templates - team colour (hex).

logo
string <binary>

Legacy templates - logo image file.

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Jobs

Render job lifecycle - create, inspect, publish, rerun and delete.

Create a render job

Create a render job from a template. Requires the write:jobs scope.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
template_id
required
string <uuid>
object

Field values for the template.

variant_id
string or null <uuid>
output_format
string
Default: "png"
Enum: "png" "pdf"

pdf emits a print-ready PDF/X-4 instead of a PNG: the render is rasterised at the template's print resolution (default 300 DPI, per-template print_config.dpi) with supersampled anti-aliasing (see print_config.supersample), separated to CMYK and delivered with an embedded ISO Coated v2 300% (FOGRA39) output intent. HTML templates only.

Responses

Request samples

Content type
application/json
{
  • "template_id": "c6d67e98-83ea-49f0-8812-e4abae2b68bc",
  • "data": { },
  • "variant_id": "8a2d415d-59aa-4132-bef3-011f97c4a0f6",
  • "output_format": "png"
}

Response samples

Content type
application/json
{
  • "object": "job",
  • "data": {
    }
}

Delete multiple jobs

Permanently delete a set of jobs by id, together with their rendered files. Files that are still used elsewhere, for example by a Club Hub asset, are kept. Requires the write:jobs scope.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
jobIds
required
Array of strings <uuid> non-empty [ items <uuid > ]

Responses

Request samples

Content type
application/json
{
  • "jobIds": [
    ]
}

Response samples

Content type
application/json
{
  • "object": "bulk_operation",
  • "data": {
    }
}

Publish multiple jobs

Publish a set of completed jobs to the same destinations in one request. Requires the write:jobs scope.

Like the single-job publish endpoint this only enqueues the work and answers 202; delivery happens asynchronously. Jobs that cannot be published are not an error - they come back under skipped with a reason (not_found, not_completed, no_output), where not_found also covers ids belonging to another organization.

Poll /api/v1/jobs/publish-status for the per-destination outcome.

When the organization limits approval (Dispatch settings, approval.mode other than anyone), only approvers may publish to a social destination; everyone else gets 403 approval_required. Storage destinations (S3, Drive, email, webhook) are not affected.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
jobIds
required
Array of strings <uuid> [ 1 .. 100 ] items [ items <uuid > ]
destinationIds
required
Array of strings <uuid> non-empty [ items <uuid > ]

Responses

Request samples

Content type
application/json
{
  • "jobIds": [
    ],
  • "destinationIds": [
    ]
}

Response samples

Content type
application/json
{
  • "object": "bulk_publish_action",
  • "data": {
    }
}

Publish outcome for a set of jobs

Per-destination publish result for up to 100 jobs. Requires the read:jobs scope.

publish_status stays null until the asynchronous publish has finished, which makes this the honest answer to "did it publish?" - the publish endpoints themselves only ever confirm that the work was queued. A job published earlier still carries the record of that run, so compare published_at against what the job had before you queued.

Authorizations:
ApiKeyAuth
query Parameters
ids
required
string

Comma-separated job ids (max 100).

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ]
}

Download several jobs as one ZIP

Streams a single ZIP archive of the selected completed jobs, built server-side. Each single-asset job becomes one entry named after its title; a batch job expands to its per-render assets under a folder. Unreachable assets are skipped rather than failing the whole archive. Requires the read:jobs scope.

Authorizations:
ApiKeyAuth
query Parameters
ids
required
string

Comma-separated job ids (max 100).

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

List recent jobs

Paginated list of the organization's recent jobs. Requires the read:jobs scope. The list envelope additionally includes total and a stats object.

Authorizations:
ApiKeyAuth
query Parameters
limit
integer [ 1 .. 100 ]
Default: 25
offset
integer >= 0
Default: 0
search
string
type
string
Enum: "templates" "workflows"
source
string
Enum: "manual" "magnifi"
publish
string
Enum: "published" "unpublished"
team
string

Exact team name.

template
string

Token tpl:<id> or wf:<id>.

set
string

Set id — only runs whose template belongs to that set. Pass none for templates that belong to no set. Runs without a template (reels, workflow runs) are excluded whenever this filter is set.

created_after
string <date-time>

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string",
  • "total": 0,
  • "stats": {
    }
}

Get a job

Fetch a single job by id. Requires the read:jobs scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "job",
  • "data": {
    }
}

Delete a job

Delete a single job together with its rendered files (output, thumbnail, batch files). Files that are still used elsewhere, for example by a Club Hub asset, are kept. Requires the write:jobs scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "item",
  • "data": {
    }
}

Get job progress

Lightweight progress for fast polling. Requires the read:jobs scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "job_progress",
  • "data": {
    }
}

Download the rendered asset

Redirects to a short-lived signed URL that serves the asset as an attachment, named after the asset's title. Follow the redirect to receive the file. Batch jobs redirect to the batch ZIP endpoint. Requires the read:jobs scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Publish a completed job

Publish a completed job's asset to one or more destinations. The job must be completed with an output_url. Requires the write:jobs scope.

When the organization limits approval (Dispatch settings, approval.mode other than anyone), only approvers may publish to a social destination; everyone else gets 403 approval_required. Storage destinations (S3, Drive, email, webhook) are not affected. This applies to an immediate and a scheduled publish.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
Request Body schema: application/json
required
destinationIds
required
Array of strings <uuid> non-empty [ items <uuid > ]
caption
string <= 64000 characters

Optional per-post text. When present it overrides the destination's configured caption template for social destinations (Instagram, Facebook, LinkedIn). An empty string means "publish with no text"; omit the field to fall back to the template. Storage destinations ignore it.

scheduledAt
string <date-time>

Optional ISO timestamp, at least one minute in the future. When present the publish is scheduled rather than sent immediately: one scheduled post per social destination is created and fired at that time by the scheduler. Only social destinations can be scheduled; a request that resolves to no social destination returns 400. Omit for immediate publish.

object

Per-post rich-publishing parameters. Applied on both the immediate and scheduled paths. Unknown keys are ignored (allowlist). Currently only alt_text.

Responses

Request samples

Content type
application/json
{
  • "destinationIds": [
    ],
  • "caption": "string",
  • "scheduledAt": "2019-08-24T14:15:22Z",
  • "options": {
    }
}

Response samples

Content type
application/json
{
  • "object": "publish_action",
  • "data": {
    }
}

Preview a publish without sending it

Returns, per selected social destination, the final interpolated caption and the preflight findings (caption length / hashtag / mention limits, media format, carousel item count) that would apply if the job were published now. Read-only: nothing is posted and no event is dispatched. The caption and surface are computed with the same code the real publish uses, so the preview cannot drift from the actual post. Storage/webhook/ email destinations carry no caption and are omitted from the result.

Captions may use caption variables such as {home}, {score} or {player}. They are resolved per asset; a variable without a value is reported in missing_variables and as a preflight error, because the publish refuses a caption with an unresolved variable. A {word} that is not a caption variable is literal text (a warning, never a block). Stories show no caption, so they report no open variables. Requires the write:jobs scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
Request Body schema: application/json
required
destinationIds
Array of strings <uuid> non-empty [ items <uuid > ]
caption
string <= 64000 characters

Optional per-post text override, same semantics as the publish endpoint. Omit to preview the destination's template.

Array of objects [ 1 .. 10 ] items

Per-destination caption and surface. A string caption replaces the master caption for that destination; surface replaces the destination's default surface.

Responses

Request samples

Content type
application/json
{
  • "destinationIds": [
    ],
  • "caption": "string",
  • "placements": [
    ]
}

Response samples

Content type
application/json
{
  • "object": "publish_preview",
  • "data": {
    }
}

Rerun a job

Clone a completed or failed job into a new pending render. Requires write:jobs.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "job",
  • "data": {
    }
}

Batch

Template-centric batch renders.

Create a batch render

Create a template-centric batch render. Requires write:jobs. Provide exactly one row source:

  • rows - CSV source: each row carries pre-resolved <field>_url values.
  • league_id / team_ids - "Select League" source: the server expands the league's active teams (or an explicit team_ids subset) into rows (single-team templates). Mutually exclusive with rows.
  • game_ids - "Select Matchday" source: the server expands the given games into home-vs-away rows (matchup templates), resolving logos / colors / names / score / kickoff from the DB. Org-scoped; foreign ids are dropped. Mutually exclusive with rows and with the league source.

This endpoint returns a raw { data } payload (no object wrapper).

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
template_id
required
string <uuid>
Array of objects non-empty

CSV source. One object per asset; carries <field>_url values. Legacy alias variants is accepted. Mutually exclusive with league_id.

league_id
string <uuid>

"Select League" source. Renders the whole league (its active teams) x the selected variants. Mutually exclusive with rows.

team_ids
Array of strings <uuid> [ items <uuid > ]

"Select League" source, refined. Render exactly these teams (pick / deselect). Org-scoped; foreign ids are dropped. Wins over league_id. Mutually exclusive with rows.

game_ids
Array of strings <uuid> [ items <uuid > ]

"Select Matchday" source. Render exactly these games as home-vs-away rows (matchup templates). Org-scoped; foreign ids are dropped. Mutually exclusive with rows and with league_id / team_ids.

variant_ids
Array of strings <uuid> [ items <uuid > ]

Variants to fan out per row. Empty - the template default variant.

name_column
string
Default: ""
output_format
string
Default: "png"
Enum: "png" "pdf"

pdf renders every asset of the batch as a print-ready PDF/X-4 (300 DPI raster with supersampled anti-aliasing, CMYK, embedded ISO Coated v2 300% / FOGRA39 output intent) instead of PNG. HTML templates only.

Responses

Request samples

Content type
application/json
{
  • "template_id": "c6d67e98-83ea-49f0-8812-e4abae2b68bc",
  • "rows": [
    ],
  • "league_id": "2a3fad45-7758-4caa-9967-1aff5d77e41a",
  • "team_ids": [
    ],
  • "game_ids": [
    ],
  • "variant_ids": [
    ],
  • "name_column": "",
  • "output_format": "png"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Retry failed rows of a batch

Re-queue the failed rows of a batch job. Requires the write:jobs scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Download a batch as ZIP

Streams a ZIP of all successfully rendered batch assets, built on demand from the per-render asset URLs. Multi-team batches are grouped into one folder per team; every file is named <team>_<template>_<variant>.<ext>. Legacy batches that stored a combined ZIP are redirected (302) to it. Requires read:jobs.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Templates

Templates, their version history, preview and upload.

List templates

List the organization's templates. Requires the read:templates scope. The list view exposes the logo URL as thumbnail_url and omits html_content.

Authorizations:
ApiKeyAuth
query Parameters
include_live_status
string
Value: "true"

When true, each template includes a live_automation object (or null).

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string"
}

Get a template

Fetch a single template. Requires the read:templates scope. The single view exposes the logo URL under the key thumbnail and includes html_content.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
query Parameters
include_live_status
string
Value: "true"

Responses

Response samples

Content type
application/json
{
  • "object": "template",
  • "data": {
    }
}

Update a template

Update template metadata. Requires the write:templates scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
Request Body schema: application/json
required
name
string
description
string
thumbnail_url
string
object
set_id
string or null <uuid>
club_hub_visible
boolean
template_purpose
string or null
Enum: "reel_intro" "reel_lower_third" "reel_outro"

Reel role tag so a template can serve as a reel intro or lower-third. Send null to clear it.

manual_minutes
integer or null >= 0

Estimated minutes to hand-make one asset from this template; drives the Time Saved figure. Send null to clear.

object or null (PrintConfig)

Print export settings for output_format: pdf renders (PDF/X-4 CMYK). Stored per template; snapshotted onto jobs at creation. Pass null to clear.

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "description": "string",
  • "thumbnail_url": "string",
  • "config": { },
  • "set_id": "516c4b88-fac0-4d1c-bb7a-9a8534cc5e71",
  • "club_hub_visible": true,
  • "template_purpose": "reel_intro",
  • "manual_minutes": 0,
  • "print_config": {
    }
}

Response samples

Content type
application/json
{
  • "object": "template",
  • "data": {
    }
}

Delete a template

Soft-delete a template. Restricted to org admins: a dashboard session needs the org admin or owner role, an API key needs the admin:org scope (write:templates alone is not enough). Members and narrower keys receive 403 with error code admin_required (session) or admin_scope_required (API key).

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "item",
  • "data": {
    }
}

List template versions

Master and per-variant version history. Requires the read:templates scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "versions",
  • "data": {
    }
}

Preview a template

Render a template to HTML for preview. Requires the read:templates scope. This endpoint returns a bare object (no item envelope). Only HTML engines are supported; async engines (AE, motion) return 400.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
Request Body schema: application/json
team_id
string <uuid>
player_id
string <uuid>
object

Field value overrides.

version_id
string <uuid>
variant_id
string <uuid>

Responses

Request samples

Content type
application/json
{
  • "team_id": "810007d0-bec5-486c-b5d1-28fcd8a079ba",
  • "player_id": "f8b23bf6-c56d-4f96-b79c-96d80504663d",
  • "fields": { },
  • "version_id": "9e94c502-ca41-4342-a7f7-af96b444512c",
  • "variant_id": "8a2d415d-59aa-4132-bef3-011f97c4a0f6"
}

Response samples

Content type
application/json
{
  • "html": "string",
  • "viewport": {
    },
  • "selector": "string",
  • "motion_manifest": {
    }
}

Publish a template version

Make a specific version the published version. Requires the write:templates scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
Request Body schema: application/json
required
version_id
required
string <uuid>

Responses

Request samples

Content type
application/json
{
  • "version_id": "9e94c502-ca41-4342-a7f7-af96b444512c"
}

Response samples

Content type
application/json
{
  • "object": "template",
  • "data": {
    }
}

Roll back to a version

Activate an earlier version. Requires the write:templates scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
Request Body schema: application/json
required
version_id
required
string <uuid>

Responses

Request samples

Content type
application/json
{
  • "version_id": "9e94c502-ca41-4342-a7f7-af96b444512c"
}

Response samples

Content type
application/json
{
  • "object": "version",
  • "data": {
    }
}

Roll back a variant to a version

Activate an earlier scoped version of a variant. Requires the write:templates scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
variantId
required
string <uuid>
Request Body schema: application/json
required
version_id
required
string <uuid>

Responses

Request samples

Content type
application/json
{
  • "version_id": "9e94c502-ca41-4342-a7f7-af96b444512c"
}

Response samples

Content type
application/json
{
  • "object": "version",
  • "data": {
    }
}

Delete a template version

Delete a specific version. The published version and the last remaining version cannot be deleted. Requires the write:templates scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
versionId
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "object": "version",
  • "data": {
    }
}

Clone a template

Create a copy of a template. Requires the write:templates scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "template",
  • "data": {
    }
}

Upload a template package

Upload a template package (ZIP) as a multipart file field template_package. Requires the write:templates scope. Returns a { success, data, message } envelope.

Authorizations:
ApiKeyAuth
Request Body schema: multipart/form-data
required
template_package
required
string <binary>
templateId
string <uuid>

Update an existing template instead of creating one.

set_id
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": { },
  • "message": "string"
}

Sets

Named groupings of templates.

List sets

List the organization's sets. Requires the read:templates scope.

Authorizations:
ApiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "object": "item",
  • "data": [
    ]
}

Create a set

Create a new set. Requires the write:templates scope.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
name
required
string
color
string
description
string
parent_set_id
string or null <uuid>

Set this as a Campaign nested under a top-level set. The referenced set must itself be top-level (max nesting depth is 2 — no grandchildren).

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "color": "string",
  • "description": "string",
  • "parent_set_id": "d484354e-b6f3-4a6c-a8f8-87572ba77b6e"
}

Response samples

Content type
application/json
{
  • "object": "set",
  • "data": {
    }
}

Update a set

Update a set. Requires the write:templates scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
Request Body schema: application/json
required
name
string
color
string or null
description
string or null
parent_set_id
string or null <uuid>

Reparent onto a top-level set (Campaign), or null to detach to top-level. Rejected if this set itself already has campaigns nested under it, or if it would reference itself.

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "color": "string",
  • "description": "string",
  • "parent_set_id": "d484354e-b6f3-4a6c-a8f8-87572ba77b6e"
}

Response samples

Content type
application/json
{
  • "object": "item",
  • "data": {
    }
}

Delete a set

Delete a set; member templates become unassigned. Requires the write:templates scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "item",
  • "data": {
    }
}

Channel Feed

Partner-facing read API for one distribution channel. The channel is resolved from the API key (a channel subscriber key with scope read:channel), never from the URL. Assets a partner cannot see (embargo, expiry, withdrawal, not a member) are indistinguishable: one 404.

Rate limits per API key. Every channel feed endpoint counts against two limits of the calling key, the download endpoints against a third:

Limit Default Applies to
Per minute 120 requests every channel feed endpoint
Daily quota 20,000 requests per 24 hours every channel feed endpoint
Downloads 60 requests per minute /download and /download-url only, on top of the two above

Windows are fixed and start with the first request in them. Limits count per key across all server instances; two keys never share a limit. A request refused by a tighter limit does not count against the wider ones. Exceeding a limit returns 429 in the standard error envelope (type: rate_limit_error, code: rate_limited) with a Retry-After header in seconds; the message names the limit (per minute, daily quota or downloads). On a successful response the RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset headers describe the daily quota; on a 429 they describe the limit that was hit.

Poll the channel feed

Keyset-paginated feed of the channel bound to the calling API key. Pass the returned next_cursor back as cursor to resume; new assets appear at the end as their embargo lifts (available_at order), so a poller never misses one. Requires a channel subscriber key (scope read:channel); other keys get 403.

Authorizations:
ApiKeyAuth
query Parameters
cursor
string

Opaque cursor from the previous page (next_cursor). A cursor this API did not issue is rejected with 400 invalid_cursor.

limit
integer [ 1 .. 100 ]
Default: 50

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string",
  • "channel": {
    }
}

Get one channel asset

Returns the asset if it is currently visible to this channel. An asset that does not exist, is embargoed, expired or withdrawn returns the SAME 404 - the feed does not disclose what exists or when it unlocks.

Authorizations:
ApiKeyAuth
path Parameters
assetId
required
string <uuid>

The asset id from the feed.

Responses

Response samples

Content type
application/json
{
  • "object": "channel_asset",
  • "data": {
    }
}

Download one channel asset

302 redirect to a short-lived file URL. Files in FlowState storage get a signed storage URL; video sources FlowState cannot sign itself (Magnifi highlights, Sportradar full-match recordings, external links) get a FlowState media link that re-checks the rights on every use and then redirects to the source. Either lifetime is clamped to the asset's effective expires_at; an expired media link answers 410. Every download (and every denied attempt) is recorded in the channel access log. When the subscription's billing is suspended (payment overdue beyond the grace window or canceled) the download is refused with 403 and error code subscription_suspended; feed and asset reads stay available.

Authorizations:
ApiKeyAuth
path Parameters
assetId
required
string <uuid>

The asset id from the feed.

Responses

Response samples

Content type
application/json
{
  • "error": {
    }
}

Mint a pull URL for one channel asset

Machine-readable variant of the download redirect - returns the pull URL as JSON so an automation can pull the asset into its own system. Same rights check as the download and the same URL kinds (a signed storage URL, or a FlowState media link that redirects to the video source after re-checking the rights; follow redirects when pulling). The URL lifetime is clamped to the asset's effective expires_at, expires_at in the response is the real end of the URL, and the mint is recorded in the channel access log as a publish. Re-mint any time while the asset is available. Requires the channel egress feature; billing suspension refuses the mint like a download (403 subscription_suspended).

Authorizations:
ApiKeyAuth
path Parameters
assetId
required
string <uuid>

The asset id from the feed.

Responses

Response samples

Content type
application/json
{
  • "object": "channel_asset_download_url",
  • "data": {
    }
}

Tape a full-match recording (spends 1 TAPE)

Claims the full-match recording of a game for this channel subscriber. It spends one TAPE from the prepaid season allowance and adds the recording permanently to the channel as a native asset - afterwards download and egress are free and unlimited. Re-taping the same game is idempotent (no second TAPE). Only for subscribers on a recording plan and flag-gated (channel_hub_tapes): prepaid_allowance spends a TAPE, flat_per_league (catalog) adds the full match without a TAPE and additionally needs the catalog to be enabled. Returns 402 when the season allowance is exhausted. A paused or archived channel answers 404 (like the feed). Every check runs before the TAPE is spent, so a rejected call never costs a TAPE.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
game_id
required
string <uuid>

FlowState game id to tape the full-match recording of.

Responses

Request samples

Content type
application/json
{
  • "game_id": "129babd7-0a5a-4108-81e4-77c8f2b49aed"
}

Response samples

Content type
application/json
{
  • "object": "channel_recording_tape",
  • "data": {
    }
}

Variants

Per-template variants and their entity bindings.

List variants

List a template's variants. Requires the read:templates scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "item",
  • "data": [
    ]
}

Create a variant

Create a variant. Requires the write:templates scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
Request Body schema: application/json
required
name
required
string
Array of objects
object

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "field_schema": [
    ],
  • "binding_config": { }
}

Response samples

Content type
application/json
{
  • "object": "variant",
  • "data": {
    }
}

Get a variant

Fetch a single variant. Requires the read:templates scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
variantId
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "object": "item",
  • "data": {
    }
}

Update a variant

Update a variant. Requires the write:templates scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
variantId
required
string <uuid>
Request Body schema: application/json
required
name
string
Array of objects or null
object or null
sort_order
integer >= 0

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "field_schema": [
    ],
  • "binding_config": { },
  • "sort_order": 0
}

Response samples

Content type
application/json
{
  • "object": "item",
  • "data": {
    }
}

Delete a variant

Delete a variant (the default variant cannot be deleted). Requires the write:templates scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
variantId
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "object": "item",
  • "data": {
    }
}

Promote a variant to default

Make a variant the template's default. Requires the write:templates scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
variantId
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "object": "item",
  • "data": {
    }
}

Activate (go live) a variant version

Pin the variant's active version (active_version_id) to the given version — this takes a DRAFT variant (no active version, e.g. one created from chat / Figma) live. Requires the write:templates scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
variantId
required
string <uuid>
Request Body schema: application/json
required
version_id
required
string <uuid>

The variant-scoped version to make active.

Responses

Request samples

Content type
application/json
{
  • "version_id": "9e94c502-ca41-4342-a7f7-af96b444512c"
}

Response samples

Content type
application/json
{
  • "object": "item",
  • "data": {
    }
}

Destinations

Publishing destinations (S3, Google Drive, email, webhook, social).

List destinations

List publishing destinations. Requires the read:destinations scope. Credentials are never returned; secret fields in config are redacted.

Authorizations:
ApiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "destinations": [
    ]
}

Get a destination

Fetch a single destination. Requires the read:destinations scope.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "destination": {
    }
}

Instagram 24h publish quota for a destination

Returns the rolling 24h content-publishing quota for an Instagram destination, so the composer can show remaining posts and block at the cap. Non-Instagram destinations return supported: false. Read-only.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "publish_quota",
  • "data": {
    }
}

Entities

Sports data - teams, players, leagues, clubs, sports, countries and games.

List countries

List countries. Requires a valid key.

Authorizations:
ApiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string"
}

Create a country

Create a country. Requires a valid key.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
name
required
string
code
required
string

Stored uppercased.

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "code": "string"
}

Response samples

Content type
application/json
{
  • "object": "country",
  • "data": {
    }
}

List sports

List sports. Requires a valid key.

Authorizations:
ApiKeyAuth

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string"
}

Create a sport

Create a sport. Requires a valid key.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
name
required
string
icon_url
string

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "icon_url": "string"
}

Response samples

Content type
application/json
{
  • "object": "sport",
  • "data": {
    }
}

Get a sport

Fetch a single sport. Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "sport",
  • "data": {
    }
}

Update a sport

Update a sport. Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
Request Body schema: application/json
required
name
string
icon_url
string

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "icon_url": "string"
}

Response samples

Content type
application/json
{
  • "object": "sport",
  • "data": {
    }
}

Delete a sport

Delete a sport. Returns 409 if leagues still reference it. Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "item",
  • "data": {
    }
}

List leagues

List leagues. Requires a valid key.

Authorizations:
ApiKeyAuth
query Parameters
sport_id
string <uuid>
country_id
string <uuid>
with_counts
string
Enum: "1" "true"

Include team_count per league.

exclude_empty
string
Enum: "1" "true"

Honoured only with with_counts.

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string"
}

Create a league

Create a league. Requires a valid key.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
name
required
string
abbreviation
string
sport_id
string <uuid>
country_id
string <uuid>
logo_url
string
color
string
description
string

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "abbreviation": "string",
  • "sport_id": "3b33d728-5ec0-45ea-a7eb-bd6133196129",
  • "country_id": "b42f7153-60f9-4aff-a5b5-21576be4161e",
  • "logo_url": "string",
  • "color": "string",
  • "description": "string"
}

Response samples

Content type
application/json
{
  • "object": "league",
  • "data": {
    }
}

Search leagues

Search leagues by name. Requires a valid key.

Authorizations:
ApiKeyAuth
query Parameters
q
required
string non-empty
limit
integer <= 50
Default: 15

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string"
}

Get a league

Fetch a single league. Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "league",
  • "data": {
    }
}

Update a league

Update a league. Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
Request Body schema: application/json
required
name
string
abbreviation
string
logo_url
string
sport_id
string <uuid>
country_id
string <uuid>
color
string
description
string
object

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "abbreviation": "string",
  • "logo_url": "string",
  • "sport_id": "3b33d728-5ec0-45ea-a7eb-bd6133196129",
  • "country_id": "b42f7153-60f9-4aff-a5b5-21576be4161e",
  • "color": "string",
  • "description": "string",
  • "metadata": { }
}

Response samples

Content type
application/json
{
  • "object": "league",
  • "data": {
    }
}

Delete a league

Delete a league. Returns 409 if active teams reference it. Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "item",
  • "data": {
    }
}

List clubs

List clubs. Requires a valid key.

Authorizations:
ApiKeyAuth
query Parameters
league_id
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string"
}

Create a club

Create a club. Requires a valid key.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
name
required
string
league_id
string <uuid>
external_id
string
logo_url
string

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "league_id": "2a3fad45-7758-4caa-9967-1aff5d77e41a",
  • "external_id": "string",
  • "logo_url": "string"
}

Response samples

Content type
application/json
{
  • "object": "club",
  • "data": {
    }
}

List teams

List teams. Requires a valid key. With paginated=true the response uses real pagination and adds a top-level total; league_id=none selects league-less teams.

Authorizations:
ApiKeyAuth
query Parameters
club_id
string <uuid>
league_id
string
active
string
Default: "true"
Enum: "true" "false" "all"
sport
string

Sport slug.

country_id
string <uuid>
sport_id
string <uuid>
search
string
limit
integer
Default: 1000
offset
integer
Default: 0
paginated
string
Enum: "1" "true"

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string",
  • "total": 0
}

Create a team

Create a team. Requires a valid key.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
name
required
string
abbreviation
string

Max 5 characters.

logo_url
string

Stored as the manual upload (manual_logo_url); the effective logo_url is materialized server-side.

logo_on_light_url
string

Logo version for light/white surfaces.

logo_on_dark_url
string

Logo version for dark surfaces.

primary_color
string
secondary_color
string
club_id
string <uuid>
league_id
string <uuid>
set_id
string <uuid>
external_id
string

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "abbreviation": "string",
  • "logo_url": "string",
  • "logo_on_light_url": "string",
  • "logo_on_dark_url": "string",
  • "primary_color": "string",
  • "secondary_color": "string",
  • "club_id": "37075f18-9ac9-4298-acac-03d82cbc40e2",
  • "league_id": "2a3fad45-7758-4caa-9967-1aff5d77e41a",
  • "set_id": "516c4b88-fac0-4d1c-bb7a-9a8534cc5e71",
  • "external_id": "string"
}

Response samples

Content type
application/json
{
  • "object": "team",
  • "data": {
    }
}

Search teams

Search teams by name or abbreviation. A query that matches no team but matches a league name or abbreviation returns every team of that league (skipped when scoped by league_id). Requires a valid key.

Authorizations:
ApiKeyAuth
query Parameters
q
required
string >= 2 characters
limit
integer <= 100
Default: 20
league_id
string <uuid>

Scope the search to one league (picker cascade).

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string"
}

Get a team

Fetch a single team. Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "team",
  • "data": {
    }
}

Update a team

Update a team. Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
Request Body schema: application/json
required
name
string
abbreviation
string
logo_url
string

Treated as manual_logo_url (own upload) — the stored logo_url is materialized server-side from the sources and the pin.

manual_logo_url
string or null

Own uploaded logo. Send null to remove the upload.

logo_source
string or null
Enum: "manual" "sportradar" "shv"

Pin the effective logo source. Null returns to automatic (upload wins, otherwise Sportradar, then SHV).

logo_on_light_url
string or null

Logo version for light/white surfaces. Send null to clear it.

logo_on_dark_url
string or null

Logo version for dark surfaces. Send null to clear it.

primary_color
string
secondary_color
string
club_id
string <uuid>
league_id
string <uuid>
set_id
string <uuid>
object
active
boolean

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "abbreviation": "string",
  • "logo_url": "string",
  • "manual_logo_url": "string",
  • "logo_source": "manual",
  • "logo_on_light_url": "string",
  • "logo_on_dark_url": "string",
  • "primary_color": "string",
  • "secondary_color": "string",
  • "club_id": "37075f18-9ac9-4298-acac-03d82cbc40e2",
  • "league_id": "2a3fad45-7758-4caa-9967-1aff5d77e41a",
  • "set_id": "516c4b88-fac0-4d1c-bb7a-9a8534cc5e71",
  • "metadata": { },
  • "active": true
}

Response samples

Content type
application/json
{
  • "object": "team",
  • "data": {
    }
}

Delete a team

Soft-delete a team (sets active=false). Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "item",
  • "data": {
    }
}

Get a team's live roster and stats

Roster plus player/goalie season stats from Hockeydata (German/Austrian ice hockey). Hockeydata is asked on every call and each answer is stored; if it fails or returns nothing, the last stored roster is returned. Only works for teams whose league is mapped to Hockeydata; other teams return source: null with empty arrays. During pre-season the most recent season with a filled roster is returned (see season_name). Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "roster",
  • "data": {
    }
}

List players

List players. Requires a valid key.

Authorizations:
ApiKeyAuth
query Parameters
team_id
string <uuid>
league_id
string <uuid>
active
string
Default: "true"
Enum: "true" "false" "all"
limit
integer
Default: 1000
offset
integer
Default: 0

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string"
}

Create a player

Create a player. Requires a valid key.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
first_name
required
string
last_name
required
string
team_id
required
string <uuid>
jersey_number
integer
position
string
image_url
string
external_player_id
string

Responses

Request samples

Content type
application/json
{
  • "first_name": "string",
  • "last_name": "string",
  • "team_id": "810007d0-bec5-486c-b5d1-28fcd8a079ba",
  • "jersey_number": 0,
  • "position": "string",
  • "image_url": "string",
  • "external_player_id": "string"
}

Response samples

Content type
application/json
{
  • "object": "player",
  • "data": {
    }
}

Search players

Search players by name, jersey number or team. Requires a valid key.

Authorizations:
ApiKeyAuth
query Parameters
q
required
string >= 2 characters
team_id
string <uuid>

Scope the search to a single team's roster.

limit
integer <= 100
Default: 20

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string"
}

Get a player

Fetch a single player. Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "player",
  • "data": {
    }
}

Update a player

Update a player. Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
Request Body schema: application/json
required
first_name
string
last_name
string
jersey_number
integer
position
string
image_url
string
team_id
string <uuid>
external_player_id
string
external_team_id
string
object
active
boolean

Responses

Request samples

Content type
application/json
{
  • "first_name": "string",
  • "last_name": "string",
  • "jersey_number": 0,
  • "position": "string",
  • "image_url": "string",
  • "team_id": "810007d0-bec5-486c-b5d1-28fcd8a079ba",
  • "external_player_id": "string",
  • "external_team_id": "string",
  • "metadata": { },
  • "active": true
}

Response samples

Content type
application/json
{
  • "object": "player",
  • "data": {
    }
}

Delete a player

Soft-delete a player. Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "item",
  • "data": {
    }
}

List games

Read-only schedule access. Requires a valid key.

Authorizations:
ApiKeyAuth
query Parameters
upcoming
string
Default: "true"
Enum: "true" "false" "all"

all drops the time filter (both played and upcoming) - needed to list a whole matchday.

league_id
string <uuid>
season_id
string
round_nr
string
team_id
string <uuid>
limit
integer <= 50
Default: 10

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string"
}

Search games

Search games by competition, league or team. When q names a team or a league, the search also covers that team's/league's whole season; otherwise it is forward-looking, returning the nearest fixtures. Requires a valid key.

Authorizations:
ApiKeyAuth
query Parameters
q
required
string >= 2 characters
league_id
string <uuid>

Explicitly scope the search to one league (resolves the league's teams and searches its whole season), skipping the q-based scope resolution.

limit
integer <= 200
Default: 200

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string"
}

List matchdays

Distinct rounds (matchdays) of ONE season with kick-off windows. Requires a valid key. Pass group to scope the counts to one league sub-group. Without season_id the newest season that has rounds is used.

Authorizations:
ApiKeyAuth
query Parameters
league_id
string <uuid>
season_id
string

Season to list, from /games/seasons. Omit for the newest season with rounds.

group
string

League sub-group label (teams.group_label), e.g. 1, 2 or 3.

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string"
}

List seasons

Seasons a league has games for, newest first. season_id is provider-specific (Sportradar stores the start year of 2026/27, the SFV the end year), so each entry carries a label derived from its kick-off range plus the providers it came from. Requires a valid key.

Authorizations:
ApiKeyAuth
query Parameters
league_id
string <uuid>
group
string

League sub-group label (teams.group_label), e.g. 1, 2 or 3.

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string"
}

List a league's sub-groups

Distinct sub-group labels (teams.group_label) present in the league (e.g. "1", "2", "3" for 1. Liga Classic). Empty when the league has no groups. Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "list",
  • "data": [
    ],
  • "has_more": true,
  • "next_cursor": "string"
}

Get the live league table

Current league table from the league's data source (SHV group feed, SFV ranking, or Hockeydata for German/Austrian ice hockey, resolved from the league row). The source is asked on every call and each answer is stored; if the source fails or returns nothing, the last stored table is returned. Ice hockey rows additionally carry OT wins/losses and points per game. During pre-season the most recent completed season's table is returned (see season_name). Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string
query Parameters
group
string

Sub-group filter — SFV group id, or a Hockeydata division name substring (e.g. "Ost").

limit
integer [ 1 .. 50 ]
Default: 50

Max table rows.

Responses

Response samples

Content type
application/json
{
  • "object": "standings",
  • "data": {
    }
}

Get a game

Fetch a single game. Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "game",
  • "data": {
    }
}

Import entities from CSV

Start an async CSV import of teams or players. Requires a valid key.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
csv_content
required
string
required
object

Maps system field names to CSV column headers.

entity_type
string
Default: "teams"
Enum: "teams" "players"
object

Responses

Request samples

Content type
application/json
{
  • "csv_content": "string",
  • "mapping": {
    },
  • "entity_type": "teams",
  • "options": {
    }
}

Response samples

Content type
application/json
{
  • "object": "import_job",
  • "data": {
    }
}

Import a league roster (structured)

Create a league and its teams from structured rows (the hybrid League Import UI), rather than raw CSV. Provide either an existing league.id (add to it) or a league.name to get-or-create. Each team carries the logo_url of an already uploaded logo. Runs async on the same job store as the CSV import; poll GET /api/v1/entities/import/status/{jobId}. Requires a valid key.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
required
object

Existing league by id, or a new one by name.

required
Array of objects <= 1000 items
object

Responses

Request samples

Content type
application/json
{
  • "league": {
    },
  • "teams": [
    ],
  • "options": {
    }
}

Response samples

Content type
application/json
{
  • "object": "import_job",
  • "data": {
    }
}

Get import job status

Poll an import job's status. Requires a valid key.

Authorizations:
ApiKeyAuth
path Parameters
jobId
required
string

Responses

Response samples

Content type
application/json
{
  • "object": "import_job",
  • "data": {
    }
}

Webhooks

HMAC-signed inbound webhook ingestion that triggers automations.

Ingest a signed webhook

Production webhook ingestion: pushes a payload into a data source and triggers the automations bound to it. The data source, its slug and its signing secret are set up in the app under Config -> Data Sources. This endpoint is NOT authenticated with x-api-key; instead the raw body is signed with the source's HMAC-SHA256 secret. Send the hex signature in one of X-Signature, X-Webhook-Signature or X-Hub-Signature-256. Body cap is 1 MB.

Authorizations:
WebhookSignature
path Parameters
slug
required
string
header Parameters
X-Signature
required
string

HMAC-SHA256 of the raw request body. X-Webhook-Signature or X-Hub-Signature-256 are also accepted.

Request Body schema: application/json
required
property name*
additional property
any

Responses

Request samples

Content type
application/json
{ }

Response samples

Content type
application/json
{
  • "object": "webhook_replay_ignored",
  • "data": {
    }
}