Launch opportunity
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.
Authorization
apiKey API key as Bearer token: Authorization: Bearer
In: header
Path Parameters
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://terac.com/api/external/v2/opportunities/string/launch"{
"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": []
}{
"code": "UNAUTHORIZED",
"message": "Authorization not provided",
"issues": []
}{
"code": "FORBIDDEN",
"message": "Insufficient access",
"issues": []
}{
"code": "INTERNAL_SERVER_ERROR",
"message": "Internal server error",
"issues": []
}Delete a draft opportunity DELETE
Deletes a draft opportunity, which was never charged, and drops it from `GET /opportunities`. A launched opportunity returns 409; end one with `POST /opportunities/{opportunityId}/stop` instead.
Pause opportunity POST
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.