List submissions for an opportunity
Lists an opportunity's submissions, newest first, each with its status and screening answers. Filter to one status; the awaiting_review ones wait on you to approve or reject them. Applicants still in the screener, or waiting on your invite decision, are not listed; the latter are in GET /opportunities/{opportunityId}/applicants. Returns up to limit per page; while pagination.has_more is true, pass pagination.next_cursor back as cursor for the next page. For totals, read submission_stats on the opportunity rather than counting pages.
Authorization
apiKey API key as Bearer token: Authorization: Bearer
In: header
Path Parameters
ID of the opportunity, as returned by POST /opportunities or GET /opportunities.
Query Parameters
Most items to return in one page, from 1 to 100. Defaults to 25.
251 <= value <= 100pagination.next_cursor from the previous page, to fetch the page after it. Omit it for the first page.
"screened_out" never reached the work, "rejected" did the work and was not accepted, "abandoned" stopped part-way.
"screen_passed" | "screened_out" | "in_progress" | "awaiting_review" | "approved" | "rejected" | "abandoned"Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://terac.com/api/external/v2/opportunities/string/submissions"{
"data": [
{
"id": "q3w8e1r6t4y9u2i7o5p0a3sd",
"opportunity_id": "h7k2p9w4c1v6n3x8b5m0q2rt",
"status": "awaiting_review",
"participant_id": "6f1c2a9e-3b7d-4e58-9a21-c4d8e7f0b3a6",
"participant_name": "Maya Chen",
"participant_linkedin_url": "https://www.linkedin.com/in/maya-chen",
"participant_background": {
"experiences": [
{
"company": "Northwind Logistics",
"role": "Head of Procurement",
"started_at": "2021-03",
"ended_at": null,
"description": "Led the evaluation and rollout of a new supplier platform."
}
],
"educations": [
{
"school": "University of Michigan",
"degree": "MBA",
"major": "Operations"
}
]
},
"created_at": "2026-09-29T11:42:57.020Z",
"updated_at": "2026-09-29T13:18:04.655Z",
"screening_outcome": "passed",
"screening_answers": [
{
"key": "chose_tool",
"question": "Were you involved in choosing your company's current spend management software?",
"answer": [
"Yes, I led or approved the decision"
],
"outcome": "qualify"
}
]
},
{
"id": "z6x1c8v3b7n2m9k4j0h5g2fd",
"opportunity_id": "h7k2p9w4c1v6n3x8b5m0q2rt",
"status": "in_progress",
"participant_id": "0d9e4b2c-7a1f-4c63-8e5b-2f7a9c1d6e84",
"participant_name": "Daniel Okafor",
"participant_linkedin_url": null,
"participant_background": null,
"created_at": "2026-09-29T11:15:33.748Z",
"updated_at": "2026-09-29T11:21:09.302Z",
"screening_outcome": "passed",
"screening_answers": [
{
"key": "chose_tool",
"question": "Were you involved in choosing your company's current spend management software?",
"answer": [
"Yes, I gave input"
],
"outcome": "qualify"
}
]
}
],
"pagination": {
"next_cursor": null,
"has_more": false
},
"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": []
}Stop opportunity POST
Permanently ends an opportunity and refunds its unused budget to your organization's balance. Pending invitations are withdrawn and recruitment cannot be restarted, so pause instead if you may want to continue. Submissions still awaiting your review block the stop: approve or reject them first. On an hourly or per-task opportunity, the stop itself approves every expert already paid on it whose submission is still open. Only an `active`, `paused` or `pre_recruiting` opportunity can be stopped; any other status returns 409. Delete a draft instead.
List applicants awaiting your invite decision GET
Applicants who passed screening and are waiting on your decision to invite them. They are deliberately absent from `GET /opportunities/{opportunityId}/submissions`: an applicant here has not been invited yet, so they hold no submission status, and `GET /submissions/{id}` returns 404 for them. This collection is where they exist until you decide. Act on one with `POST /submissions/{submissionId}/invite` or `/decline`. Inviting makes them `screen_passed` and starts their tasks; declining makes them `screened_out`. Either way they leave this collection and appear in the submissions listing from then on. An opportunity on `manual_review` routes every qualified applicant here. One on `auto_invite` still routes an individual applicant here when a screening answer you marked `review` flags them, so poll this even when you did not opt into reviewing everyone.