Results

Result responses combine structured output data with downloadable files generated by a completed job.

Results are available after a job reaches a result-ready terminal state. Use the status endpoint or events stream to wait for readiness, then use the result endpoint to retrieve structured output and signed file download URLs. For the web app result model, see Jobs and Files and Collections.

Fetch results

GET /api/v1/results/{jobId} returns the result payload for a job in the API key workspace.

Bash
curl -s \
  -H "Authorization: Bearer $PROTEINIQ_API_KEY" \
  "https://proteiniq.io/api/v1/results/job_123"

The endpoint returns results for jobs that are COMPLETED, BUDGET_EXCEEDED, or FAILED with stored output. Do not use a fixed delay after submission as a readiness check; poll GET /api/v1/jobs/{jobId}/status or stream GET /api/v1/jobs/{jobId}/events before fetching results.

Result resource

JSON
{
  "object": "job_result",
  "job_id": "job_123",
  "tool": "esmfold",
  "status": "COMPLETED",
  "completed_at": "2026-06-12T08:05:00.000Z",
  "data_source": "r2",
  "files": [
    {
      "name": "prediction.pdb",
      "key": "outputs/job_123/prediction.pdb",
      "content_type": "chemical/x-pdb",
      "url": "https://..."
    }
  ],
  "results": {}
}

The files array comes from the stored output manifest. File objects with a storage key receive a signed url when the file can be downloaded through the public result API.

Download files

Signed URLs are temporary. Fetch the result again when a saved URL expires.

curl -s \
  -H "Authorization: Bearer $PROTEINIQ_API_KEY" \
  "https://proteiniq.io/api/v1/results/job_123" \
  -o result.json

curl -L "$(jq -r '.files[0].url' result.json)" -o result-file

Result availability

If results are requested before the job is ready, the API returns job_not_completed with the current status and a Retry-After header.

http
HTTP/1.1 409 Conflict
Retry-After: 5
JSON
{
  "error": {
    "code": "job_not_completed",
    "message": "Job is not yet completed",
    "details": {
      "current_status": "PROCESSING"
    }
  }
}

If a job exists but no result object is available, the API returns not_found.