Get tracked hours for one submission
Hours this submission's participant worked on its opportunity, one row per date. Time spent on your other opportunities, and time clocked in but not spent on work, is not included. The current day is partial and refreshes through the day; last_updated_at says when the hours were last refreshed. Returns exactly this submission's participant's rows from the opportunity response for the same range.
Authorization
apiKey API key as Bearer token: Authorization: Bearer
In: header
Path Parameters
ID of the submission, as listed by GET /opportunities/{opportunityId}/submissions.
Query Parameters
Start of the window, inclusive: an ISO 8601 UTC timestamp such as 2026-09-08T00:00:00Z, or a bare 2026-09-08 read as midnight UTC. A person's day counts when the instant it opened in their own tracker timezone falls in the window, so a day is never returned in halves.
End of the window, exclusive, in the same UTC form: a day that opened exactly at to belongs to the next window, so consecutive requests neither double count nor skip. At most 92 days after from.
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/submissions/string/hours?from=string&to=string"{
"last_updated_at": "string",
"total_seconds": 0,
"total_hours": 0,
"data": [
{
"participant_id": "string",
"submission_id": "string",
"email": "string",
"date": "string",
"timezone": "string",
"seconds": 0,
"hours": 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": []
}Get tracked hours for an opportunity GET
Hours each expert worked on this opportunity, one row per person and date. Time spent on your other opportunities, and time clocked in but not spent on work, is not included. The current day is partial and refreshes through the day; `last_updated_at` says when the hours were last refreshed.
List available filters GET
Lists the audience filters an opportunity's `filters` can use, with each one's slug, type and supported operators. The catalog is the same for every organization and is not paginated. A filter with an `options_url` takes values from a fixed list: read them from `GET /filters/{filter_slug}/options` and send their `id`s. `integer--age` takes a `$gte` / `$lte` range within `min` and `max`, and the two `reference--` filters take opportunity ids.