# Expense

An `Expense` is a transaction or a purchased item that Sail classifies for Section 213(d) eligibility. This is the full field reference; see [Get Expense](/reference/expenses/get-users-user-id-expenses-expense-id) or [List Expenses](/reference/expenses/get-users-user-id-expenses) to retrieve one.

* `id` (string)
* `connection_id` (string): the connection this expense was sourced from.
* `external_transaction_id` (string, nullable): echo of the customer-supplied id for expenses ingested through an `external` connection, null for Sail-sourced expenses. Join key back to the customer's own transaction store.
* `name` (string)
* `description` (string)
* `date` (string)
* `amount` (number): USD.
* `source_type` (enum): how this expense entered Sail, pairs with the `source_type` list filter. Possible values: `card`, `store`, `receipt_upload`, `external`.
* `origin` (object): what the expense was derived from.
  * `type` (enum): `transaction`, derived from a bank or credit card transaction (one expense per transaction, split via `parent_expense_id` after itemization). `product`, derived from an individual product line (store order data or an itemized receipt). Possible values: `transaction`, `product`.
  * `detail` (string, nullable): the raw descriptor (transactions) or product title (products) the expense was derived from.
* `merchant` (object): the merchant this expense was incurred at, as resolved by enrichment. `supported_merchant_id` references the merchants directory only when the merchant is one Sail can connect to for store data, it's null for the long tail of merchants that are recognized but not scrape-supported.
  * `name` (string). Example: `Costco`.
  * `logo_url` (string, nullable)
  * `supported_merchant_id` (string, nullable). Example: `mer_costco`.
* `enrichment` (object): general transaction enrichment, independent of Section 213(d) classification.
  * `category` (string, nullable): general spend category. Example: `Pharmacies`.
  * `subcategory` (string, nullable). Example: `Drug Stores`.
  * `mcc` (string, nullable): merchant category code, when derived from a card transaction or supplied at ingest.
* `parent_expense_id` (string, nullable): links an item-level expense back to the transaction-level expense it enriched, whether that item-level data came from a store connection or from an itemized receipt. Null for top-level expenses.
* `section_213d_classification` (object): Section 213(d) eligibility classification. The review states pair with `origin.type`, `lmn_required` applies to product-origin expenses (a dual-purpose item that becomes eligible with a Letter of Medical Necessity), `itemization_required` applies to transaction-origin expenses (a mixed basket that needs an itemized receipt before line items can be classified).
  * `status` (enum). Possible values: `eligible`, `lmn_required`, `itemization_required`, `ineligible`.
  * `category` (string, nullable): Section 213(d) category. Example: `Health Monitoring Devices`.
  * `reasoning` (string, nullable)
* `created_at` (timestamp)
* `updated_at` (timestamp)

{/* PENDING: this page omits the top-level `status` field (enum: eligible, needs_review, ineligible, reimbursed, archived) that api/api-spec.yaml and object-creator/spec.yaml both still document. Per Jonah (Slack, 2026-08-18/19): Expense.status is being removed with nothing replacing it, and `archived` specifically "won't actually be present" regardless. Unconfirmed: whether this removal is already live as of the V0 deadline (2026-08-21) or still upcoming. If it's still live today, this page is wrong to omit it — flag to Danny/Jonah/Queen before shipping if that timing matters. Also fixed "adjudication" to "classification" in the `enrichment` and `section_213d_classification` descriptions, and expanded `parent_expense_id`'s description to cover both the store-connection and receipt-itemization paths (confirmed by Jonah, Slack 2026-08-18) rather than just itemization, matching the wording already used in Expense Classification and Transaction-Level and Item-Level Expenses. Source content generated by Gabriel's object-creator tool from api/api-spec.yaml; see supporting-materials/generated-html/getExpense/response.html for the unpatched original. */}