Skip to content

Submit a compliance task

The tasks.submit operation: POST /api/v1/tasks/{id}/submit in the REST API and the tasks_submit tool in the MCP server.

POST/api/v1/tasks/{id}/submit

Submits the outcome of a task whose completion changes a registration or a filing period, with the evidence: the task is done and, in the same transaction, the linked state changes:

TaskreferenceChanges
filing.submitthe return's reference (required)the period becomes submitted
filing.paythe payment reference (required); paidOn (default today)the period becomes paid; the ledger moves the tax payable to the bank
registration.submitthe application or receipt numberin grace, the application is marked submitted (the deadline is met); then registration.confirm is raised
registration.confirmthe registration number (required); effectiveFrom (required)the registration becomes registered
deregistration.submitthe authority's referencethe registration becomes deregistered

Evidence: receipt files uploaded to the task (tasks.documents.upload, then outputs.files), more outputs.references, outputs.submittedAt (default now) and outputs.notes. They are attached to the filing period's receipts or the registration's evidence. Registration tasks need a receipt file or a reference as proof. *.submit tasks reference the authorization the work was done under (authorizationId): valid now, for this entity, mode and the task's regime. Ownrecord records it; it doesn't grant it.

Compliance tier (spec §41.4): under your approval policy the call may answer approval_required (HTTP 202): nothing changes yet, the task waits (awaiting_approval), and once a person approves it runs exactly as sent. Dry-run it first. The caller must also be allowed to change the linked registration (registrations:write) or filing period (filings:write). People need a sign-in within the last 15 minutes. While someone else holds the task's lease, only they can submit it.

At a glance

  • REST: POST /api/v1/tasks/{id}/submit
  • MCP tool: tasks_submit
  • Operation ID: tasks.submit
  • Scope: Organization, or one of its legal entities or brands
  • Permission: tasks:write
  • Risk tier: compliance
  • Dry run: Supported (send Ownrecord-Dry-Run: true)
  • Idempotency: Idempotency-Key required
  • Modes: Test and live
  • Authentication: API key with the tasks:write scope
  • Fresh sign-in: In the console, a sign-in within the last 15 minutes
  • Since: M10

Request

Path parameters

FieldTypeDescription
idtask_… ID

Body

A JSON object (Content-Type: application/json):

FieldTypeRequiredDescription
referencestringNoThe authority's reference for this task (see the table).
effectiveFromstringNoregistration.confirm: the first day the registration is effective.
paidOnstringNofiling.pay: the day the tax was paid, in the period's time zone.
authorizationIdatz_… IDNoThe authorization the work was done under (required for *.submit tasks).
outputsobjectNo
outputs.referencesobjectNo
outputs.submittedAtdate-timeNo
outputs.filesarray of file_… IDNo
outputs.notesstringNo
expectedVersioninteger (at least 1)No

Response

200 OK with a JSON object:

FieldTypeDescription
idtask_… ID
object"task"
typeone of 12 values, e.g. registration.prerequisites, registration.prepare, registration.submit (all in the OpenAPI document)
entityIdent_… ID
livemodeboolean
regimeIdstring or null
registrationIdregn_… ID or null
filingPeriodIdfp_… ID or null
prerequisiteCodestring or null
titlestring
descriptionstring or null
priorityone of low, normal, high, urgent
statusone of open, claimed, in_progress, awaiting_approval, done, failed, cancelled
reasonone of 11 values, e.g. auto_blocked, existing_customer_sale, prerequisite_open (all in the OpenAPI document) or null
dueAtdate-time or null
overdueboolean
assigneeobject or null
claimedUntildate-time or null
leaseActiveboolean
completeWithone of tasks.complete, tasks.submit
needsAuthorizationboolean
inputsarray of object
inputs[].kindstring
inputs[].fileIdfile_… ID or null
inputs[].dataobject or null
outputsobject or null
authorizationIdatz_… ID or null
approvalRequestIdapr_… ID or null
failureobject or null
checklistarray of object
checklist[].textstring
checklist[].doneboolean
createdAtdate-time
updatedAtdate-time
completedAtdate-time or null
completedBystring or null
versioninteger (at least 1)

Examples

The Q3 OSS return was filed

An agent's call answers approval_required under the default policy; this is the approved run's result.

HTTP
POST /api/v1/tasks/task_01m4ttwd3veh9apbewxheq5xa9/submit
Authorization: Bearer or_test_…
Idempotency-Key: 3f1c9a52-7d0e-4b8f-9a61-0c2d5e8b7f14
Content-Type: application/json

{
  "reference": "HR/HR12345678901/Q3.2026",
  "authorizationId": "atz_01m4ttwd3veh9apbewxheq5xa3",
  "outputs": {
    "files": [
      "file_01m4ttwd3veh9apbewxheq5xah"
    ],
    "submittedAt": "2026-10-15T09:10:00.000Z"
  }
}

Response (200):

