Interviews
List interviews
/interviewsInterviews in your organization (cancelled ones are left out).
- Without
updatedSince, results are sorted newest first (bycreatedAt). - With
updatedSince, results are sorted byupdatedAtascending, then byid. The filter is inclusive (updatedAt >= updatedSince), so when you poll you'll see the last record again. Deduplicate by(id, updatedAt).
An invite passing its inviteExpiresAt does not change updatedAt. To find expired invites,
compare inviteExpiresAt with the current time yourself, or use status=expired.
Query parameters
pageintegermin 1Page number, starting at 1.
Default:
1limitintegermin 1max 100Items per page.
Default:
20positionIdstringpattern ^[0-9a-fA-F]{24}$Only return interviews for this position.
Example:
"66f3a1c2e4b0a1d2c3e4f530"statusstringOnly return interviews with this status.
expiredincludescreatedinvites whoseinviteExpiresAthas passed;createdleaves them out.Values:
"created", "in_progress", "completed", "abandoned", "expired"externalIdstringmax length 200Only return interviews with this
externalId(exact match).Example:
"APP-2026-00042"updatedSincestring (date-time)Only return interviews with
updatedAtat or after this ISO 8601 date-time (inclusive).Example:
"2026-09-24T10:00:00.000Z"
Responses
200A page of interviews.
A page of interviews.
Body object
dataInterview[]requiredidstringrequiredpattern ^[0-9a-fA-F]{24}$A 24-character hex ID.
positionIdstringrequiredpattern ^[0-9a-fA-F]{24}$A 24-character hex ID.
externalIdstring | nullrequiredYour ID for this candidate or application, as sent on the invite.
sourcestringrequiredapifor invites created through this API;dashboardfor candidates who applied through a position link.Values:
"dashboard", "api"statusstringrequiredcreated: invited; no answer recorded yet (the candidate may have opened the link).in_progress: at least one answer recorded.completed: all questions answered.abandoned: the candidate left without finishing.expired: the interview expired, or the invite passedinviteExpiresAtwhile stillcreated.
Values:
"created", "in_progress", "completed", "abandoned", "expired"approvalStatusstringrequiredThe reviewer's decision in the Videcoot dashboard.
Values:
"pending", "approved", "rejected"candidateCandidaterequiredinviteUrlstring (uri) | nullrequiredThe candidate's personal interview link.
nullfor interviews not created by the API.inviteExpiresAtstring (date-time) | nullrequiredAfter this time an invite still in
created(no answers recorded) reportsstatusexpired.nullfor interviews not created by the API.answeredQuestionsintegerrequiredmin 0completedAtstring (date-time) | nullrequiredanalysisStatusstringrequiredValues:
"not_requested", "pending", "processing", "completed", "failed"createdAtstring (date-time) | nullrequiredupdatedAtstring (date-time) | nullrequired
metaPaginationMetarequiredtotalintegerrequiredTotal number of matching items.
pageintegerrequiredmin 1limitintegerrequiredmin 1max 100totalPagesintegerrequiredceil(total / limit). It is 0 when there are no results.
timestampinteger (int64)requiredServer time in milliseconds since the Unix epoch.
{
"data": [
{
"id": "66f4b7d9a1c2e3f4a5b6c701",
"positionId": "66f3a1c2e4b0a1d2c3e4f530",
"externalId": "APP-2026-00042",
"source": "api",
"status": "completed",
"approvalStatus": "pending",
"candidate": {
"firstName": "Nok",
"lastName": "Srisuk",
"email": "nok.srisuk@example.com",
"phoneNumber": "812345678",
"countryCode": "+66"
},
"inviteUrl": "https://app.videcoot.com/interviews/positions/66f3a1c2e4b0a1d2c3e4f530?invite=a5880531dab9825f995ac073d405b57d240199fd0487609962899c34e031d4e5",
"inviteExpiresAt": "2026-10-09T10:00:00.000Z",
"answeredQuestions": 2,
"completedAt": "2026-09-26T02:31:05.000Z",
"analysisStatus": "not_requested",
"createdAt": "2026-09-25T10:00:00.000Z",
"updatedAt": "2026-09-26T02:31:05.000Z"
},
{
"id": "66f4b7d9a1c2e3f4a5b6c702",
"positionId": "66f3a1c2e4b0a1d2c3e4f530",
"externalId": null,
"source": "dashboard",
"status": "in_progress",
"approvalStatus": "pending",
"candidate": {
"firstName": "Malee",
"lastName": "Wong",
"email": "malee.wong@example.com",
"phoneNumber": null,
"countryCode": null
},
"inviteUrl": null,
"inviteExpiresAt": null,
"answeredQuestions": 1,
"completedAt": null,
"analysisStatus": "not_requested",
"createdAt": "2026-09-26T04:02:10.000Z",
"updatedAt": "2026-09-26T04:05:44.000Z"
}
],
"meta": {
"total": 2,
"page": 1,
"limit": 100,
"totalPages": 1
},
"timestamp": 1790395200000
}400The request is invalid. message is the first validation error.
The request is invalid. message is the first validation error.
Body Error
successbooleanrequiredValues:
falsemessagestringrequiredA human-readable error message.
timestampinteger (int64)requiredServer time in milliseconds since the Unix epoch.
{
"success": false,
"message": "limit must be between 1 and 100",
"timestamp": 1790330400000
}401The API key is missing, malformed, invalid or revoked.
The API key is missing, malformed, invalid or revoked.
Body Error
successbooleanrequiredValues:
falsemessagestringrequiredA human-readable error message.
timestampinteger (int64)requiredServer time in milliseconds since the Unix epoch.
{
"success": false,
"message": "API key is required. Send it as 'Authorization: Bearer <key>'",
"timestamp": 1790330400000
}403API access is disabled for your organization (any endpoint), or, when creating an invite, your
organization has no active subscription or no interview credits left.
API access is disabled for your organization (any endpoint), or, when creating an invite, your organization has no active subscription or no interview credits left.
Body Error
successbooleanrequiredValues:
falsemessagestringrequiredA human-readable error message.
timestampinteger (int64)requiredServer time in milliseconds since the Unix epoch.
{
"success": false,
"message": "API access is not enabled for this organization",
"timestamp": 1790330400000
}429Too many requests. Wait for Retry-After seconds (or the reset value in RateLimit), then retry.
Too many requests. Wait for Retry-After seconds (or the reset value in RateLimit), then retry.
Headers
RateLimitstringDraft-7 rate limit state, e.g.
limit=120, remaining=0, reset=42(reset is in seconds).RateLimit-PolicystringDraft-7 rate limit policy: the limit and the window in seconds.
Retry-AfterintegerSeconds to wait before retrying.
Body Error
successbooleanrequiredValues:
falsemessagestringrequiredA human-readable error message.
timestampinteger (int64)requiredServer time in milliseconds since the Unix epoch.
{
"success": false,
"message": "Too many requests. Retry after the number of seconds in the RateLimit header.",
"timestamp": 1790330400000
}