Pause opportunity
Pauses an active opportunity, so it stops taking new applicants. Participants already working can still finish and submit, and nothing is charged or refunded. Resume it with POST /opportunities/{opportunityId}/resume. Only an active opportunity can be paused; any other status returns 409.
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.
Request Body
application/json
This operation takes no body fields, but the request must still carry Content-Type: application/json and a JSON body: send {}.
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/opportunities/string/pause" \ -H "Content-Type: application/json" \ -d '{}'{
"id": "string",
"title": "string",
"internal_title": "string",
"description": "string",
"status": "draft",
"num_participants": 0,
"estimated_duration_minutes": 0,
"filters": [
{
"property1": {
"property1": 0,
"property2": 0
},
"property2": {
"property1": 0,
"property2": 0
}
}
],
"screening_questions": [
{
"key": "string",
"text": "string",
"question_rich_text": "string",
"pick": "one",
"answers": [
{
"text": "string",
"qualify_logic": "may",
"allow_free_text": true
}
],
"grid": {
"pick": "one",
"rows": [
{
"key": "string",
"text": "string"
}
],
"columns": [
{
"value": "string",
"text": "string"
}
],
"cell_actions": [
{
"row": "string",
"column": "string",
"qualify_logic": "may"
}
]
},
"min_qualifying": 1,
"display_condition": {
"conditions": [
{
"screening_question": "string",
"answer": "string",
"operator": "eq"
}
],
"join": "and"
},
"conditional_rules": [
{
"conditions": [
{
"screening_question": "string",
"answer": "string",
"operator": "eq"
}
],
"join": "and",
"outcome": "reject"
}
],
"skip_rules": [
{
"conditions": [
{
"screening_question": "string",
"answer": "string",
"operator": "eq"
}
],
"join": "and",
"target_question": "string"
}
],
"allow_paste": true
}
],
"quotas": [
{
"screening_question": "string",
"targets": [
{
"value": "string",
"count": 1,
"type": "exact"
}
]
}
],
"cross_quotas": [
{
"label": "string",
"conditions": [
{
"screening_question": "string",
"answer": "string",
"operator": "eq"
}
],
"join": "and",
"target": 0,
"quota_type": "exact",
"dimension": "string"
}
],
"tasks": [
{
"sequence": 0,
"task_type": "string",
"review_type": "string",
"task_url": "string",
"participant_url_template": "string",
"title": "string",
"description": "string",
"duration_minutes": 0,
"available_after_sequence": 0,
"available_after_delay_minutes": 0,
"provider": "string",
"calendar_owner": "string",
"event_type_url": "string",
"instructions": "string",
"accepted_mime_types": [
"string"
],
"min_files": 0,
"max_files": 0,
"max_file_size_bytes": 0
}
],
"pricing": {
"cost_per_participant_cents": 0,
"total_cost_cents": 0,
"currency": "usd"
},
"funding": {
"affordable": true,
"draws_on_credit": true,
"balance_cents": 0,
"shortfall_cents": 0,
"finance_url": "string"
},
"device_types": [
"string"
],
"business_type": "string",
"candidate_profile": "string",
"required_accounts": [
"string"
],
"video_required": "string",
"screen_share_required": "string",
"customer_screening_review": "string",
"pay_frequency": "string",
"screening_option_randomization": "string",
"forwarding_email_enabled": "string",
"max_responses_per_expert": 0,
"feasibility_request_id": "string",
"project_id": "string",
"created_at": "string",
"updated_at": "string",
"ending_at": "string",
"launched_at": "string",
"links": {
"self": "string",
"launch": "string",
"submissions": "string",
"dashboard": {
"study": "string",
"draft_editor": "string",
"submissions": "string",
"recruitment": "string",
"task": "string",
"settings": "string"
}
},
"submission_stats": {
"total": 0,
"in_progress": 0,
"awaiting_review": 0,
"approved": 0,
"rejected": 0
},
"quota_progress": [
{
"screening_question": "string",
"targets": [
{
"value": "string",
"count": 0,
"current": 0,
"type": "string"
}
]
}
],
"cross_quota_progress": [
{
"label": "string",
"conditions": [
{
"screening_question": "string",
"answer": "string",
"operator": "eq"
}
],
"join": "and",
"target": 0,
"quota_type": "exact",
"dimension": "string",
"current": 0
}
],
"screening_stats": [
{
"screening_question": "string",
"graded": 0,
"rejected": 0,
"rejection_rate": 0,
"answers": [
{
"text": "string",
"selected": 0,
"share": 0
}
]
}
]
}{
"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": []
}Launch opportunity POST
Launches a draft opportunity: charges your organization's balance and starts recruiting. The charge is the participant incentive for every one of `num_participants` plus the platform fee, as `pricing` on the draft shows, and `funding` says beforehand whether the balance covers it. The response is the opportunity, already `active`, so there is nothing to poll for. Only a `draft` can be launched; any other status returns 409. A draft that cannot run is refused with 412 before anything is charged, and the message says what to fix: the balance does not cover the charge, the screener is missing or nobody can pass it, the participant budget is under the $5 minimum, or the feasibility request it was priced from is not answered yet. Unused budget is refunded when the opportunity is stopped or completes. A screener is recommended. A draft without `screening_questions` launches only when Terac has enabled that for your organization and you send `without_screener: true`. Unless Terac runs its AI screening interview on it, everyone who matches its filters then goes straight to the task, so the tasks that deliver the work have to be `review_type: manual_review` and `customer_screening_review` has to be `auto_invite`: nobody is paid until you approve their submission with `POST /submissions/{submissionId}/approve`.
Resume opportunity POST
Resumes a paused opportunity, so it takes new applicants again. Nothing is charged: the budget taken at launch still covers it. Only a `paused` opportunity can be resumed; any other status returns 409.