---
title: "Bulk create or update receipts"
method: POST
path: "/receipts/bulk"
tags: ["receipts"]
---

# Bulk create or update receipts

`POST /receipts/bulk`

Creates or updates multiple receipts in a single request. Maximum 100 receipts and 1000 total line items per request. Processing is always asynchronous via Celery and returns a batch tracking ID for polling progress.

## Headers

- `Authorization` string, required
- `X-Api-Key` string, required
- `X-API-Version` string
- `Idempotency-Key` string

## Request body

- ReceiptBulkUpsertRequest
  - `ottimate_company_id` integer, required — Company ID for all receipts in this batch
  - `receipts` ReceiptBulkUpsertRequestReceiptsItems[], required — Max 100 receipts with max 1000 total items
    - `ottimate_po_id` string — Ottimate-assigned PO ID. Required unless using PO lookup fields.
    - `ottimate_location_id` integer — Location (restaurant) ID for PO lookup. Required when using lookup fields instead of ottimate_po_id.
    - `erp_vendor_id` string — ERP vendor ID for PO lookup.
    - `po_number` string — PO number for lookup.
    - `po_external_id` string — External ID (dd_unique_key) of the PO for lookup. Alternative to po_number.
    - `external_id` string
    - `receipt_number` string, required
    - `date` string, date, required
    - `total_amount` number, double, required
    - `invoice_number_ref` string — Invoice reference number
    - `note` string
    - `items` ReceiptBulkUpsertRequestReceiptsItemsItemsItems[], required
      - `external_id` string
      - `ottimate_po_item_id` string — Ottimate-assigned PO item ID. Required unless po_external_item_id or sku is provided.
      - `po_external_item_id` string — External ID (dd_unique_key) of the PO item — used for lookup when ottimate_po_item_id is not provided.
      - `sku` string — SKU of the PO item — used for lookup when ottimate_po_item_id and po_external_item_id are not provided. Must match exactly one item on the PO.
      - `quantity` number, double, required
      - `price` number, double
      - `uom` string

## Response `202`

Asynchronous processing started. Poll batch_url for progress.

- ReceiptBulkUpsertAsyncResponse
  - `version` string
  - `status` 'processing', required
  - `batch_id` string, required
  - `batch_url` string
  - `results_url` string
  - `summary` ReceiptBulkUpsertAsyncResponseSummary
    - `count` integer
    - `total_items` integer

## Other responses

- `400` — Bad request - Invalid parameters or request format
- `403` — Forbidden - Access denied or insufficient permissions

---

[API](https://skmtc.dev/ottimate/apis/api-reference.md) · [All operations](https://skmtc.dev/ottimate/apis/api-reference/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/ottimate/api-reference/revisions/ba91ff4c6969/schema)
