# Get import job

Get the status, counters, and optionally the row results of one import job.

Status is `pending`, then `processing`, then `completed`, or `failed` when at least one row failed. `counts` breaks rows down into `created`, `duplicates`, `failed`, `skipped`, `pending`, and `warnings`.

Add `rows=failed` to read the failed rows with their error, or `rows=all` for every row and the id it created (`result_id`). Rows are paged by row number: pass `nextAfter` as `after` until it is null. Poll every few seconds while the job is pending or processing; the response is never cached. Row payloads are emptied when the job completes and rows are deleted 30 days later.


- HTTP method: `GET`
- Path: `/api/v1/import-jobs/:id`
- URL: `https://api.invunion.com/api/v1/import-jobs/:id`
- Required scope: `ingest:write`
- HTML docs: https://www.invunion.com/knowledge-base/api/get-import-job/
- Markdown docs: https://www.invunion.com/knowledge-base/api/get-import-job.md

## Path parameters

| Name | Type | Required | Description | Allowed values | Example |
| --- | --- | --- | --- | --- | --- |
| `id` | string, no maximum | required | Import job UUID, from Create import job or List import jobs. |  | `6a4deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d` |

## Query parameters

| Name | Type | Required | Description | Allowed values | Example |
| --- | --- | --- | --- | --- | --- |
| `rows` | string, no maximum | optional | Include row results. Default none. | `none`, `failed`, `all` |  |
| `limit` | integer | optional | Rows per page when rows is set. Default 100, maximum 500. |  | `100` |
| `after` | integer | optional | Return rows after this row number. Pass nextAfter of the previous response. |  | `0` |


## Errors

| Error | HTTP code | Description |
| --- | --- | --- |
| `Missing Bearer token` | `401` | The Authorization header is missing or is not a Bearer token. |
| `Invalid or revoked API key` | `401` | The API key is unknown, malformed, expired, or has been revoked. |
| `API key is missing scope ingest:write` | `403` | The key does not include ingest:write. A write scope does not imply the matching read scope. |
| `Too many requests, please try again later` | `429` | More than 100 requests in one minute from this API key or IP address. Wait for the Retry-After header (seconds) and retry. |
| `Invalid job id` | `400` | The path is not a UUID. |
| `Import job not found` | `404` | No import job with this UUID exists in the authenticated tenant. |
| `Internal server error` | `500` | Unexpected server error. The JSON body includes correlationId. Retry with backoff. |

## Request (curl)

```bash
curl --request GET \
  --url https://api.invunion.com/api/v1/import-jobs/6a4deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d?rows=failed \
  --header 'accept: application/json' \
  --header 'authorization: Bearer uk_live_YOUR_API_KEY'
```

## Request (Python)

```python
import requests

url = "https://api.invunion.com/api/v1/import-jobs/6a4deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d?rows=failed"
headers = {
    "Accept": "application/json",
    "Authorization": "Bearer uk_live_YOUR_API_KEY",
}
response = requests.get(url, headers=headers)
print(response.json())
```

## Request (Ruby)

```ruby
require 'net/http'
require 'json'
require 'uri'

uri = URI("https://api.invunion.com/api/v1/import-jobs/6a4deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d?rows=failed")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
request['Accept'] = 'application/json'
request['Authorization'] = 'Bearer uk_live_YOUR_API_KEY'
response = http.request(request)
puts response.body
```

## Request (JavaScript)

```javascript
const response = await fetch("https://api.invunion.com/api/v1/import-jobs/6a4deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d?rows=failed", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": "Bearer uk_live_YOUR_API_KEY"
  },
});
const data = await response.json();
```

## Request (Go)

```go
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, err := http.NewRequest("GET", "https://api.invunion.com/api/v1/import-jobs/6a4deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d?rows=failed", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Accept", "application/json")
	req.Header.Set("Authorization", "Bearer uk_live_YOUR_API_KEY")
	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}
```

## Request (Node)

```javascript
const response = await fetch("https://api.invunion.com/api/v1/import-jobs/6a4deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d?rows=failed", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": "Bearer uk_live_YOUR_API_KEY"
  },
});
console.log(await response.json());
```

## Success (200)

```json
{
  "success": true,
  "data": {
    "id": "6a4deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
    "type": "bulk_import",
    "file_name": "transaction-api-import.json",
    "status": "failed",
    "total_rows": 2,
    "processed_rows": 2,
    "successful_rows": 1,
    "failed_rows": 1,
    "created_at": "2026-09-12T08:00:00.000Z",
    "completed_at": "2026-09-12T08:00:04.000Z",
    "entity": "transaction",
    "errors": null,
    "duplicate_rows": 0,
    "started_at": "2026-09-12T08:00:01.000Z",
    "result": null,
    "counts": {
      "created": 1,
      "duplicates": 0,
      "failed": 1,
      "skipped": 0,
      "pending": 0,
      "warnings": 0,
      "total": 2
    },
    "rows": [
      {
        "row_number": 2,
        "status": "failed",
        "result_id": null,
        "error": "amount: Expected number, received string",
        "warning": null
      }
    ],
    "nextAfter": null
  }
}
```
