# Async jobs & account

Multi-engine, multi-sample requests can take a minute or two. Pass async: true to get a job_id immediately and fetch results by polling or webhook. Sync requests over 120 s switch to async and return 202.

### Endpoints

| Endpoints | Description | credits |
| --- | --- | --- |
| `GET /v1/jobs/{job_id}` | Job status and result | 0 |
| `GET /v1/account` | Balance, plan and usage this month | 0 |

### Async response

```json
{
  "job_id": "job_3b7e90",
  "status": "queued",
  "credits_held": 9
}
```

`GET /v1/account`

```json
{
  "plan": "scale",
  "credits_remaining": 10422,
  "credits_used_this_month": 1578
}
```

- status goes queued → running → completed or failed. On completed, result matches the sync response.
- In async requests, answers that time out or fail are retried once more about 2 minutes later and only then marked final. Sync requests are not retried this way.
- credits_held is the hold. It settles against answers actually returned and the rest is refunded.
- With webhook_url set, the full result is POSTed there with an x-dataforgeo-signature header (HMAC-SHA256, secret in the console).
- Job results are kept for 7 days.
