ExtractionStatusResponse

The status response, one shape per `status`.

FinanceArtificial IntelligenceData ExtractionInvoicingAutomation
View JSON Schema on GitHub

JSON Schema

invoicedataextraction-com-extraction-status-response-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/invoicedataextraction-com/json-schema/invoicedataextraction-com-extraction-status-response-schema.json",
  "title": "ExtractionStatusResponse",
  "description": "The status response, one shape per `status`.",
  "x-generated": "2026-11-12",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/invoicedataextraction-com-openapi.json#/components/schemas/ExtractionStatusResponse",
  "oneOf": [
    {
      "$ref": "#/$defs/ExtractionProcessing"
    },
    {
      "$ref": "#/$defs/ExtractionInputRequired"
    },
    {
      "$ref": "#/$defs/ExtractionCompleted"
    },
    {
      "$ref": "#/$defs/ExtractionFailed"
    },
    {
      "$ref": "#/$defs/ExtractionCancelled"
    }
  ],
  "$defs": {
    "CancellationReason": {
      "type": "string",
      "enum": [
        "user",
        "unanswered",
        "answers_rejected"
      ],
      "description": "`user`: cancelled from the dashboard or with `cancelExtraction`. `unanswered`: a question was not answered by `answer_by`. `answers_rejected`: three answers were refused."
    },
    "ExtractionCancelled": {
      "type": "object",
      "description": "No output is produced; `credits_deducted` covers the work done before the extraction stopped.",
      "required": [
        "success",
        "status",
        "extraction_id",
        "credits_deducted",
        "cancellation_reason",
        "credits_balance",
        "credits_reserved"
      ],
      "properties": {
        "success": {
          "type": "boolean",
          "const": true
        },
        "status": {
          "type": "string",
          "const": "cancelled"
        },
        "extraction_id": {
          "type": "string",
          "format": "uuid"
        },
        "credits_deducted": {
          "type": [
            "integer",
            "null"
          ]
        },
        "cancellation_reason": {
          "$ref": "#/$defs/CancellationReason"
        },
        "credits_balance": {
          "type": "integer"
        },
        "credits_reserved": {
          "type": "integer"
        }
      }
    },
    "ExtractionCompleted": {
      "type": "object",
      "required": [
        "success",
        "status",
        "extraction_id",
        "credits_deducted",
        "credits_balance",
        "credits_reserved",
        "output_structure",
        "output_expires_at",
        "pages",
        "ai_uncertainty_notes",
        "review_needed",
        "output"
      ],
      "properties": {
        "success": {
          "type": "boolean",
          "const": true
        },
        "status": {
          "type": "string",
          "const": "completed"
        },
        "extraction_id": {
          "type": "string",
          "format": "uuid"
        },
        "credits_deducted": {
          "type": [
            "integer",
            "null"
          ],
          "description": "One credit per successfully processed page."
        },
        "credits_balance": {
          "type": "integer",
          "description": "The account's total balance after this extraction was charged."
        },
        "credits_reserved": {
          "type": "integer",
          "description": "Credits held by extractions still in progress; usable balance is `credits_balance` minus this."
        },
        "output_structure": {
          "type": "string",
          "enum": [
            "per_invoice",
            "per_line_item"
          ],
          "description": "The resolved structure, also when `automatic` was submitted."
        },
        "output_expires_at": {
          "type": "string",
          "format": "date-time",
          "description": "90 days after submission; after it the output URLs are `null` and the rows and files are gone."
        },
        "pages": {
          "$ref": "#/$defs/Pages"
        },
        "ai_uncertainty_notes": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/UncertaintyNote"
          }
        },
        "review_needed": {
          "$ref": "#/$defs/ReviewNeeded"
        },
        "output": {
          "$ref": "#/$defs/OutputUrls"
        }
      }
    },
    "ExtractionFailed": {
      "type": "object",
      "description": "HTTP 200 with `success: false`. Where the next step is to submit again, use a new `submission_id`.",
      "required": [
        "success",
        "status",
        "extraction_id",
        "error"
      ],
      "properties": {
        "success": {
          "type": "boolean",
          "const": false
        },
        "status": {
          "type": "string",
          "const": "failed"
        },
        "extraction_id": {
          "type": "string",
          "format": "uuid"
        },
        "error": {
          "$ref": "#/$defs/ExtractionFailureError"
        }
      }
    },
    "ExtractionFailureCode": {
      "type": "string",
      "description": "Why an extraction failed. Retryable codes may succeed when submitted again with a new\n`submission_id`: `CONCURRENT_TASK_LIMIT` (as many extractions running as the account allows, 15 by\ndefault and more on request, counting those started in the web app),\n`SUBMISSION_STALLED`, `INTERNAL_ERROR`. The\nothers need a change first: `INSUFFICIENT_CREDITS` (details: `credits_required`,\n`credits_balance`, `credits_reserved`), `FILE_PAGE_LIMIT_EXCEEDED` and `ENCRYPTED_FILE`\n(details: `file_names`), `NO_PAGES_FOUND`, `VALIDATION_FAILED`, `PROMPT_REJECTED`,\n`PROMPT_UNCLEAR`, `FILE_SIZE_LIMIT_EXCEEDED`, `PROCESSING_FILE_SIZE_LIMIT_EXCEEDED`.\n",
      "enum": [
        "INSUFFICIENT_CREDITS",
        "FILE_PAGE_LIMIT_EXCEEDED",
        "ENCRYPTED_FILE",
        "CONCURRENT_TASK_LIMIT",
        "NO_PAGES_FOUND",
        "VALIDATION_FAILED",
        "PROMPT_REJECTED",
        "PROMPT_UNCLEAR",
        "FILE_SIZE_LIMIT_EXCEEDED",
        "PROCESSING_FILE_SIZE_LIMIT_EXCEEDED",
        "SUBMISSION_STALLED",
        "INTERNAL_ERROR"
      ]
    },
    "ExtractionFailureError": {
      "type": "object",
      "required": [
        "code",
        "message",
        "retryable",
        "details"
      ],
      "properties": {
        "code": {
          "$ref": "#/$defs/ExtractionFailureCode"
        },
        "message": {
          "type": "string"
        },
        "retryable": {
          "type": "boolean"
        },
        "details": {
          "oneOf": [
            {
              "type": "object",
              "additionalProperties": true
            },
            {
              "type": "null"
            }
          ]
        }
      }
    },
    "ExtractionInputRequired": {
      "type": "object",
      "description": "The extraction stopped to ask. Questions appear the moment they exist, and every open question of the extraction is listed together. If the questions are not all answered within about four minutes, the extraction pauses and waits, and the account owner is emailed that a task is waiting for an answer, with a second email before the deadline. If the questions are not all answered by `answer_by`, which is 40 hours after the files were uploaded, the extraction is cancelled with `cancellation_reason: unanswered` and the work done so far is charged. The extraction continues the moment every open question has an answer.",
      "required": [
        "success",
        "status",
        "extraction_id",
        "progress",
        "answer_by",
        "questions"
      ],
      "properties": {
        "success": {
          "type": "boolean",
          "const": true
        },
        "status": {
          "type": "string",
          "const": "input_required"
        },
        "extraction_id": {
          "type": "string",
          "format": "uuid"
        },
        "progress": {
          "type": "integer"
        },
        "answer_by": {
          "type": "string",
          "format": "date-time"
        },
        "questions": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Question"
          }
        }
      }
    },
    "ExtractionProcessing": {
      "type": "object",
      "required": [
        "success",
        "status",
        "extraction_id",
        "progress"
      ],
      "properties": {
        "success": {
          "type": "boolean",
          "const": true
        },
        "status": {
          "type": "string",
          "const": "processing"
        },
        "extraction_id": {
          "type": "string",
          "format": "uuid"
        },
        "progress": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100
        }
      }
    },
    "OutputUrls": {
      "type": "object",
      "required": [
        "xlsx_url",
        "csv_url",
        "json_url"
      ],
      "properties": {
        "xlsx_url": {
          "type": [
            "string",
            "null"
          ],
          "format": "uri"
        },
        "csv_url": {
          "type": [
            "string",
            "null"
          ],
          "format": "uri"
        },
        "json_url": {
          "type": [
            "string",
            "null"
          ],
          "format": "uri"
        }
      },
      "description": "Signed URLs valid for 5 minutes; `null` when a format was not generated or the output has expired."
    },
    "PageFailureReason": {
      "type": "object",
      "required": [
        "code",
        "message",
        "affected_pages"
      ],
      "properties": {
        "code": {
          "type": "string"
        },
        "message": {
          "type": "string"
        },
        "affected_pages": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "file_name",
              "pages"
            ],
            "properties": {
              "file_name": {
                "type": "string"
              },
              "pages": {
                "type": "array",
                "items": {
                  "type": "integer"
                }
              }
            }
          }
        }
      }
    },
    "PageReference": {
      "type": "object",
      "required": [
        "file_name",
        "page"
      ],
      "properties": {
        "file_name": {
          "type": "string"
        },
        "page": {
          "type": "integer"
        }
      }
    },
    "Pages": {
      "type": "object",
      "description": "Which pages were processed and which failed; data from failed pages is missing from the output.",
      "required": [
        "successful_count",
        "failed_count",
        "successful",
        "failed",
        "failure_reasons"
      ],
      "properties": {
        "successful_count": {
          "type": "integer"
        },
        "failed_count": {
          "type": "integer"
        },
        "successful": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/PageReference"
          }
        },
        "failed": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/PageReference"
          }
        },
        "failure_reasons": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/PageFailureReason"
          }
        }
      }
    },
    "Question": {
      "type": "object",
      "required": [
        "question_id",
        "type",
        "question",
        "scope",
        "choices"
      ],
      "properties": {
        "question_id": {
          "type": "string",
          "description": "Use it when answering."
        },
        "type": {
          "type": "string",
          "enum": [
            "single_choice",
            "free_text"
          ],
          "description": "`single_choice` offers `choices`; answer with one, with words added if you like. `free_text` wants your own words, or the recommended approach. Words are accepted on every question, so an unrecognised type can still be answered with `text`."
        },
        "question": {
          "type": "string"
        },
        "example_from_documents": {
          "type": "string",
          "description": "A real instance from the documents that the answer would change."
        },
        "scope": {
          "$ref": "#/$defs/QuestionScope"
        },
        "choices": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/QuestionChoice"
          },
          "description": "Empty for `free_text`."
        },
        "recommended_approach": {
          "type": "string",
          "description": "On a `free_text` question, what the extraction does if you accept the recommendation."
        },
        "previous_answer_rejected": {
          "type": "boolean",
          "const": true,
          "description": "Present when an earlier answer to this question was refused. Answer differently."
        }
      }
    },
    "QuestionChoice": {
      "type": "object",
      "required": [
        "choice_id",
        "label"
      ],
      "properties": {
        "choice_id": {
          "type": "string",
          "description": "A letter, `a` onwards."
        },
        "label": {
          "type": "string"
        },
        "cell_would_contain": {
          "type": "string",
          "description": "The value this choice would put in the cell for the example, when known."
        },
        "recommended": {
          "type": "boolean",
          "const": true,
          "description": "Present on the one choice the extraction recommends."
        }
      }
    },
    "QuestionScope": {
      "type": "object",
      "required": [
        "level",
        "applies_to"
      ],
      "properties": {
        "level": {
          "type": "string",
          "description": "What the answer governs. `extraction` is the only value today: every document in the extraction, not only the one in the example. Treat a value you do not recognise as narrower than the extraction and read `applies_to`.",
          "enum": [
            "extraction"
          ]
        },
        "applies_to": {
          "type": "string",
          "description": "The scope in words, for whoever is answering."
        }
      }
    },
    "ReviewNeeded": {
      "type": "object",
      "description": "Rows that need a human's check before the data is relied on. Check `count` first.",
      "required": [
        "count",
        "items"
      ],
      "properties": {
        "count": {
          "type": "integer"
        },
        "items": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/ReviewNeededItem"
          }
        }
      }
    },
    "ReviewNeededItem": {
      "type": "object",
      "required": [
        "message",
        "affected_fields",
        "output_row_numbers",
        "source_references"
      ],
      "properties": {
        "message": {
          "type": "string"
        },
        "affected_fields": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Empty when the concern is about the row or document rather than particular fields."
        },
        "output_row_numbers": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "description": "1-based data row numbers, not counting the header row."
        },
        "source_references": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "UncertaintyNote": {
      "type": "object",
      "description": "A prompt note, an assumption made where the prompt left room for interpretation, with prompt text that would settle it next time.",
      "required": [
        "topic",
        "description",
        "suggested_prompt_additions"
      ],
      "properties": {
        "topic": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "suggested_prompt_additions": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "purpose",
              "instructions"
            ],
            "properties": {
              "purpose": {
                "type": "string"
              },
              "instructions": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/invoicedataextraction-com-extraction-status-response"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.