---
updatedAt: 2026-07-31T18:03:06.000Z
agentTools:
  projectIndex: https://docs.sensible.so/llms.txt
---

# List extractions

Use this endpoint to get a filtered list of past extractions.
This endpoint returns a summary for each extraction, listed in reverse chronological order. 
To get details about an extraction, use the [Retrieve extraction by ID](ref:retrieving-results) endpoint.
This endpoint uses keyset pagination to retrieve the next page of results.
By default it returns a first page of 20 extractions and an opaque `continuation_token` that you can pass in the next request to get the next page of results, until the endpoint returns `continuation_token` to indicate the last page. 
Use the `limit` parameter to configure page size. 


# OpenAPI definition

```json
{
  "openapi": "3.0.3",
  "servers": [
    {
      "url": "https://api.sensible.so/v0",
      "description": "Production server (uses live data)"
    }
  ],
  "info": {
    "title": "Extraction",
    "version": "0.0.0",
    "license": {
      "name": "Sensible API",
      "url": "https://www.TBD.org/licenses/LICENSE-2.0.html"
    },
    "description": "Extract structured data from documents with the Sensible API."
  },
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "tags": [
    {
      "name": "Retrieve extractions",
      "description": "Retrieve data extracted asynchronously from documents"
    }
  ],
  "paths": {
    "/extractions": {
      "get": {
        "operationId": "list-extractions",
        "summary": "List extractions",
        "tags": [
          "Retrieve extractions"
        ],
        "description": "Use this endpoint to get a filtered list of past extractions.\nThis endpoint returns a summary for each extraction, listed in reverse chronological order. \nTo get details about an extraction, use the [Retrieve extraction by ID](https://docs.sensible.so/reference/retrieving-results) endpoint.\nThis endpoint uses keyset pagination to retrieve the next page of results.\nBy default it returns a first page of 20 extractions and an opaque `continuation_token` that you can pass in the next request to get the next page of results, until the endpoint returns `continuation_token` to indicate the last page. \nUse the `limit` parameter to configure page size. \n",
        "parameters": [
          {
            "$ref": "#/components/parameters/start_date"
          },
          {
            "$ref": "#/components/parameters/end_date"
          },
          {
            "$ref": "#/components/parameters/page_limit"
          },
          {
            "$ref": "#/components/parameters/continuation_token"
          },
          {
            "$ref": "#/components/parameters/configuration_ids"
          },
          {
            "$ref": "#/components/parameters/document_type_ids"
          },
          {
            "$ref": "#/components/parameters/environments"
          },
          {
            "$ref": "#/components/parameters/statuses"
          },
          {
            "$ref": "#/components/parameters/min_coverage"
          },
          {
            "$ref": "#/components/parameters/max_coverage"
          },
          {
            "$ref": "#/components/parameters/review_statuses"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExtractionsResponseFiltered"
                }
              }
            },
            "description": "Returns list of summarized extractions."
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "500": {
            "$ref": "#/components/responses/500"
          }
        }
      }
    }
  },
  "components": {
    "responses": {
      "400": {
        "description": "Bad Request. Sensible returns either a plain-text error message or a structured JSON error, depending on what caused the failure. For more information, see the two content types below.",
        "content": {
          "text/plain": {
            "schema": {
              "title": "Bad Request",
              "type": "string",
              "example": "Either a specific set of messages about fields in the request, or error messages like the following examples - To use the asynchronous flow you must have persistence enabled Specified document type does not exist Specified document type ${named type} does not exist No published configurations found for environment ${environment} Specified golden does not exist Must provide the Content-Type header Missing request body or body.document Could not determine the content type of the document Could not determine the content type of the document. Please check that the document was correctly encoded as Base64 This PDF is invalid. If you submitted this PDF using Base64 encoding, please check that the encoding is correct This PDF is password protected. Please resubmit with password protection disabled This PDF is empty This PDF exceeds the maximum dimensions for OCR of 17 x 17 inches This PDF exceeds the maximum size for OCR of 50MB No fingerprints match for this PDF and fingerprint_mode is set to strict Content type of ${found} does not match declared type of ${expected} The start date must be before the end date"
            }
          },
          "application/json": {
            "schema": {
              "title": "Bad Request (structured)",
              "type": "object",
              "description": "Returned instead of plain text when the request fails path, query, or body validation (for example, a malformed id, an out-of-range limit, or an invalid field in a JSON body), and for the extract_from_url document-fetch failure. The shape of `context` varies by cause: for validation failures, it echoes the offending path and/or query values; for the extract_from_url failure, it's the extraction's current state.",
              "properties": {
                "message": {
                  "type": "string",
                  "description": "Human-readable summary of the error."
                },
                "errors": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Present when the request failed path, query, or body validation -- one message per failing field, in the form '<location>/<field> <reason>'."
                },
                "context": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "Additional context about the failure. See the parent description for how this varies by cause."
                }
              },
              "required": [
                "message"
              ]
            },
            "examples": {
              "validationFailure": {
                "summary": "A path parameter failed validation",
                "value": {
                  "message": "This request contains errors",
                  "context": {
                    "path": "/documents/{id}"
                  },
                  "errors": [
                    "path/id should be valid version 4 UUID"
                  ]
                }
              },
              "documentFetchFailure": {
                "summary": "extract_from_url could not download the document",
                "value": {
                  "message": "Transferring the file failed with 'Response code 404 (Not Found)'",
                  "context": {
                    "id": "e75dd6ee-ef8f-4960-8be2-ba22f8c398e3",
                    "created": "2026-07-17T14:39:49.084Z",
                    "completed": "2026-07-17T14:39:49.330Z",
                    "status": "FAILED",
                    "type": "1040s",
                    "environment": "production",
                    "errors": [],
                    "error": "Response code 404:\n404: Not Found",
                    "actor": "legacy: Sensible"
                  }
                }
              }
            }
          }
        }
      },
      "401": {
        "description": "Not authorized",
        "content": {
          "text/plain": {
            "schema": {
              "title": "Unauthorized",
              "type": "string",
              "example": "Unauthorized"
            }
          }
        }
      },
      "415": {
        "description": "Unsupported Media Type",
        "content": {
          "text/plain": {
            "schema": {
              "title": "Unsupported Media Type",
              "type": "string",
              "description": "Unsupported file type. See https://docs.sensible.so/docs/file-types."
            }
          }
        }
      },
      "500": {
        "description": "Internal Server Error",
        "content": {
          "text/plain": {
            "schema": {
              "title": "Sensible encountered an unknown error",
              "type": "string",
              "example": "Sensible encountered an unknown error"
            }
          }
        }
      }
    },
    "parameters": {
      "start_date": {
        "name": "start_date",
        "in": "query",
        "required": false,
        "description": "Retrieves extractions with a `created` date that is equal to or later than this date-time. The default is the unix epoch. ",
        "schema": {
          "type": "string",
          "format": "date-time",
          "default": "1970-01-01T00:00:00Z"
        },
        "example": "2020-10-10T00:00:00.000Z"
      },
      "end_date": {
        "name": "end_date",
        "in": "query",
        "required": false,
        "description": "Retrieves extractions with a `created` date that is equal to or earlier than this date-time. The default is the current date-time.",
        "schema": {
          "type": "string",
          "format": "date-time"
        },
        "example": "2024-01-20T00:00:00.000Z"
      },
      "page_limit": {
        "name": "limit",
        "in": "query",
        "required": false,
        "description": "Use the limit to define the number of items you recieve on each page of the paginated response. The default is 20.",
        "schema": {
          "type": "number",
          "default": 20
        },
        "example": 100
      },
      "continuation_token": {
        "name": "continuation_token",
        "in": "query",
        "required": false,
        "description": "Get the next page of results by making a new request and passing the opaque `continuation_token` parameter  that Sensible returns in the current page of responses. Sensible returns a null `continuation_token` in the response to indicate the last page.",
        "schema": {
          "type": "string"
        },
        "example": "eyJpZCI6IjRiNTg1Mjc4LWUwOWMtNGJiOS04ODJiLThmYjFhZTA3ZGU3ZiIsInVzZXIiOiJjMDI0Y2QxYy01ZMMzLTRhODItYjJlYS0yYzgwN2U0NDk4OGIiLCJjcmVhdGVkIjoiMjAyNC0wNS0wMVQyMjo11Do1NS43MzMaIn1"
      },
      "document_type_ids": {
        "name": "document_type_ids",
        "in": "query",
        "description": "Comma-delimited list of document types by which to filter the retrieved extractions.",
        "schema": {
          "type": "string"
        },
        "example": "4e95e3d0-8d69-49b0-9501-2cca8b902a45, 24d82783-b12b-4e70-b0ae-ca1ce35a9836"
      },
      "configuration_ids": {
        "name": "configuration_ids",
        "in": "query",
        "description": "Comma-delimited list of configurations by which to filter the retrieved extractions.",
        "schema": {
          "type": "string"
        },
        "example": "1417523c-f318-4037-90e9-ed7ade06031d,23be500b-4b7f-43dd-b0db-f06ec5c6c8de"
      },
      "statuses": {
        "name": "statuses",
        "in": "query",
        "description": "Comma-delimited list of statuses (WAITING, PROCESSING, FAILED, COMPLETE) by which to filter the retrieved extractions.",
        "schema": {
          "type": "string"
        },
        "example": "COMPLETE,WAITING"
      },
      "min_coverage": {
        "name": "min_coverage",
        "in": "query",
        "description": "Minimum extraction coverage score by which to filter the retrieved extractions. For more information about scoring, see [Monitoring extraction metrics](https://docs.sensible.so/docs/metrics).",
        "schema": {
          "type": "number"
        },
        "example": 0.8
      },
      "max_coverage": {
        "name": "max_coverage",
        "in": "query",
        "description": "Maximum extraction coverage score by which to filter the retrieved extractions. For more information about scoring, see [Monitoring extraction metrics](https://docs.sensible.so/docs/metrics).",
        "schema": {
          "type": "number"
        },
        "example": 1
      },
      "review_statuses": {
        "name": "review_statuses",
        "in": "query",
        "description": "Comma-delimited list of review statuses (APPROVED, NEEDS_REVIEW, REJECTED) by which to filter the retrieved extractions. For more information, see [Human review](https://docs.sensible.so/docs/human-review). Sensible returns [portfolio](https://docs.sensible.so/docs/portfolio) extractions if at least one document in the portfolio meets the specified status criteria. ",
        "schema": {
          "type": "string"
        },
        "example": "APPROVED,NEEDS_REVIEW"
      },
      "environments": {
        "name": "environments",
        "in": "query",
        "description": "Comma-delimited list of environments (production, development) by which to filter the retrieved extractions.",
        "schema": {
          "type": "string"
        },
        "example": "production,development"
      }
    },
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "Sensible uses API keys to authenticate requests. Keep your API keys secure and do not share them publicly accessible areas such as GitHub, client-side code, etc. Authentication to the API is performed via Bearer Authentication. Provide your API key as the bearer auth value."
      }
    },
    "schemas": {
      "Charged": {
        "type": "integer",
        "example": 1,
        "description": "The number of extractions charged to your account for this extraction ID."
      },
      "Actor": {
        "type": "string",
        "description": "Best-effort label identifying the user or credential that initiated the extraction. For extractions you initiate in the Sensible app, the value is your account's email address. For extractions you initiate by using your API key, the value is `'api_key: <key name>'` if the key has a name, or `'api_key'` if unnamed. For extractions you initiate in the Sensible app while logged in with legacy credentials, the value is `'legacy: <account>'`. Sensible omits this field for extractions you initiate with email processors.",
        "example": "api_key: my production key",
        "x-internal-note": "auth_token-initiated extractions are not a real code path; omitting the 'auth_token: <creator>' case from the public description deliberately."
      },
      "ReviewStatuses": {
        "type": "string",
        "nullable": true,
        "enum": [
          "NEEDS_REVIEW",
          "APPROVED",
          null,
          "REJECTED"
        ],
        "example": "NEEDS_REVIEW",
        "description": "The review status for each document in the portfolio, in order of their page ranges in the portfolio.  For more information, see [Human review](https://docs.sensible.so/docs/human-review). Specify a webhook in the extraction request so that you can get a push notification when  a review status in the reviewStatuses array changes to `APPROVED` or `REJECTED` for extractions that returned `NEEDS_REVIEW`."
      },
      "ReviewStatus": {
        "type": "string",
        "enum": [
          "NEEDS_REVIEW",
          "APPROVED",
          "REJECTED"
        ],
        "example": "NEEDS_REVIEW",
        "description": "The extraction's review status. For more information, see [Human review](https://docs.sensible.so/docs/human-review). Specify a webhook in the extraction request so that you can get a push notification when  review status changes to `APPROVED` or `REJECTED` for extractions that returned `NEEDS_REVIEW`. Sensible omits this property from the extraction response  if the extraction doesn't need review."
      },
      "ContentTypeResponse": {
        "type": "string",
        "description": "The content type of the document.\n",
        "example": "image/png"
      },
      "Coverage": {
        "type": "number",
        "description": "The coverage score measures how fully an extraction captured all your target data in the document.  It's a percentage comparing non-null, [validated](https://docs.sensible.so/docs/validate-extractions) fields to total fields  returned by a config for a document. For example, a coverage score of 70% for an extraction with no  validation errors means that 30% of fields were null. For more information about scoring,  see [Monitoring extraction metrics](https://docs.sensible.so/docs/metrics).",
        "example": 0.75
      },
      "EnvironmentResponse": {
        "description": "Name of the environment to which the configuration used by this extraction was published.",
        "example": "production",
        "type": "string",
        "enum": [
          "production",
          "development"
        ]
      },
      "DocName": {
        "type": "string",
        "description": "If you specify the filename of the document using the `document_name` parameter, then  Sensible displays the name in extraction history in the Sensible app  and returns the name in the extraction response.",
        "example": "example.pdf"
      },
      "ExtractionsResponseFiltered": {
        "type": "object",
        "properties": {
          "extractions": {
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/SingleExtractionSummaryResponse"
                },
                {
                  "$ref": "#/components/schemas/MultiExtractionSummaryResponse"
                }
              ]
            }
          },
          "continuation_token": {
            "type": "string",
            "nullable": true,
            "description": "Opaque token for retrieving the next page of results. Pass it as the `continuation_token` query parameter in the next request. Null on the last page."
          },
          "last_evaluated_creation_date": {
            "type": "string",
            "format": "date-time",
            "description": "The creation date of the last extraction on this page of results (find this value in an extraction's `created` parameter)."
          },
          "cutoff_date": {
            "type": "string",
            "format": "date-time",
            "example": null,
            "description": "DEPRECATED. The `continuation_token` and `limit` parameters replace this parameter.  DESCRIPTION: Pass the cutoff_date parameter in the next request as the `end_date` parameter to retrieve the next page of extractions. Note that since Sensible applies the date range filters before all other filters, the `cutoff_date` can represent  the date-time of an extraction that Sensible retrieved using the date range filter, and then removed using other filters."
          }
        }
      },
      "SingleExtractionSummaryResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ExtractionSummaryBase"
          }
        ],
        "properties": {
          "type": {
            "$ref": "#/components/schemas/DocumentTypeName"
          },
          "configuration": {
            "$ref": "#/components/schemas/ConfigurationName"
          },
          "configuration_version": {
            "$ref": "#/components/schemas/ConfigurationVersion"
          },
          "content_type": {
            "$ref": "#/components/schemas/ContentTypeResponse"
          },
          "reviewStatus": {
            "$ref": "#/components/schemas/ReviewStatus"
          },
          "errors": {
            "$ref": "#/components/schemas/Errors"
          },
          "validations": {
            "$ref": "#/components/schemas/Validations"
          }
        }
      },
      "MultiExtractionSummaryResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ExtractionSummaryBase"
          }
        ],
        "properties": {
          "types": {
            "$ref": "#/components/schemas/DocumentTypeNames"
          },
          "segment_documents_with": {
            "$ref": "#/components/schemas/SegmentDocumentsWith"
          },
          "reviewStatuses": {
            "$ref": "#/components/schemas/ReviewStatuses"
          },
          "documents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MultiExtractionSummaryDocument"
            }
          }
        }
      },
      "ExtractionSummaryBase": {
        "type": "object",
        "x-internal-note": "batchId may be returned by the backend but is not a standard field on every extraction -- it's deliberately not documented publicly. The backend only sets it for extractions created through the separate, undocumented /extract/batch/* API (src/api/extract/batch.ts), so it's absent for anything created through the endpoints in this spec.",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/ExtractionId"
          },
          "created": {
            "$ref": "#/components/schemas/ExtractionCreated"
          },
          "uploaded": {
            "$ref": "#/components/schemas/ExtractionUploaded"
          },
          "processing_started": {
            "$ref": "#/components/schemas/ExtractionProcessingStarted"
          },
          "completed": {
            "$ref": "#/components/schemas/ExtractionCompleted"
          },
          "status": {
            "$ref": "#/components/schemas/ExtractionStatus"
          },
          "error": {
            "$ref": "#/components/schemas/ExtractionErrorMessage"
          },
          "validation_summary": {
            "$ref": "#/components/schemas/ValidationsSummary"
          },
          "page_count": {
            "type": "integer",
            "example": 100,
            "description": "Total number of pages in the document."
          },
          "document_name": {
            "$ref": "#/components/schemas/DocName"
          },
          "environment": {
            "$ref": "#/components/schemas/EnvironmentResponse"
          },
          "coverage": {
            "$ref": "#/components/schemas/Coverage"
          },
          "charged": {
            "$ref": "#/components/schemas/Charged"
          },
          "actor": {
            "$ref": "#/components/schemas/Actor"
          }
        }
      },
      "MultiExtractionSummaryDocument": {
        "type": "object",
        "properties": {
          "documentType": {
            "$ref": "#/components/schemas/DocumentTypeName"
          },
          "configuration": {
            "$ref": "#/components/schemas/ConfigurationName"
          },
          "startPage": {
            "type": "integer",
            "description": "Page in the portfolio on which the document for this extraction starts.",
            "example": 2
          },
          "endPage": {
            "type": "integer",
            "description": "Page in the portfolio on which this document for this extraction ends.",
            "example": 6
          },
          "output": {
            "type": "object",
            "properties": {
              "errors": {
                "$ref": "#/components/schemas/Errors"
              },
              "validations": {
                "$ref": "#/components/schemas/Validations"
              }
            }
          }
        }
      },
      "ConfigurationName": {
        "type": "string",
        "description": "Name of the \"configuration\", a collection of SenseML queries for extracting document data.",
        "example": "config_for_x_company"
      },
      "ConfigurationVersion": {
        "type": "string",
        "description": "Version number for the configuration.",
        "example": "N39i3ZvEbPCkcjOtYIAU1_ADSovnUC5I"
      },
      "DocumentTypeName": {
        "description": "Unique user-friendly name for a document type",
        "example": "auto_insurance_quotes_all_carriers",
        "type": "string"
      },
      "Validation": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "description": "Description of the validation",
            "example": "Dollar amount should be more than $100"
          },
          "severity": {
            "type": "string",
            "enum": [
              "error",
              "warning",
              "skipped"
            ],
            "example": "warning",
            "description": "Severity of the failing validation (error, warning, skipped)"
          },
          "message": {
            "type": "string",
            "description": "Messages about why the validation failed",
            "example": "Missing prerequisites: broker.email"
          }
        }
      },
      "Validations": {
        "description": "Which extracted fields failed validation rules you write in the Sensible app",
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/Validation"
        },
        "example": [
          {
            "description": "Policy number must be 11 digits",
            "severity": "error"
          },
          {
            "description": "Company email must be in format string@string",
            "severity": "skipped",
            "message": "Missing prerequisites - company_email"
          }
        ]
      },
      "ValidationsSummary": {
        "type": "object",
        "description": "Summary of the extracted fields that fail validation rules you write in the Sensible app.",
        "properties": {
          "fields": {
            "type": "integer",
            "description": "Number of fields specified in the SenseML config to extract from the document",
            "example": 6
          },
          "fields_present": {
            "type": "integer",
            "description": "Actual number of non-null fields extracted from the document",
            "example": 4
          },
          "errors": {
            "type": "number",
            "description": "Number of validation errors in the extraction",
            "example": 0
          },
          "warnings": {
            "type": "number",
            "description": "Number of validation warnings in the extraction",
            "example": 1
          },
          "skipped": {
            "type": "integer",
            "description": "Number of fields skipped in the extraction because a prerequisite field was null",
            "example": 1
          }
        }
      },
      "Errors": {
        "type": "array",
        "description": "Extraction error messages.",
        "items": {
          "$ref": "#/components/schemas/ExtractionError"
        }
      },
      "ExtractionError": {
        "type": "object",
        "description": "Extraction error message",
        "properties": {
          "field_id": {
            "type": "string",
            "description": "ID of the extracted field.",
            "example": "phone_number"
          },
          "message": {
            "type": "string",
            "description": "Description of the error",
            "example": "ConfigurationError: width <=0"
          },
          "type": {
            "type": "string",
            "description": "Error type",
            "example": "configuration"
          }
        }
      },
      "ExtractionId": {
        "type": "string",
        "format": "uuid",
        "description": "Unique ID for the extraction, used to retrieve the extraction",
        "example": "246a6f60-0e5b-11eb-b720-295a6fba723e"
      },
      "ExtractionCreated": {
        "type": "string",
        "format": "date-time",
        "example": "2022-10-31T16:27:53.433",
        "description": "Date and time Sensible created the initial empty extraction and set its status to WAITING."
      },
      "ExtractionCompleted": {
        "type": "string",
        "format": "date-time",
        "example": "2022-10-31T16:27:53.741Z",
        "description": "Date and time Sensible set the extraction's status to COMPLETED"
      },
      "ExtractionUploaded": {
        "type": "string",
        "format": "date-time",
        "example": "2022-10-31T16:27:53.601Z",
        "description": "Date and time Sensible received and stored the document, prior to setting the extraction's status to PROCESSING."
      },
      "ExtractionProcessingStarted": {
        "type": "string",
        "format": "date-time",
        "example": "2022-10-31T16:27:53.615Z",
        "description": "Date and time Sensible set the extraction's status to PROCESSING and began extracting data from the document."
      },
      "ExtractionErrorMessage": {
        "type": "string",
        "example": "Transferring the file failed with 'Response code 404:\\nNot Found'",
        "description": "If `status` is `FAILED`, the message describing why the extraction failed. Absent otherwise. This describes a failure of the extraction as a whole; for errors about individual extracted fields, see `errors`."
      },
      "ExtractionStatus": {
        "type": "string",
        "description": "Status of the extraction:\n- WAITING: Sensible created an initial empty extraction and is waiting for the document.\n- PROCESSING: Sensible received the document and is extracting data.\n- FAILED: The extraction failed.\n- COMPLETE: The extraction is complete.\n",
        "enum": [
          "WAITING",
          "PROCESSING",
          "COMPLETE",
          "FAILED"
        ],
        "example": "COMPLETE"
      },
      "DocumentTypeNames": {
        "type": "array",
        "description": "Specifies the document types contained in the PDF portfolio.",
        "example": [
          "tax_returns",
          "bank_statements",
          "credit_reports"
        ],
        "items": {
          "type": "string"
        }
      },
      "SegmentDocumentsWith": {
        "type": "string",
        "enum": [
          "llm",
          "fingerprints"
        ],
        "default": "fingerprints",
        "example": "llm",
        "description": "Specifies how to segment the page ranges of the documents in the portfolio. For more information, see [Multi-document extraction](https://docs.sensible.so/docs/portfolio)."
      }
    }
  }
}
```