JSON
{
  "id": "task_01m4ttwd3veh9apbewxheq5xa9",
  "object": "task",
  "type": "filing.submit",
  "entityId": "ent_01m4ttwd3veh9apbewxheq5xh4",
  "livemode": true,
  "regimeId": "EU_OSS_UNION",
  "registrationId": "regn_01m4ttwd3veh9apbewxheq5xa8",
  "filingPeriodId": "fp_01m4ttwd3veh9apbewxheq5xa7",
  "prerequisiteCode": null,
  "title": "File the One-Stop Shop, Union scheme 2026-Q3 return",
  "description": "File the One-Stop Shop, Union scheme 2026-Q3 return with the authority using the filing package, by 2026-10-31. Then submit this task with the return's reference, the portal's confirmation and the authorization you acted under: the period becomes submitted.",
  "priority": "high",
  "status": "done",
  "reason": "period_ended",
  "dueAt": "2026-10-31T22:59:59.000Z",
  "overdue": false,
  "assignee": {
    "type": "agent",
    "id": "agt_01m4ttwd3veh9apbewxheq5xa6"
  },
  "claimedUntil": null,
  "leaseActive": false,
  "completeWith": "tasks.submit",
  "needsAuthorization": true,
  "inputs": [
    {
      "kind": "filing_period",
      "fileId": null,
      "data": {
        "filingPeriodId": "fp_01m4ttwd3veh9apbewxheq5xa7",
        "regimeId": "EU_OSS_UNION",
        "periodKey": "2026-Q3",
        "dueDate": "2026-10-31",
        "dueAt": "2026-10-31T22:59:59.000Z"
      }
    },
    {
      "kind": "filing_package",
      "fileId": null,
      "data": {
        "filingPeriodId": "fp_01m4ttwd3veh9apbewxheq5xa7"
      }
    },
    {
      "kind": "playbook",
      "fileId": null,
      "data": {
        "regimeId": "EU_OSS_UNION",
        "playbookKind": "filing"
      }
    }
  ],
  "outputs": {
    "references": {
      "return": "HR/HR12345678901/Q3.2026"
    },
    "submittedAt": "2026-10-15T09:10:00.000Z",
    "files": ["file_01m4ttwd3veh9apbewxheq5xah"],
    "notes": null
  },
  "authorizationId": "atz_01m4ttwd3veh9apbewxheq5xa3",
  "approvalRequestId": "apr_01m4ttwd3veh9apbewxheq5xa1",
  "failure": null,
  "checklist": [
    {
      "text": "Download the filing package",
      "done": false
    },
    {
      "text": "File the return in the authority's portal",
      "done": false
    },
    {
      "text": "Submit this task with the reference, the confirmation and the authorization",
      "done": false
    }
  ],
  "createdAt": "2026-10-01T00:23:00.000Z",
  "updatedAt": "2026-10-15T11:02:00.000Z",
  "completedAt": "2026-10-15T11:02:00.000Z",
  "completedBy": "agt_01m4ttwd3veh9apbewxheq5xa6",
  "version": 5
}

Errors

CodeHTTP statusWhenWhat to do
validation_failed400A field is malformed, a required reference or date is missing, or a date is in the future.Fix the fields listed in details.issues and send the request again.
resource_not_found404No task with this ID in this organization, entity and mode.Check the ID and that your credentials are scoped to the right organization, entity, brand and mode.
task_complete_required400The task doesn't change a registration or filing period: use tasks.complete.Call tasks.complete with the task's outputs.
task_status_invalid409The task is finished, or it waits for another approval.Reload the task: finished tasks (done, failed, cancelled) don't change, and a task waiting for an approval changes only through that approval. details.status is the task's status.
task_claimed409Someone else holds the task's lease.Work on another task (tasks.list with claimable: true), or try again after details.claimedUntil: an expired lease frees the task. details.assignee is who holds it.
task_authorization_required400A *.submit task without authorizationId.Record who may act for the entity under this regime (authorizations.create) and pass its ID as authorizationId. Ownrecord records the authorization; it doesn't grant it.
task_authorization_invalid400The authorization isn't valid now for this entity, mode and regime (details.problem).Use an authorization of this legal entity and mode that is valid now and covers the task's regime. details.problem is revoked, expired, not_yet_valid, regime_not_covered, other_entity or other_mode.
task_output_file_not_found400A receipt isn't a document of the task (upload it with tasks.documents.upload).Upload the receipt to the task first (tasks.documents.upload) and pass its file_… ID, or record the receipt number as a reference instead. details.fileId is the ID that wasn't found.
filing_period_status_invalid409The period isn't prepared (submit) or submitted (pay).Reload the period and check its status: details.allowed_from lists the statuses the action needs. Periods go open → locked → prepared → submitted → paid.
registration_transition_invalid409The registration can't make this change now (e.g. it isn't registered, for a deregistration).Check the registration's state (details.state): details.allowed_from lists the states the action needs. Reload the registration and try the action that fits its state.
registration_details_invalid400The registration number, effective date or proof is missing.Fill in the field named in param: the registration number, the date it is effective from, or at least one proof file.
approval_required202Your approval policy needs a person to approve the submission first (HTTP 202).Nothing ran yet. An approver reviews approval.summary and the dry-run result in the console (approval.approveUrl). Poll GET /approvals/{id} or watch for the approval.resolved event; sending the same request again with the same Idempotency-Key returns the same approval.
fresh_auth_required403Your last sign-in is older than 15 minutes.Sign in again, then repeat the action within 15 minutes.
version_conflict409The task changed since expectedVersion, or at the same moment.Fetch the object again and retry the change.
permission_denied403You can't work on tasks here, or can't change the linked registration or filing period.Ask an organization owner or admin for a role or scope that allows this action.

It can also return these common errors: api_version_unsupported, invalid_json, unsupported_media_type, authentication_required, api_key_invalid, idempotency_key_required, idempotency_key_reused, idempotency_in_progress, approval_rejected, approval_expired, stale_approval, approval_policy_denied, rate_limited, internal_error.