Recoup

Get started with Recoup.

API REFERENCE

Get tasks

On this page
GET/api/tasks

Retrieve scheduled tasks. Each task includes recent_runs (last 5 runs), upcoming (next scheduled run times) sourced directly from the Trigger.dev API, and owner_email when an account email exists for the task owner. Supports filtering by id, account_id, or artist_account_id.

Fetching one task by id performs the owner-plan preflight used by the runner and can return 402 plan_limit. Listing tasks remains distinct from permission to execute them.

Authentication

x-api-key in header

bearerAuth bearer

Request

cURL
curl --request GET \
  --url 'https://api.recoupable.dev/api/tasks' \
  --header 'x-api-key: YOUR_API_KEY'

Replace the YOUR_ placeholders with your values. Required query parameters are included; optional parameters are listed below.

Try it

Fill in the fields, send the request from your browser, and read the live response. The curl below updates as you type.

Kept in this browser tab only and cleared when it closes.

cURL for this request
curl --request GET \
  --url 'https://api.recoupable.dev/api/tasks'

Parameters

Query parameters

idstring

Filter by task ID (UUID). Returns a single task matching the provided ID. Admin callers may retrieve any task by ID regardless of owner; non-admin callers only receive the task if it belongs to their authenticated account.

account_idstring

Filter tasks to only include those for the specified account.

artist_account_idstring

Filter tasks to only include those for the specified artist account.

Responses

200Tasks retrieved successfully

application/json

statusstring · enumrequired

Status of the request

Values: "success", "error"

tasksarray<Task>required

Array of task objects

Item properties for tasks
idstring

Unique identifier for the task

format: uuid

titlestring

Descriptive title or name of the task

promptstring

Detailed instruction or prompt for task execution

schedulestring

Cron expression defining when the task should execute (e.g., '0 10 * * *')

timezonestringnullable

IANA time zone the task's cron is interpreted in, read from the Trigger.dev schedule (the source of truth). Null when the task has no schedule or the timezone can't be read.

Example: "America/New_York"

account_idstring

Unique identifier for the associated account

format: uuid

artist_account_idstring

Unique identifier for the associated artist account

format: uuid

enabledbooleannullable

Whether the task is enabled. Defaults to true.

trigger_schedule_idstringnullable

Identifier for the trigger schedule associated with this task

recent_runsarray<TaskRunResponse>

Last 5 runs for this task, sourced from the Trigger.dev API.

Item properties for recent_runs
idstringrequired

The unique run identifier, prefixed with run_

statusstring · enumrequired

Current run status

Values: "PENDING_VERSION", "DELAYED", "QUEUED", "EXECUTING", "REATTEMPTING", "FROZEN", "COMPLETED", "CANCELED", "FAILED", "CRASHED", "INTERRUPTED", "SYSTEM_FAILURE"

taskIdentifierstringrequired

The task type identifier (e.g. 'setup-sandbox', 'run-sandbox-command')

idempotencyKeystringnullable

Idempotency key used to deduplicate trigger requests

versionstring

The worker version that executed the run

isTestboolean

Whether this is a test run

createdAtstringrequired

When the run was created (ISO 8601)

format: date-time

updatedAtstringrequired

When the run was last updated (ISO 8601)

format: date-time

startedAtstringnullable

When execution started (null if not yet started)

format: date-time

finishedAtstringnullable

When the run finished (null if still running)

format: date-time

delayedUntilstringnullable

If delayed, when the run becomes eligible to execute

format: date-time

ttlanynullable

Time-to-live. If the run is not started within this duration, it expires.

expiredAtstringnullable

When the run expired (null if not expired)

format: date-time

tagsarray<string>

Tags associated with this run (max 10)

Item properties for tags

string

metadataobjectnullable

JSON metadata attached to the run

costInCentsnumber

Compute cost of the run in cents

baseCostInCentsnumber

Base invocation cost in cents

durationMsnumber

Compute duration in milliseconds

envobject

Environment the run executed in

Properties for env
idstring
namestring
userstringnullable
depthinteger

Nesting depth for child runs

batchIdstringnullable

Batch ID if triggered as part of a batch

triggerFunctionstring · enum

The function used to trigger this run

Values: "trigger", "triggerAndWait", "batchTrigger", "batchTriggerAndWait"

payloadanynullable

Input payload for the task. Only present when retrieving by runId.

outputone ofnullable

Task output data. Only present when retrieving by runId, and only populated when status is COMPLETED. Shape varies by taskIdentifier. The create-content task returns the schema below; other tasks return their own.

