One async job
https://api.norreach.app/v1/jobs/{id}The status of a job an earlier request started — plan generation from POST /briefs, a re-plan from POST /plans/{id}/replan. Poll until status is succeeded (its result holds the answer, e.g. the plan id) or failed (its error is a problem). resource names what the job works on. Webhook subscribers get plan.generated when Nora finishes writing a plan.
curl -X GET "https://api.norreach.app/v1/jobs/{id}" \
-H "Authorization: Bearer $NORREACH_API_KEY"{
"id": "2f9c1a7e-5b3d-4e8f-9a1b-6c7d8e9f0a1b",
"object": "job",
"type": "plan.generate",
"status": "succeeded",
"created_at": "2026-11-04T09:12:33.120Z",
"finished_at": "2026-11-04T09:16:41.004Z",
"result": {
"plan_id": "6a7b8c9d-0e1f-4a2b-8c3d-4e5f6a7b8c9d",
"plan_status": "review"
},
"error": null,
"resource": {
"object": "plan",
"id": "6a7b8c9d-0e1f-4a2b-8c3d-4e5f6a7b8c9d"
}
}Authorizations
Bearer authentication: send Authorization: Bearer <key>, with an API key or an OAuth access token. Any valid key works. API keys and scopes
Path parameters
An id (UUID).
Response
200application/json— One async job
An id (UUID).
What the job does (e.g. contacts.import).
queuedrunningsucceededfailedRFC 3339 UTC timestamp with milliseconds.
The job's answer once it succeeded.
Why it failed.
What the job works on — GET it for the full object.
Errors
Errors are application/problem+json with a stable code.
| Status | Code | Meaning |
|---|---|---|
| 400 | bad_request | The request couldn't be read. |
| 400 | unknown_field | The request has a field this operation doesn't know. |
| 401 | unauthorized | A valid API key is required. |
| 403 | insufficient_scope | This API key doesn't have the scope this operation needs. |
| 403 | feature_not_enabled | The API isn't switched on for this workspace. |
| 404 | not_found | That doesn't exist. |
| 429 | rate_limited | Too many requests. Slow down and try again. |
| 500 | server_error | Something went wrong on our side. |
| 503 | unavailable | The API isn't available right now. Try again shortly. |