---
title: "Get a CSV import's status"
method: GET
path: "/table-imports/{import_id}/"
tags: ["table-imports"]
---

# Get a CSV import's status

`GET /table-imports/{import_id}/`

## Request

- Base URL: `https://api.getoneprofile.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.getoneprofile.ai/table-imports/{import_id}/`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Poll an import's progress. `imported_rows` climbs against `total_rows` while the load runs; `status` reaches `succeeded` or `failed` and stays there.

`failed_rows` is the exact count of rows that could not be written, while `row_errors` carries only a capped sample of them for display.

## Path parameters

- `import_id` string, uuid, required

## Response `200`

Successful Response

- TableImportJobResponseSchema: A CSV import's current state. Poll this until `status` is terminal. `imported_rows` climbs as the load runs, so it doubles as a progress bar against `total_rows`.
  - `columns` ImportColumnMappingSchema[], required: The mapping in force.
    - `column_type` 'text' | 'paragraph' | 'url' | 'email' | 'image_url' | 'person' | 'select' | 'number' | 'decimal' | 'currency' | 'checkbox' | 'date' | 'multi_select' | 'list' | 'object', required: The type a user picks for a table column. Ordered as the picker shows them, which is also the order the groups below run in: text-ish, then numeric, then choice, then structured.
    - `name` string, required: The column's display name.
    - `source_index` integer, required: The field's zero-based position in the file.
  - `created_at` string, date-time, required
  - `error` string, nullable, required: Why the whole job failed, if it did.
  - `failed_rows` integer, required: Rows that could not be written: the exact count.
  - `id` string, uuid, required
  - `imported_rows` integer, required: Rows written so far.
  - `row_errors` ImportRowErrorSchema[], required: A capped sample of per-row failures; failed_rows carries the full count.
    - `reason` string, required: Which column rejected the value, and why.
    - `row_number` integer, required: One-based data-row number in the file.
  - `source_filename` string, required
  - `status` 'pending' | 'running' | 'succeeded' | 'failed', required: Where a CSV import has got to. ``PENDING`` is a parsed-and-stored upload the user has not committed yet: it holds an inferred mapping and nothing else. ``RUNNING`` means the table and its columns exist and the row job is inserting. The two terminal states are absorbing: a job never leaves them.
  - `table_id` string, uuid, nullable, required: The table this created; null before commit.
  - `total_rows` integer, required: Rows this import will write: the file's rows, capped by the plan and by whatever `max_rows` the commit asked for, or the rows its `row_ranges` hold.
  - `updated_at` string, date-time, required

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `404`: Import not found
- `422`: Invalid request made to the API.
- `500`: Internal server error.
- `502`: Bad gateway error.
- `503`: Service unavailable.

---

[API](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile.md) · [All operations](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile/llms.txt) · [OpenAPI document](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile/revisions/dc5ac3c84444?raw)