Properties for output
oneOf · CreateContentRunOutput 1

Output payload for a create-content task run. Returned in output when status is COMPLETED. Agents should poll /api/tasks/runs?runId=… and read these fields once the run is done.

videoSourceUrlstringrequired

URL to the rendered final 9:16 video (image + motion + audio + caption already composed).

format: uri

imageUrlstringrequired

URL to the base image used for video generation.

format: uri

captionTextstringrequired

The caption text burned into the video.

templatestringrequired

Template id used for this run (e.g. album-record-store, artist-caption-bedroom).

Example: "artist-caption-bedroom"

lipsyncboolean

Whether lipsync was applied (audio-driven mouth animation).

audioobject

Metadata about the song clip used in the final composition.

Properties for audio
songTitlestring
songFilenamestring
startSecondsnumber

Offset into the source song where the clip starts.

durationSecondsnumber

Length of the audio clip in seconds.

clipLyricsstringnullable

Lyrics for the chosen clip, when available.

clipMoodstringnullable

Inferred mood for the chosen clip, when available.

oneOf · object 2

Generic task output (for tasks not yet schema'd)

object

errorobjectnullable

Error details if the run failed. Only present when retrieving by runId.

Properties for error
messagestring

Human-readable error message

namestring

Error name or type

stackTracestring

Stack trace

attemptsarray<object>

Attempt history. Only present when retrieving by runId.

Item properties for attempts
idstring

Attempt ID, prefixed with attempt_

statusstring · enum

Values: "PENDING", "EXECUTING", "PAUSED", "COMPLETED", "FAILED", "CANCELED"

createdAtstring

format: date-time

updatedAtstring

format: date-time

startedAtstringnullable

format: date-time

completedAtstringnullable

format: date-time

errorobjectnullable
Properties for error
messagestring
namestring
stackTracestring
scheduleobjectnullable

Schedule information if triggered by a schedule. Only present when retrieving by runId.

upcomingarray<string>

Next scheduled run times.

Item properties for upcoming

string

owner_emailstringnullable

Primary email address for the task owner account when one exists.

artist_namestringnullable

Display name of the artist account the task runs for (artist_account_id), so a task list can label rows without a roster lookup. Null when the artist account no longer exists.

Example: "Braden Bales"

modelstringnullable

AI model identifier used when the task runs. When present as a string, must be non-empty; otherwise null if unset.

minLength: 1

errorstring

Error message (only present if status is error)

400Bad request

application/json

errorintegerrequired

format: int32

messagestringrequired
401Unauthorized — send exactly one of x-api-key or Authorization: Bearer …. Missing or conflicting headers return a text error; malformed or rejected credentials return a text message. Both envelopes include status: error; read whichever text field is present.

application/json

anyOf · object 1
statusstring · enumrequired

Always error.

Values: "error"

errorstringrequired

Human-readable error message or documented error code.

Additional properties

any

anyOf · object 2
statusstring · enumrequired

Always error.

Values: "error"

messagestringrequired

Human-readable authentication error message.

Additional properties

any

Missing credentials or both credential headers supplied

missingOrConflictingCredentials
{
  "status": "error",
  "error": "Exactly one of x-api-key or Authorization must be provided"
}

Rejected API key, whether sent in x-api-key or as a Bearer key

invalidCredential
{
  "status": "error",
  "message": "Unauthorized"
}

402A single task fetched by id is blocked by its owner plan. Returns plan_limit with task_count or min_cadence and billingUrl. Ordinary listing does not apply this pre-run gate.

application/json

statusstring · enumrequired

Always error for this response shape

Values: "error"

errorstring · enumrequired

Machine-readable code. Literally plan_limit.

Values: "plan_limit"

limitstring · enumrequired

Which entitlement blocked the request: task_count (the plan's enabled-task cap is reached) or min_cadence (the cron fires more often than the plan allows).

Values: "task_count", "min_cadence"

messagestringrequired

Human-readable explanation naming the plan and the limit, suitable to show to a user.

Example: "Free includes 1 task. Starter includes 3, Pro is unlimited."

planstring · enumrequired

The account's current plan, resolved from its subscription.

Values: "free", "starter", "pro"

task_limitintegerrequirednullable

Maximum enabled tasks on the current plan. Null means uncapped.

Example: 1

minimum: 1

min_cadence_minutesintegerrequired

Shortest allowed gap between two consecutive runs of a task on the current plan, in minutes (Free 10080, Starter 1440, Pro 60).

Example: 10080

minimum: 1

current_task_countintegerrequired

Enabled tasks the account has right now, excluding the one being created or updated.

Example: 1

minimum: 0

billingUrlstringrequired

Static link to /plan in the Recoup app, where a human can upgrade. Constant; retrying creates nothing.

Example: "https://app.recoupable.dev/plan"

format: uri

403Forbidden — the requested account_id is outside the authenticated account's authorized access. Read the text error.

application/json

statusstring · enumrequired

Always error.

Values: "error"

errorstringrequired

Human-readable error message or documented error code.

Additional properties

any

accountOverrideDenied
{
  "status": "error",
  "error": "Access denied to specified account_id"
}

500Internal server error while retrieving tasks. Read the text error; the message can vary. The examples illustrate the response shape.

application/json

statusstring · enumrequired

Always error.

Values: "error"

errorstringrequired

Human-readable error message or documented error code.

Additional properties

any

serviceError
{
  "status": "error",
  "error": "Task service unavailable"
}

unexpectedFailure
{
  "status": "error",
  "error": "Internal server error"
}

Full specification

Download the OpenAPI file for complete schemas, constraints, and examples.

Download releases.json
View operation source
json
{
  "operationId": "getTasks",
  "description": "Retrieve scheduled tasks. Each task includes `recent_runs` (last 5 runs), `upcoming` (next scheduled run times) sourced directly from the Trigger.dev API, and `owner_email` when an account email exists for the task owner. Supports filtering by id, account_id, or artist_account_id.\n\nFetching one task by id performs the owner-plan preflight used by the runner and can return 402 plan_limit. Listing tasks remains distinct from permission to execute them.",
  "security": [
    {
      "apiKeyAuth": []
    },
    {
      "bearerAuth": []
    }
  ],
  "parameters": [
    {
      "name": "id",
      "in": "query",
      "description": "Filter by task ID (UUID). Returns a single task matching the provided ID. Admin callers may retrieve any task by ID regardless of owner; non-admin callers only receive the task if it belongs to their authenticated account.",
      "required": false,
      "schema": {
        "type": "string",
        "format": "uuid"
      }
    },
    {
      "name": "account_id",
      "in": "query",
      "description": "Filter tasks to only include those for the specified account.",
      "required": false,
      "schema": {
        "type": "string",
        "format": "uuid"
      }
    },
    {
      "name": "artist_account_id",
      "in": "query",
      "description": "Filter tasks to only include those for the specified artist account.",
      "required": false,
      "schema": {
        "type": "string",
        "format": "uuid"
      }
    }
  ],
  "responses": {
    "200": {
      "description": "Tasks retrieved successfully",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/TasksResponse"
          }
        }
      }
    },
    "400": {
      "description": "Bad request",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    },
    "401": {
      "description": "Unauthorized — send exactly one of `x-api-key` or `Authorization: Bearer …`. Missing or conflicting headers return a text `error`; malformed or rejected credentials return a text `message`. Both envelopes include `status: error`; read whichever text field is present.",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/TaskAuthenticationErrorResponse"
          },
          "examples": {
            "missingOrConflictingCredentials": {
              "summary": "Missing credentials or both credential headers supplied",
              "value": {
                "status": "error",
                "error": "Exactly one of x-api-key or Authorization must be provided"
              }
            },
            "invalidCredential": {
              "summary": "Rejected API key, whether sent in x-api-key or as a Bearer key",
              "value": {
                "status": "error",
                "message": "Unauthorized"
              }
            }
          }
        }
      }
    },
    "402": {
      "description": "A single task fetched by id is blocked by its owner plan. Returns plan_limit with task_count or min_cadence and billingUrl. Ordinary listing does not apply this pre-run gate.",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PlanLimitError"
          }
        }
      }
    },
    "403": {
      "description": "Forbidden — the requested `account_id` is outside the authenticated account's authorized access. Read the text `error`.",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/TaskFailureErrorResponse"
          },
          "examples": {
            "accountOverrideDenied": {
              "value": {
                "status": "error",
                "error": "Access denied to specified account_id"
              }
            }
          }
        }
      }
    },
    "500": {
      "description": "Internal server error while retrieving tasks. Read the text `error`; the message can vary. The examples illustrate the response shape.",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/TaskFailureErrorResponse"
          },
          "examples": {
            "serviceError": {
              "value": {
                "status": "error",
                "error": "Task service unavailable"
              }
            },
            "unexpectedFailure": {
              "value": {
                "status": "error",
                "error": "Internal server error"
              }
            }
          }
        }
      }
    }
  }
}