---
title: "Get Invoices"
method: GET
path: "/v2/invoices"
tags: ["invoices"]
---

# Get Invoices

`GET /v2/invoices`

## Request

- Base URL: `https://api.stuut.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.stuut.ai/v2/invoices`
- Auth: HTTP bearer

List Invoices

Retrieve a paginated list of invoices with filtering and sorting.

## Query parameters

- `page` integer: Page number, 0 indexed.
- `limit` integer: Number of records per page.
- `sort_by` 'default' | 'due_date' | 'issued_at' | 'paid_at' | 'amount_due' | 'amount_remaining' | 'pending_amount_remaining' | 'total_amount' | 'number' | 'last_outreach_at' | 'promised_to_pay_date', nullable
- `sort_order` 'asc' | 'desc'
- `status__in` InvoiceVirtualStatus[], nullable: Filter by invoice status. Includes virtual statuses: 'processing' (open with payment), 'partially_paid', 'overdue' (open and past due), 'promised' (open with an upcoming or current promise-to-pay date), 'broken_promise' (open with a promise-to-pay date that has passed).
- `partner_id` string, nullable: Filter by partner ID
- `assignee_id` string, nullable: Filter by assignee ID
- `number__in` string[], nullable: Filter by invoice numbers
- `amount_remaining_lte` union
  - number
  - string, decimal
- `amount_remaining_gte` union
  - number
  - string, decimal
- `in_dispute` boolean: Filter by whether invoice is in dispute
- `due_date__eq` string, date, nullable: Due date exactly on
- `due_date__gte` string, date, nullable: Due date on or after
- `due_date__lte` string, date, nullable: Due date on or before
- `issued_at__eq` string, date, nullable: Issued at exactly on
- `issued_at__gte` string, date-time, nullable: Issued at on or after
- `issued_at__lte` string, date-time, nullable: Issued at on or before
- `promised_to_pay_date__eq` string, date, nullable: Promised to pay exactly on
- `promised_to_pay_date__lte` string, date-time, nullable: Promised to pay on or before
- `promised_to_pay_date__gte` string, date-time, nullable: Promised to pay on or after
- `search` string, nullable: Search in invoice number, partner name, account number, PO number, order number
- `business_unit_id__in` string[], nullable: Filter by business unit IDs (via partner)
- `has_outreach` boolean: Filter by whether invoice has had outreach
- `customer_outreach_paused` boolean: Filter by whether customer outreach is paused
- `currency__in` Currency[], nullable: Filter by currency codes (ISO 4217, e.g., ['usd', 'eur'])
- `ap_portal_status__in` APPortalInvoiceStatus[], nullable: Filter by AP portal status (lowercase wire values, e.g. ['submitted', 'approved']). 'not_submitted' also matches invoices whose PO is swept on the partner's portal account but have no portal invoice row. Untracked invoices are excluded when set.
- `custom_fields` string, nullable

## Response `200`

Successful Response

