Retrieve a submission
curl --request GET \
--url https://app.dotportion.com/api/v1/submissions/{id} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.dotportion.com/api/v1/submissions/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.dotportion.com/api/v1/submissions/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": {
"id": "00000000-0000-4000-8000-000000000031",
"assessment_id": "00000000-0000-4000-8000-000000000011",
"challenge": {
"name": "LRU Cache",
"slug": "lru-cache"
},
"candidate": {
"email": "katherine@example.com",
"name": "Katherine Johnson"
},
"status": "evaluated",
"started_at": "2026-01-15T12:00:00.000Z",
"submitted_at": "2026-01-15T12:00:00.000Z",
"evaluated_at": "2026-01-15T12:00:00.000Z",
"paused_total_seconds": 120,
"budget": {
"dollars_used": 1.25,
"dollars_cap": 3
},
"created_at": "2026-01-15T12:00:00.000Z",
"workspace_archive_url": null,
"report": {
"submission_id": "00000000-0000-4000-8000-000000000031",
"status": "evaluated",
"evaluated": true,
"ship_score": 87,
"verdict": "strong_yes",
"verdict_label": "Strong yes",
"confidence": "low",
"summary": "",
"scored_as_role": null,
"pillars": [
{
"id": "correctness",
"label": "Correctness",
"score": 89,
"low_confidence": false,
"summary": "",
"not_assessed": []
},
{
"id": "craft",
"label": "Craft",
"score": 77,
"low_confidence": false,
"summary": "",
"not_assessed": []
},
{
"id": "ai_fluency",
"label": "AI Fluency",
"score": 75,
"low_confidence": false,
"summary": "",
"not_assessed": []
},
{
"id": "rigor",
"label": "Rigor",
"score": 89,
"low_confidence": false,
"summary": "",
"not_assessed": []
}
],
"strengths": [],
"flags": [],
"interview_questions": [],
"facts": {
"time_used_minutes": null,
"time_allotted_minutes": 60,
"budget_used_dollars": 1.25,
"budget_allotted_dollars": 3,
"ai_authored_pct": null,
"churn_pct": null,
"ai_exchange_count": 0
},
"scope_exclusions": [],
"integrity_status": "flagged",
"pipeline_rank": {
"rank": 2,
"total": 9
},
"tasks": [],
"generated_at": "2026-01-15T12:00:00.000Z"
}
},
"meta": {
"request_id": "req_4f2a9c1e8b7d4a5f9e3c2b1a8d7f6e5c"
}
}{
"error": {
"code": "INVALID_TOKEN",
"message": "Invalid or revoked API key",
"request_id": "req_4f2a9c1e8b7d4a5f9e3c2b1a8d7f6e5c"
}
}{
"error": {
"code": "INSUFFICIENT_SCOPE",
"message": "This API key lacks the required scope: write.",
"request_id": "req_4f2a9c1e8b7d4a5f9e3c2b1a8d7f6e5c"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"request_id": "req_4f2a9c1e8b7d4a5f9e3c2b1a8d7f6e5c"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded for write requests (200/hour). Retry after 2026-01-15T13:00:00.000Z.",
"details": {
"limit": 200,
"remaining": 0,
"reset": 1768482000
},
"request_id": "req_4f2a9c1e8b7d4a5f9e3c2b1a8d7f6e5c"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "Internal server error",
"request_id": "req_4f2a9c1e8b7d4a5f9e3c2b1a8d7f6e5c"
}
}Submissions
Retrieve a submission
One submission with its report inline, plus a one-hour signed download of the candidate workspace when one exists.
workspace_archive_url is null when nothing has been submitted yet, or when archive storage is not available. Treat null as “not available”, not as an error. It is always null in test mode.
GET
/
api
/
v1
/
submissions
/
{id}
Retrieve a submission
curl --request GET \
--url https://app.dotportion.com/api/v1/submissions/{id} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.dotportion.com/api/v1/submissions/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.dotportion.com/api/v1/submissions/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": {
"id": "00000000-0000-4000-8000-000000000031",
"assessment_id": "00000000-0000-4000-8000-000000000011",
"challenge": {
"name": "LRU Cache",
"slug": "lru-cache"
},
"candidate": {
"email": "katherine@example.com",
"name": "Katherine Johnson"
},
"status": "evaluated",
"started_at": "2026-01-15T12:00:00.000Z",
"submitted_at": "2026-01-15T12:00:00.000Z",
"evaluated_at": "2026-01-15T12:00:00.000Z",
"paused_total_seconds": 120,
"budget": {
"dollars_used": 1.25,
"dollars_cap": 3
},
"created_at": "2026-01-15T12:00:00.000Z",
"workspace_archive_url": null,
"report": {
"submission_id": "00000000-0000-4000-8000-000000000031",
"status": "evaluated",
"evaluated": true,
"ship_score": 87,
"verdict": "strong_yes",
"verdict_label": "Strong yes",
"confidence": "low",
"summary": "",
"scored_as_role": null,
"pillars": [
{
"id": "correctness",
"label": "Correctness",
"score": 89,
"low_confidence": false,
"summary": "",
"not_assessed": []
},
{
"id": "craft",
"label": "Craft",
"score": 77,
"low_confidence": false,
"summary": "",
"not_assessed": []
},
{
"id": "ai_fluency",
"label": "AI Fluency",
"score": 75,
"low_confidence": false,
"summary": "",
"not_assessed": []
},
{
"id": "rigor",
"label": "Rigor",
"score": 89,
"low_confidence": false,
"summary": "",
"not_assessed": []
}
],
"strengths": [],
"flags": [],
"interview_questions": [],
"facts": {
"time_used_minutes": null,
"time_allotted_minutes": 60,
"budget_used_dollars": 1.25,
"budget_allotted_dollars": 3,
"ai_authored_pct": null,
"churn_pct": null,
"ai_exchange_count": 0
},
"scope_exclusions": [],
"integrity_status": "flagged",
"pipeline_rank": {
"rank": 2,
"total": 9
},
"tasks": [],
"generated_at": "2026-01-15T12:00:00.000Z"
}
},
"meta": {
"request_id": "req_4f2a9c1e8b7d4a5f9e3c2b1a8d7f6e5c"
}
}{
"error": {
"code": "INVALID_TOKEN",
"message": "Invalid or revoked API key",
"request_id": "req_4f2a9c1e8b7d4a5f9e3c2b1a8d7f6e5c"
}
}{
"error": {
"code": "INSUFFICIENT_SCOPE",
"message": "This API key lacks the required scope: write.",
"request_id": "req_4f2a9c1e8b7d4a5f9e3c2b1a8d7f6e5c"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"request_id": "req_4f2a9c1e8b7d4a5f9e3c2b1a8d7f6e5c"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded for write requests (200/hour). Retry after 2026-01-15T13:00:00.000Z.",
"details": {
"limit": 200,
"remaining": 0,
"reset": 1768482000
},
"request_id": "req_4f2a9c1e8b7d4a5f9e3c2b1a8d7f6e5c"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "Internal server error",
"request_id": "req_4f2a9c1e8b7d4a5f9e3c2b1a8d7f6e5c"
}
}Authorizations
Your API key, live (sk_live_…) or test (sk_test_…). Create one in Settings → API keys. Send it as Authorization: Bearer <key> — never in a query string.
Path Parameters
The submission id.
Was this page helpful?