Get the status of a job
GET /api/jobs/{jobId}
Get the progress and outcome of a job that runs in the background. Actions that take time, such as restarting a VPS or changing nameservers in bulk, answer with operation.jobId and operation.pollUrl. Call this endpoint with that ID until data.status is completed or failed. When the job finishes, data.result holds what it returned. When it fails, data.error is set, most often to Job failed. data.progressText explains the failure when more is known. This endpoint is older than v2. The job is wrapped in data. Errors are plain JSON with code and message, not Problem Details. Domain availability checks (dcheck_… IDs) are polled at GET /api/v2/domains/availability/{jobId} instead. Web hosting backup restores are polled at the pollUrl their action returns.
Authentication: Any API key. About keys and scopes
Request
Path parameters
jobIdstringrequiredoperation.jobId (job_… or dbj_…). Letters, digits, _, - and : only.Example
curl "https://cloud.hostup.se/api/jobs/job_01hxa3b4c5d6e7f8g9h0j1k2m3" \ -H "Authorization: Bearer $HOSTUP_API_KEY"Responses
200 The job’s current status.
{ "success": true, "timestamp": "2026-11-02T10:15:20.000Z", "requestId": "11111111-1111-1111-1111-111111111111", "data": { "jobId": "job_01hxa3b4c5d6e7f8g9h0j1k2m3", "queueType": "vm", "type": "restart", "state": "active", "status": "running", "progress": 70, "progressText": "Restarting VM...", "statusKey": "instance.jobs.restarting_vm", "progressDetailText": null, "progressDetails": null, "result": null, "error": null, "isCompleted": false, "isFailed": false, "isRunning": true, "isWaiting": false, "createdAt": "2026-11-02T10:15:02.000Z", "finishedAt": null }}{ "success": true, "timestamp": "2026-11-02T10:15:41.000Z", "requestId": "11111111-1111-1111-1111-111111111111", "data": { "jobId": "job_01hxa3b4c5d6e7f8g9h0j1k2m3", "queueType": "vm", "type": "restart", "state": "completed", "status": "completed", "progress": 100, "progressText": "Operation completed successfully", "statusKey": "instance.jobs.completed_successfully", "progressDetailText": null, "progressDetails": null, "result": { "message": "VM restarted successfully", "attempts": 1 }, "error": null, "isCompleted": true, "isFailed": false, "isRunning": false, "isWaiting": false, "createdAt": "2026-11-02T10:15:02.000Z", "finishedAt": "2026-11-02T10:15:38.000Z" }}{ "success": true, "timestamp": "2026-11-02T10:16:05.000Z", "requestId": "11111111-1111-1111-1111-111111111111", "data": { "jobId": "job_01hxa3b4c5d6e7f8g9h0j1k2m3", "queueType": "vm", "type": "restart", "state": "failed", "status": "failed", "progress": 40, "progressText": "Operation failed", "statusKey": "instance.jobs.operation_failed", "progressDetailText": null, "progressDetails": null, "result": null, "error": "Job failed.", "isCompleted": false, "isFailed": true, "isRunning": false, "isWaiting": false, "createdAt": "2026-11-02T10:15:02.000Z", "finishedAt": "2026-11-02T10:16:01.000Z" }}Response fields
successbooleantrue on a 200 response. One of true.timestampstringrequestIdstringdataobjectjobIdstringqueueTypestring or nullvm for a VPS, domain or dns for domains and DNS, order for an order.typestring or nullrestart, backup, rebuild or bulk_dns_add.statestring or nullwaiting, delayed, active, completed or failed. Branch on status instead.statusstringwaiting: queued, not started. running: in progress. completed and failed are final; stop polling when you see one of them. One of waiting, running, completed, failed.progressnumberprogressTextstring or nullRestarting VM....statusKeystring or nullprogressText, for clients that show their own translated text.progressDetailTextstring or nullprogressDetailsobject or nullitems, one row per order line or domain. null when the job reports none.resultanytype. null until the job has finished. A job that finished with a warning still has status: completed; the warning is in result.warning.errorstring or nullnull, or a short message about an error. A failed job most often says Job failed.; ISO downloads say what went wrong with the link. A job that is retrying a step, or that completed after a retry, can show Job reported an error. Decide on status, not on error.isCompletedbooleantrue when status is completed.isFailedbooleantrue when status is failed.isRunningbooleantrue when status is running.isWaitingbooleantrue when status is waiting.createdAtstring or nullfinishedAtstring or nullnull while it runs.Errors
Errors are Problem Details with a stable code. Branch on the code, not on the text.
| 400 | The job ID has characters other than letters, digits, _, - and :. |
| 401 | No valid API key was sent. |
| 403 | The job belongs to another account or to a service your key cannot see. |
| 404 | No job has this ID. Finished jobs are kept only for a limited time. A completed job is kept for at most 24 hours. It goes sooner once it is no longer among the newest 100 completed jobs of its kind, counted over all accounts (20 to 50 for DNS jobs). On a busy day that can take minutes. A failed job is kept for up to 7 days. After a 404 for a job you saw running, check the resource itself. For a backup, list the backups. Web hosting backup restores and domain availability checks (dcheck_…) answer 404 here too. Poll them at the pollUrl their action returned. |
| 429 | Too many requests. Two limits apply. They answer differently. The limit per IP address sends a Retry-After header and retryAfter in the body, without code. Wait that many seconds, then poll again. The API key’s own limit of 300 requests per five minutes answers with code API_KEY_RATE_LIMIT_EXCEEDED and the message Rate limit exceeded. It sends no Retry-After header and no retryAfter. Wait up to five minutes before you poll again. |
| 500 | Something went wrong on our side. Poll again later. |