- PaginatedResponseInvoiceListSchema
  - `data` InvoiceListSchema[], required: The list of records.
    - `created_at` string, date-time, required
    - `modified_at` string, date-time, nullable, required
    - `id` string, required
    - `number` string, nullable, required: A unique, identifying string that appears on emails sent to the customer for this invoice.
    - `currency` 'ADP' | 'AED' | 'AFA' | 'AFN' | 'ALK' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'AOK' | 'AON' | 'AOR' | 'ARA' | 'ARL' | 'ARM' | 'ARP' | 'ARS' | 'ATS' | 'AUD' | 'AWG' | 'AZM' | 'AZN' | 'BAD' | 'BAM' | 'BAN' | 'BBD' | 'BDT' | 'BEC' | 'BEF' | 'BEL' | 'BGL' | 'BGM' | 'BGN' | 'BGO' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BOL' | 'BOP' | 'BOV' | 'BRB' | 'BRC' | 'BRE' | 'BRL' | 'BRN' | 'BRR' | 'BRZ' | 'BSD' | 'BTN' | 'BUK' | 'BWP' | 'BYB' | 'BYN' | 'BYR' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CHW' | 'CLE' | 'CLF' | 'CLP' | 'CNH' | 'CNX' | 'CNY' | 'COP' | 'COU' | 'CRC' | 'CSD' | 'CSK' | 'CUC' | 'CUP' | 'CVE' | 'CYP' | 'CZK' | 'DDM' | 'DEM' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'ECS' | 'ECV' | 'EEK' | 'EGP' | 'ERN' | 'ESA' | 'ESB' | 'ESP' | 'ETB' | 'EUR' | 'FIM' | 'FJD' | 'FKP' | 'FRF' | 'GBP' | 'GEK' | 'GEL' | 'GHC' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GNS' | 'GQE' | 'GRD' | 'GTQ' | 'GWE' | 'GWP' | 'GYD' | 'HKD' | 'HNL' | 'HRD' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'IEP' | 'ILP' | 'ILR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISJ' | 'ISK' | 'ITL' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRH' | 'KRO' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LTL' | 'LTT' | 'LUC' | 'LUF' | 'LUL' | 'LVL' | 'LVR' | 'LYD' | 'MAD' | 'MAF' | 'MCF' | 'MDC' | 'MDL' | 'MGA' | 'MGF' | 'MKD' | 'MKN' | 'MLF' | 'MMK' | 'MNT' | 'MOP' | 'MRO' | 'MRU' | 'MTL' | 'MTP' | 'MUR' | 'MVP' | 'MVR' | 'MWK' | 'MXN' | 'MXP' | 'MXV' | 'MYR' | 'MZE' | 'MZM' | 'MZN' | 'NAD' | 'NGN' | 'NIC' | 'NIO' | 'NLG' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'PAB' | 'PEI' | 'PEN' | 'PES' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PLZ' | 'PTE' | 'PYG' | 'QAR' | 'RHD' | 'ROL' | 'RON' | 'RSD' | 'RUB' | 'RUR' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDD' | 'SDG' | 'SDP' | 'SEK' | 'SGD' | 'SHP' | 'SIT' | 'SKK' | 'SLE' | 'SLL' | 'SOS' | 'SRD' | 'SRG' | 'SSP' | 'STD' | 'STN' | 'SUR' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJR' | 'TJS' | 'TMM' | 'TMT' | 'TND' | 'TOP' | 'TPE' | 'TRL' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UAK' | 'UGS' | 'UGX' | 'USD' | 'USN' | 'USS' | 'UYI' | 'UYP' | 'UYU' | 'UYW' | 'UZS' | 'VEB' | 'VED' | 'VEF' | 'VES' | 'VND' | 'VNN' | 'VUV' | 'WST' | 'XAF' | 'XAG' | 'XAU' | 'XBA' | 'XBB' | 'XBC' | 'XBD' | 'XCD' | 'XCG' | 'XDR' | 'XEU' | 'XFO' | 'XFU' | 'XOF' | 'XPD' | 'XPF' | 'XPT' | 'XRE' | 'XSU' | 'XTS' | 'XUA' | 'XXX' | 'YDD' | 'YER' | 'YUD' | 'YUM' | 'YUN' | 'YUR' | 'ZAL' | 'ZAR' | 'ZMK' | 'ZMW' | 'ZRN' | 'ZRZ' | 'ZWD' | 'ZWL' | 'ZWR', required: The 3 character [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code.
    - `amount_due` string, decimal, required: The total amount due on the invoice.
    - `amount_paid` string, decimal, required: The total amount paid on the invoice.
    - `amount_remaining` string, decimal, required: The remaining balance on the invoice, excluding unposted payments.
    - `pending_amount_remaining` string, decimal, required: The remaining balance on the invoice, including unposted payments.
    - `total_amount` string, decimal, required: The total amount on the invoice.
    - `due_date` string, date-time, nullable, required: The invoice's due date.
    - `issued_at` string, date-time, nullable, required: The invoice's issue date.
    - `paid_at` string, date-time, nullable, required: The date the invoice was paid.
    - `promised_to_pay_date` string, date, nullable, required: The date the customer has promised to pay the invoice.
    - `current_payment_promise_id` string, nullable, required
    - `remote_created_at` string, date-time, nullable, required: When the third party's entry was created.
    - `purchase_order_number` string, nullable, required: Unique identifier assigned to a purchase order by a buyer.
    - `order_number` string, nullable, required: Unique identifier assigned to a purchase by a seller.
    - `pdf` string, nullable, required
    - `pdf_id` string, nullable, required
    - `remote_invoice_pdf` string, nullable, required: The url to the invoice's third party pdf.
    - `partner` PartnerSummary, required
      - `created_at` string, date-time, required
      - `modified_at` string, date-time, required
      - `id` string, required
      - `account_number` string, nullable, required: The customer's account number.
      - `assignee_id` string, nullable, required: The ID of the user assigned to this partner, if any.
      - `business_unit_id` string, nullable, required: The business unit this partner belongs to.
      - `currency` 'ADP' | 'AED' | 'AFA' | 'AFN' | 'ALK' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'AOK' | 'AON' | 'AOR' | 'ARA' | 'ARL' | 'ARM' | 'ARP' | 'ARS' | 'ATS' | 'AUD' | 'AWG' | 'AZM' | 'AZN' | 'BAD' | 'BAM' | 'BAN' | 'BBD' | 'BDT' | 'BEC' | 'BEF' | 'BEL' | 'BGL' | 'BGM' | 'BGN' | 'BGO' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BOL' | 'BOP' | 'BOV' | 'BRB' | 'BRC' | 'BRE' | 'BRL' | 'BRN' | 'BRR' | 'BRZ' | 'BSD' | 'BTN' | 'BUK' | 'BWP' | 'BYB' | 'BYN' | 'BYR' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CHW' | 'CLE' | 'CLF' | 'CLP' | 'CNH' | 'CNX' | 'CNY' | 'COP' | 'COU' | 'CRC' | 'CSD' | 'CSK' | 'CUC' | 'CUP' | 'CVE' | 'CYP' | 'CZK' | 'DDM' | 'DEM' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'ECS' | 'ECV' | 'EEK' | 'EGP' | 'ERN' | 'ESA' | 'ESB' | 'ESP' | 'ETB' | 'EUR' | 'FIM' | 'FJD' | 'FKP' | 'FRF' | 'GBP' | 'GEK' | 'GEL' | 'GHC' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GNS' | 'GQE' | 'GRD' | 'GTQ' | 'GWE' | 'GWP' | 'GYD' | 'HKD' | 'HNL' | 'HRD' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'IEP' | 'ILP' | 'ILR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISJ' | 'ISK' | 'ITL' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRH' | 'KRO' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LTL' | 'LTT' | 'LUC' | 'LUF' | 'LUL' | 'LVL' | 'LVR' | 'LYD' | 'MAD' | 'MAF' | 'MCF' | 'MDC' | 'MDL' | 'MGA' | 'MGF' | 'MKD' | 'MKN' | 'MLF' | 'MMK' | 'MNT' | 'MOP' | 'MRO' | 'MRU' | 'MTL' | 'MTP' | 'MUR' | 'MVP' | 'MVR' | 'MWK' | 'MXN' | 'MXP' | 'MXV' | 'MYR' | 'MZE' | 'MZM' | 'MZN' | 'NAD' | 'NGN' | 'NIC' | 'NIO' | 'NLG' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'PAB' | 'PEI' | 'PEN' | 'PES' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PLZ' | 'PTE' | 'PYG' | 'QAR' | 'RHD' | 'ROL' | 'RON' | 'RSD' | 'RUB' | 'RUR' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDD' | 'SDG' | 'SDP' | 'SEK' | 'SGD' | 'SHP' | 'SIT' | 'SKK' | 'SLE' | 'SLL' | 'SOS' | 'SRD' | 'SRG' | 'SSP' | 'STD' | 'STN' | 'SUR' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJR' | 'TJS' | 'TMM' | 'TMT' | 'TND' | 'TOP' | 'TPE' | 'TRL' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UAK' | 'UGS' | 'UGX' | 'USD' | 'USN' | 'USS' | 'UYI' | 'UYP' | 'UYU' | 'UYW' | 'UZS' | 'VEB' | 'VED' | 'VEF' | 'VES' | 'VND' | 'VNN' | 'VUV' | 'WST' | 'XAF' | 'XAG' | 'XAU' | 'XBA' | 'XBB' | 'XBC' | 'XBD' | 'XCD' | 'XCG' | 'XDR' | 'XEU' | 'XFO' | 'XFU' | 'XOF' | 'XPD' | 'XPF' | 'XPT' | 'XRE' | 'XSU' | 'XTS' | 'XUA' | 'XXX' | 'YDD' | 'YER' | 'YUD' | 'YUM' | 'YUN' | 'YUR' | 'ZAL' | 'ZAR' | 'ZMK' | 'ZMW' | 'ZRN' | 'ZRZ' | 'ZWD' | 'ZWL' | 'ZWR', required: The 3 character [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code.
      - `email` string, nullable, required: The partner's company email address.
      - `name` string, nullable, required: The full name of the partner.
      - `legal_name` string, nullable, required: The legal name of this partner, typically applies to businesses.
      - `phone` string, phone, nullable, required: A phone number in [E.164](https://en.wikipedia.org/wiki/E.164) format
      - `parent_id` string, nullable, required
      - `remote_id` string, required: The partner's third party id.
      - `object` string, required: String representing the object's type. Objects of the same type share the same value.
    - `last_outreach_at` string, date-time, required
    - `last_outreach_to` string, nullable, required: The last recipient of outreach that was sent for this invoice (email address or phone number).
    - `last_outreach_channel` 'email' | 'call' | 'sms', required
    - `latest_note` string, nullable, required: Content of the most recently created invoice note.
    - `in_dispute` boolean, required: Whether an invoice is in dispute. If it is, we exclude it from any outreach.
    - `remote_payment_status` 'processing' | 'completed', required
    - `unresolved_dispute_item_status` 'proposed' | 'in_process' | 'needs_review' | 'resolved' | 'closed', required: Status of a dispute in the resolution workflow.
    - `unresolved_dispute_id` string, nullable, required
    - `ap_portal_status` APPortalStatusSummary, required: What the buyer's AP portal says about this invoice (list column + detail page). From the swept portal invoice matched to it — or, when only the invoice's PO shows up in the portal, NOT_SUBMITTED plus that PO's context. `submit_gate` is the separate "can we submit this now?" axis (pre-flight on PO / field-mapping); the UI composes lifecycle + gate into one badge. `submit_gate_reason` is a human-readable detail when the gate is not OK.
      - `status` 'not_submitted' | 'submitting' | 'submitted' | 'approved' | 'scheduled' | 'paid' | 'rejected' | 'disputed' | 'on_hold' | 'cancelled' | 'unknown', required: Canonical, MECE invoice status normalized across portals — the dashboard's at-a-glance state. Derived from the raw portal status (preferred) with the coarse ``SubmissionState`` as fallback (see stuut.core.ap_portal.normalize). Portal facts only: submit pre-flight results live on the separate ``submit_gate`` axis.
      - `reject_reason` 'po_mismatch' | 'missing_required_field' | 'invalid_tax' | 'duplicate_invoice' | 'unknown_customer' | 'invalid_date' | 'transmission_failed' | 'not_stated' | 'other' | 'po_line_mismatch' | 'receipt_pending' | 'disallowed_charge' | 'invoice_data_error' | 'prerequisite_document' | 'wrong_channel' | 'po_closed', required: Closed reject taxonomy — remediation routes by code, not string-match. Buckets group rejections by what fixes them: missing fields/attachments into ``MISSING_REQUIRED_FIELD``; tax errors and missing tax docs into ``INVALID_TAX``.
      - `reject_reason_text` string, nullable, required: The portal's own wording for the rejection. The typed code routes remediation; this says what has to be fixed, and is the only detail left when the code is OTHER.
      - `po` APPortalPOSummary, required: The portal PO the invoice bills against: lifecycle, budget, and creation status.
        - `number` string, required
        - `state` 'open' | 'on_hold' | 'changed' | 'invoiced' | 'closed' | 'cancelled' | 'not_found' | 'unknown', required: Normalized purchase-order lifecycle from a sweep. Invoice creation is a separate fact (``can_create_invoice``), not answered by these labels: OPEN (active), ON_HOLD (buyer reviewing), CHANGED (superseded — re-fetch the new PO), INVOICED (fully billed), CLOSED / CANCELLED (terminal), NOT_FOUND (referenced but not located in the portal), UNKNOWN (unrecognized provider status). The "PO running low" headroom signal is derived from amounts, not from a status.
        - `can_create_invoice` boolean, nullable, required: Whether the portal's Create Invoice action was enabled on the last PO detail read; null when that action was not observed.
        - `invoice_creation_blocked_reason` string, nullable, required: The portal's wording for a disabled Create Invoice action, when present.
        - `headroom` string, decimal, nullable, required: Remaining PO budget in the PO's own currency (`currency`), standard units; null until both typed totals have been swept.
        - `currency` 'ADP' | 'AED' | 'AFA' | 'AFN' | 'ALK' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'AOK' | 'AON' | 'AOR' | 'ARA' | 'ARL' | 'ARM' | 'ARP' | 'ARS' | 'ATS' | 'AUD' | 'AWG' | 'AZM' | 'AZN' | 'BAD' | 'BAM' | 'BAN' | 'BBD' | 'BDT' | 'BEC' | 'BEF' | 'BEL' | 'BGL' | 'BGM' | 'BGN' | 'BGO' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BOL' | 'BOP' | 'BOV' | 'BRB' | 'BRC' | 'BRE' | 'BRL' | 'BRN' | 'BRR' | 'BRZ' | 'BSD' | 'BTN' | 'BUK' | 'BWP' | 'BYB' | 'BYN' | 'BYR' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CHW' | 'CLE' | 'CLF' | 'CLP' | 'CNH' | 'CNX' | 'CNY' | 'COP' | 'COU' | 'CRC' | 'CSD' | 'CSK' | 'CUC' | 'CUP' | 'CVE' | 'CYP' | 'CZK' | 'DDM' | 'DEM' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'ECS' | 'ECV' | 'EEK' | 'EGP' | 'ERN' | 'ESA' | 'ESB' | 'ESP' | 'ETB' | 'EUR' | 'FIM' | 'FJD' | 'FKP' | 'FRF' | 'GBP' | 'GEK' | 'GEL' | 'GHC' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GNS' | 'GQE' | 'GRD' | 'GTQ' | 'GWE' | 'GWP' | 'GYD' | 'HKD' | 'HNL' | 'HRD' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'IEP' | 'ILP' | 'ILR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISJ' | 'ISK' | 'ITL' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRH' | 'KRO' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LTL' | 'LTT' | 'LUC' | 'LUF' | 'LUL' | 'LVL' | 'LVR' | 'LYD' | 'MAD' | 'MAF' | 'MCF' | 'MDC' | 'MDL' | 'MGA' | 'MGF' | 'MKD' | 'MKN' | 'MLF' | 'MMK' | 'MNT' | 'MOP' | 'MRO' | 'MRU' | 'MTL' | 'MTP' | 'MUR' | 'MVP' | 'MVR' | 'MWK' | 'MXN' | 'MXP' | 'MXV' | 'MYR' | 'MZE' | 'MZM' | 'MZN' | 'NAD' | 'NGN' | 'NIC' | 'NIO' | 'NLG' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'PAB' | 'PEI' | 'PEN' | 'PES' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PLZ' | 'PTE' | 'PYG' | 'QAR' | 'RHD' | 'ROL' | 'RON' | 'RSD' | 'RUB' | 'RUR' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDD' | 'SDG' | 'SDP' | 'SEK' | 'SGD' | 'SHP' | 'SIT' | 'SKK' | 'SLE' | 'SLL' | 'SOS' | 'SRD' | 'SRG' | 'SSP' | 'STD' | 'STN' | 'SUR' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJR' | 'TJS' | 'TMM' | 'TMT' | 'TND' | 'TOP' | 'TPE' | 'TRL' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UAK' | 'UGS' | 'UGX' | 'USD' | 'USN' | 'USS' | 'UYI' | 'UYP' | 'UYU' | 'UYW' | 'UZS' | 'VEB' | 'VED' | 'VEF' | 'VES' | 'VND' | 'VNN' | 'VUV' | 'WST' | 'XAF' | 'XAG' | 'XAU' | 'XBA' | 'XBB' | 'XBC' | 'XBD' | 'XCD' | 'XCG' | 'XDR' | 'XEU' | 'XFO' | 'XFU' | 'XOF' | 'XPD' | 'XPF' | 'XPT' | 'XRE' | 'XSU' | 'XTS' | 'XUA' | 'XXX' | 'YDD' | 'YER' | 'YUD' | 'YUM' | 'YUN' | 'YUR' | 'ZAL' | 'ZAR' | 'ZMK' | 'ZMW' | 'ZRN' | 'ZRZ' | 'ZWD' | 'ZWL' | 'ZWR', required: The 3 character [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code.
      - `portal_document_id` string, nullable, required: Portal-native deep-link handle: the invoice document, or the PO when NOT_SUBMITTED.
      - `provider` 'kehe' | 'taulia' | 'coupa' | 'ariba' | 'meijer' | 'kroger' | 'walgreens' | 'albertsons' | 'target' | 'heb' | 'heb_sidm' | 'c_and_s' | 'walmart' | 'walmart_highradius' | 'cvs' | 'cvs_sap' | 'cvs_image_silo' | 'kroger_supplier_connect' | 'kroger_claimtrax' | 'kroger_verigon' | 'servicetitan' | 'sandbox' | 'generic', required: Supported AP Portal providers.
      - `as_of` string, date-time, required
      - `status_since` string, date-time, required
      - `submit_gate` 'ok' | 'needs_review' | 'blocked', required: Submit pre-flight gate for one invoice — can we submit it right now? Computed from the field-mapping + PO/order checks (see ``stuut.core.ap_portal.preview``) and persisted so the dashboard can flag "needs a fix before submit" without re-running a preview. A separate axis from ``APPortalInvoiceStatus`` (what the portal reports about the invoice).
      - `submit_gate_reason` string, nullable, required
    - `object` string, required: String representing the object's type. Objects of the same type share the same value.
    - `virtual_status` 'draft' | 'open' | 'uncollectible' | 'paid' | 'void' | 'processing' | 'overdue' | 'partially_paid' | 'promised' | 'broken_promise', required
    - `days_overdue` integer, nullable, required: Number of days past due. Only set for overdue invoices.
    - `days_until_due` integer, nullable, required: Number of days until due. Only set for open invoices with a due date.
    - `payment_url` string, nullable, required: Payment portal URL for this invoice.
  - `current_page` integer, required: The current page.
  - `total_records` integer, nullable, required: Total number of records.
  - `next_page` integer, nullable, required: The next page number, if one exists.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/stuut/apis/stuut-api.md) - [All operations](https://skmtc.dev/stuut/apis/stuut-api/llms.txt) - [OpenAPI document](https://skmtc.dev/stuut/apis/stuut-api/revisions/ff0ad16a55ff?raw)
