Get a feasibility request
Retrieve one of your feasibility requests by id. Use this to poll for the CPI after submitting.
Status decides whether there is a price to read:
- RECEIVED: not priced yet, costPerParticipant is null.
- RESPONDED: priced. costPerParticipant is the confirmed all-in CPI per participant.
- WON: already used by a study that launched.
- LOST or NOT_PURSUED: closed without a usable price. Both are terminal, so stop polling. No reason is returned on this endpoint.
Once RESPONDED, create the opportunity with POST /opportunities passing feasibility_request_id to price it from that confirmed CPI, then launch it.
Authorization
apiKey API key as Bearer token: Authorization: Bearer
In: header
Path Parameters
ID of the feasibility request, as returned by POST /feasibility/requests.
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/feasibility/requests/string"{
"id": "tz4a98xxat96iws9zmbrgj3a",
"status": "RESPONDED",
"source": "API",
"taskDescription": "A 30-minute written interview on a page we host: eight open questions about how the participant's team chose and rolled out its spend management software.",
"panelDescription": "Finance managers, senior managers and directors in the US or Canada who took part in choosing their company's current spend management software.",
"submissionCount": 12,
"timelineHours": 120,
"payRateFrequency": "ONE_TIME",
"loiMinutes": 30,
"costPerParticipant": "62.50",
"respondedAt": "2026-09-28T15:03:40.117Z",
"createdAt": "2026-09-28T15:02:11.482Z",
"dashboard_url": "https://terac.com/acme-research/feasibility"
}{
"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": []
}Submit a feasibility request POST
Submit a feasibility request: can Terac source a panel for this task, and at what CPI (cost per participant). This is an async request-reply. The response comes back immediately with status RECEIVED and no CPI (costPerParticipant is null). Terac prices it out of band, either automatically within seconds or by routing it to a person, so poll GET /feasibility/requests/{requestId} rather than assuming a turnaround. Only what you send here is priced: taskDescription, panelDescription, and the count and timeline. The filters, screening questions and tasks on the opportunity you build later are not part of the brief that was priced, so a confirmed CPI applies to the scope described here and not to a materially different one. Once RESPONDED, create the opportunity with POST /opportunities and pass feasibility_request_id to price it from that confirmed CPI (Terac skips the autonomous estimate), then launch it. The request stays RESPONDED until that study launches, and is closed as won at launch rather than at create.
List feasibility requests GET
List your organization's feasibility requests, newest first. Optionally filter by status (RECEIVED / RESPONDED / WON / LOST / NOT_PURSUED) and page through results with limit and offset. Each request includes its costPerParticipant (the CPI), which is null until the request has been priced (status RESPONDED).