> ## Documentation Index
> Fetch the complete documentation index at: https://code.dcycle.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Ingest Job

> Status and progress of a bulk ingest job

[← Create Wastes (v2)](/api-reference/wastes/create-v2)

Read the status, counters and progress of a job created by a bulk endpoint such as
[`POST /v2/wastes`](/api-reference/wastes/create-v2). This is the endpoint to poll while the records are being
calculated.

<Warning>
  **Beta.** Part of the bulk ingest API, currently in beta. The contract may still change before general
  availability.
</Warning>

## Request

### Headers

<ParamField header="x-api-key" type="string" required>
  Your API key for authentication

  **Example:** `sk_live_1234567890abcdef`
</ParamField>

<ParamField header="x-organization-id" type="string" required>
  UUID of the organization that created the job, or of one of its parent organizations.

  **Example:** `a8315ef3-dd50-43f8-b7ce-d839e68d51fa`
</ParamField>

### Path Parameters

<ParamField path="job_id" type="uuid" required>
  The job `id`, as returned in the bulk response body and in its `Location` header.

  **Example:** `2d4b90c1-7c1e-4b6f-9a55-3f2b8e61d0aa`
</ParamField>

## Response

<ResponseField name="id" type="uuid">
  Job id.
</ResponseField>

<ResponseField name="status" type="string">
  **Available values:** `processing`, `completed`, `completed_with_errors`, `failed`.

  * `processing`: the records are stored and their emissions are being calculated.
  * `completed`: every record was calculated.
  * `completed_with_errors`: every chunk ran and at least one record failed to calculate (`counts.failed > 0`).
  * `failed`: the job as a whole failed; contact support with the job id.
</ResponseField>

<ResponseField name="entity_type" type="string">
  What the job creates, e.g. `wastes`.
</ResponseField>

<ResponseField name="operation" type="string">
  **Available values:** `create`.
</ResponseField>

<ResponseField name="source" type="string">
  How the job was submitted. **Available values:** `api_bulk`, `file_upload`, `import_wizard`.
</ResponseField>

<ResponseField name="counts" type="object">
  <Expandable title="fields">
    <ResponseField name="submitted" type="integer">Records in the request. All of them were stored.</ResponseField>
    <ResponseField name="succeeded" type="integer">Records whose emissions have been calculated.</ResponseField>

    <ResponseField name="failed" type="integer">
      Records whose calculation failed. The record exists but has no emissions.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="chunks_total" type="integer">
  Number of calculation chunks.
</ResponseField>

<ResponseField name="chunks_done" type="integer">
  Chunks already calculated. `chunks_done / chunks_total` is the progress.
</ResponseField>

<ResponseField name="created_at" type="datetime">
  When the job was created (UTC).
</ResponseField>

<ResponseField name="finished_at" type="datetime | null">
  When the job finished (UTC), `null` while it is processing.
</ResponseField>

<ResponseField name="links" type="object">
  `self`: this job. `items`: [its per-record outcomes](/api-reference/ingest-jobs/list-items).
</ResponseField>

## Example

<CodeGroup>
  ```bash cURL theme={"theme":{"light":"github-light","dark":"github-dark"}}
  curl "https://api.dcycle.io/v2/ingest-jobs/2d4b90c1-7c1e-4b6f-9a55-3f2b8e61d0aa" \
    -H "x-api-key: ${DCYCLE_API_KEY}" \
    -H "x-organization-id: ${DCYCLE_ORG_ID}"
  ```

  ```python Python theme={"theme":{"light":"github-light","dark":"github-dark"}}
  import os

  import requests

  job = requests.get(
      "https://api.dcycle.io/v2/ingest-jobs/2d4b90c1-7c1e-4b6f-9a55-3f2b8e61d0aa",
      headers={
          "x-api-key": os.environ["DCYCLE_API_KEY"],
          "x-organization-id": os.environ["DCYCLE_ORG_ID"],
      },
      timeout=30,
  ).json()
  print(job["status"], f"{job['chunks_done']}/{job['chunks_total']}")
  ```

  ```javascript JavaScript theme={"theme":{"light":"github-light","dark":"github-dark"}}
  const axios = require('axios');

  const { data: job } = await axios.get(
    'https://api.dcycle.io/v2/ingest-jobs/2d4b90c1-7c1e-4b6f-9a55-3f2b8e61d0aa',
    {
      headers: {
        'x-api-key': process.env.DCYCLE_API_KEY,
        'x-organization-id': process.env.DCYCLE_ORG_ID,
      },
    },
  );
  console.log(job.status, `${job.chunks_done}/${job.chunks_total}`);
  ```
</CodeGroup>

### Successful Response

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "id": "2d4b90c1-7c1e-4b6f-9a55-3f2b8e61d0aa",
  "status": "completed_with_errors",
  "entity_type": "wastes",
  "operation": "create",
  "source": "api_bulk",
  "counts": { "submitted": 250, "succeeded": 247, "failed": 3 },
  "chunks_total": 3,
  "chunks_done": 3,
  "created_at": "2026-09-29T10:15:02.184311",
  "finished_at": "2026-09-29T10:16:41.902774",
  "links": {
    "self": "/v2/ingest-jobs/2d4b90c1-7c1e-4b6f-9a55-3f2b8e61d0aa",
    "items": "/v2/ingest-jobs/2d4b90c1-7c1e-4b6f-9a55-3f2b8e61d0aa/items"
  }
}
```

<Tip>
  Poll every 5 to 10 seconds and stop when `status` is no longer `processing`. `chunks_done / chunks_total` tells
  you how far along the job is.
</Tip>

## Common Errors

### 401 Unauthorized

Missing or invalid API key.

### 404 Not Found

The job does not exist, or it belongs to an organization outside the one in `x-organization-id`. Both cases return
the same response.

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "code": "NOT_FOUND",
  "detail": "IngestJobModel with id='2d4b90c1-7c1e-4b6f-9a55-3f2b8e61d0aa' not found"
}
```

## Related Endpoints

<CardGroup cols={2}>
  <Card title="List Ingest Job Items" icon="list" href="/api-reference/ingest-jobs/list-items">
    Per-record outcomes of the job
  </Card>

  <Card title="Create Wastes (v2)" icon="plus" href="/api-reference/wastes/create-v2">
    Create up to 5,000 wastes in one request
  </Card>
</CardGroup>
