---
title: "Get the extracted rows as JSON"
method: GET
path: "/extractions/{extraction_id}/results"
tags: ["Extractions"]
---

# Get the extracted rows as JSON

`GET /extractions/{extraction_id}/results`

## Request

- Base URL: `https://api.invoicedataextraction.com/v1`
- URL: `https://api.invoicedataextraction.com/v1/extractions/{extraction_id}/results`
- Auth: HTTP bearer

The rows of a completed extraction, in pages, each row an object keyed by the output
columns exactly as the JSON output file holds it: native JSON types when the extraction
was submitted with `options.json_typed_values`, strings otherwise. The `Source File`
and `Review Needed` columns are present unless excluded at submission. The Review
Needed items whose rows fall on the page come back alongside; `review_needed.count` is
the count for the whole extraction. Rows are available for the same 90 days as the
output files.

Rate limit: 60 requests per minute per API key.

## Path parameters

- `extraction_id` string, uuid, required

## Query parameters

- `offset` integer
- `limit` integer
- `scope` 'own' | 'team'

## Response `200`

One page of rows.

- ExtractionResultsResponse
  - `success` true, required
  - `extraction_id` string, uuid, required
  - `status` 'completed', required
  - `output_structure` 'per_invoice' | 'per_line_item', required
  - `output_expires_at` string, date-time, required
  - `json_typed_values` boolean, required: `true` when values carry native JSON types; `false` when every value is a string.
  - `columns` string[], required: The output column names in order.
  - `rows` object[], required: One object per row with a value under every column. Row `i` of the page (from 0) is data row `offset + i + 1`.
  - `offset` integer, required
  - `limit` integer, required
  - `row_count` integer, required
  - `total_rows` integer, required
  - `has_more` boolean, required
  - `next_offset` integer, nullable, required
  - `review_needed` ReviewNeeded, required: Rows that need a human's check before the data is relied on. Check `count` first.
    - `count` integer, required
    - `items` ReviewNeededItem[], required
      - `message` string, required
      - `affected_fields` string[], required: Empty when the concern is about the row or document rather than particular fields.
      - `output_row_numbers` integer[], required: 1-based data row numbers, not counting the header row.
      - `source_references` string[], required
  - `pages` Pages, required: Which pages were processed and which failed; data from failed pages is missing from the output.
    - `successful_count` integer, required
    - `failed_count` integer, required
    - `successful` PageReference[], required
      - `file_name` string, required
      - `page` integer, required
    - `failed` PageReference[], required
      - `file_name` string, required
      - `page` integer, required
    - `failure_reasons` PageFailureReason[], required
      - `code` string, required
      - `message` string, required
      - `affected_pages` object[], required
        - `file_name` string, required
        - `pages` integer[], required

## Other responses

- `400`: `INVALID_INPUT`: the request does not match the contract; `details.issues` lists each problem with its `path`.
- `401`: `UNAUTHENTICATED`, `API_KEY_EXPIRED` or `API_KEY_REVOKED`.
- `403`: `FORBIDDEN`: `scope=team` from a caller who is not a team admin.
- `404`: `EXTRACTION_NOT_FOUND`; `OUTPUT_NOT_AVAILABLE` (the extraction has not completed, or has no JSON output); or `OUTPUT_EXPIRED` (past the 90-day retention).
- `429`: `RATE_LIMITED`: wait `details.retry_after_seconds` (also the `Retry-After` header), then retry.
- `500`: `INTERNAL_ERROR`: retry after a short delay.

---

[API](https://skmtc.dev/invoicedataextraction/apis/invoice-data-extraction-api.md) · [All operations](https://skmtc.dev/invoicedataextraction/apis/invoice-data-extraction-api/llms.txt) · [OpenAPI document](https://skmtc.dev/invoicedataextraction/apis/invoice-data-extraction-api/revisions/16d920350483?raw)
