Reject a submission

POST
/submissions/{submissionId}/reject

Rejects a submission that is awaiting_review, so the expert is not paid for that work and the submission becomes rejected. rejection_category and rejection_reason are optional, but they are the only record of why the work went unpaid. A submission in any other status returns 409.

Authorization<token>

API key as Bearer token: Authorization: Bearer

In: header

Path Parameters

submissionId*string

ID of the submission to reject

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://terac.com/api/external/v2/submissions/string/reject" \  -H "Content-Type: application/json" \  -d '{    "rejection_category": "failed_instructions",    "rejection_reason": "Answered four of the eight questions; the brief asked for all eight."  }'
{
  "id": "q3w8e1r6t4y9u2i7o5p0a3sd",
  "status": "rejected",
  "dashboard_url": "https://terac.com/acme-research/customer-research-mg4q7x2a/opportunities/h7k2p9w4c1v6n3x8b5m0q2rt/submissions"
}
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}

{
  "error": {
    "code": "UNAUTHORIZED",
    "message": "API key required. Include Authorization: Bearer <key> header."
  }
}

{
  "error": {
    "code": "FORBIDDEN",
    "message": "This account is not permitted to use the API."
  }
}

{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
{
  "error": {
    "code": "RATE_LIMITED",
    "message": "Rate limit exceeded. Retry after 61 seconds."
  }
}
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}

Approve a submission POST

Approves a submission that is `awaiting_review`, accepting the reviewed work. The expert is paid when the submission lands in `approved`, once all of its work is accepted. It stays `in_progress` while tasks remain, and on an hourly or per-task opportunity, where approval puts the expert on the project and they are paid through payout runs instead. The response carries the status it lands in. A submission in any other status returns 409.

Create a test submission in a sandbox POST

Creates a test submission in a sandbox organization, so your webhook endpoint receives the events a real participant would trigger. Terac adds a test participant and moves it through the opportunity a few seconds at a time: it answers the screener, starts the task and finishes it. Each step sends the same `submission.status.change` webhook a real participant's step sends, signed and retried the same way. Nobody is contacted and nobody is paid. Only a subscription created with a key from the same sandbox organization receives these webhooks. The participant stops wherever the next move is yours: inviting or declining an applicant, approving or rejecting the work, or your own completion redirect when `task_completion` is `redirect`. Your call sends the next webhook. After you invite an applicant, the participant carries on with the task. The test submission shows in the sandbox dashboard under the name "Test Participant" and counts in the opportunity's numbers. It does not count toward a quota, and it cannot be removed. Returns 403 outside a sandbox organization, and 409 when the opportunity is not active. Returns 422 when Terac cannot create the test submission you asked for on this opportunity, and the `message` says why: for example `failed` with no screener, `passed` with screening questions that no answer passes, or `redirect` when the first task has no `task_url`.