> ## Documentation Index
> Fetch the complete documentation index at: https://docs.arcuserp.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Receive inventory (non-PO) -- single or multi-item atomic

> ATOMIC-CREATE (2026-05-12): accepts items[] for multi-line atomic receipts OR
top-level product_id/quantity/unit_cost for single-item compat mode.
All items receive in one DB transaction; any failure rolls back all items.
Hard-blocks zero-cost (unit_cost must be > 0 per item).
GL: DR Inventory / CR GRNI via postInventoryReceived, fires per item in same transaction (Rule 21).
Connector: triggers async pushInventoryToMarketplaces (Shopify/Amazon/eBay).
For PO-linked receipts: POST /v1/purchase-orders/{id}/receive.
Response: {object:inventory_receive_result, items:[{balance,transaction}], summary} for items[]; single object for compat mode.




## OpenAPI

````yaml /openapi.yaml post /inventory/receive
openapi: 3.1.0
info:
  title: Arcus ERP Public API
  version: 1.0.0
  description: >
    Arcus ERP public REST API. Designed for external integrations and data
    migration.


    **Authentication.** Bearer token (API key) via the `Authorization` header.

    Format: `Authorization: Bearer ark_live_ent_<code>_<random>` (or
    `ark_test_*` for sandbox).

    API keys are issued per-entity in **Settings > Developers > API Keys**.


    **Entity scoping.** The entity is encoded in the API key prefix; routes are
    flat

    (e.g. `/v1/accounts`, `/v1/orders`, `/v1/products`). A small set of platform
    endpoints

    (migration, reconciliation, events, webhook endpoints, API keys) use the

    `/v1/entities/{entity_id}/...` form -- those are noted in their tags.


    **Key capabilities.**
      - Related-resource hydration via `?expand[]=` (see `x-arcus-expand` on each resource).
      - Cursor-based pagination (`starting_after` / `ending_before` / `limit`).
      - Idempotency via the `Idempotency-Key` header.
      - Webhook events for asynchronous notification.
      - Conditional requests / ETag for cache validation.
servers:
  - url: https://api.arcuserp.com/v1
    description: Arcus ERP API (accepts both live `ark_live_*` and test `ark_test_*` keys)
  - url: https://dev-api.arcuserp.com/v1
    description: >-
      Dev sandbox API (test-only data, accepts `ark_test_*` keys against dev
      RDS)
security: []
paths:
  /inventory/receive:
    post:
      tags:
        - Inventory
      summary: Receive inventory (non-PO) -- single or multi-item atomic
      description: >
        ATOMIC-CREATE (2026-05-12): accepts items[] for multi-line atomic
        receipts OR

        top-level product_id/quantity/unit_cost for single-item compat mode.

        All items receive in one DB transaction; any failure rolls back all
        items.

        Hard-blocks zero-cost (unit_cost must be > 0 per item).

        GL: DR Inventory / CR GRNI via postInventoryReceived, fires per item in
        same transaction (Rule 21).

        Connector: triggers async pushInventoryToMarketplaces
        (Shopify/Amazon/eBay).

        For PO-linked receipts: POST /v1/purchase-orders/{id}/receive.

        Response: {object:inventory_receive_result,
        items:[{balance,transaction}], summary} for items[]; single object for
        compat mode.
      operationId: postInventoryReceive
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              oneOf:
                - type: object
                  description: Multi-item atomic mode
                  required:
                    - location_id
                    - items
                  properties:
                    location_id:
                      type: string
                      format: uuid
                      description: Layer 4 -- required
                    notes:
                      type: string
                    items:
                      type: array
                      minItems: 1
                      items:
                        type: object
                        required:
                          - product_id
                          - quantity
                          - unit_cost
                        properties:
                          product_id:
                            type: string
                            format: uuid
                          quantity:
                            type: integer
                            minimum: 1
                          unit_cost:
                            type: number
                            description: Must be > 0
                          notes:
                            type: string
                - type: object
                  description: Single-item compat mode
                  required:
                    - product_id
                    - location_id
                    - quantity
                    - unit_cost
                  properties:
                    product_id:
                      type: string
                      format: uuid
                    location_id:
                      type: string
                      format: uuid
                      description: Layer 4 -- required
                    quantity:
                      type: integer
                      minimum: 1
                    unit_cost:
                      type: number
                      description: Required, must be > 0
                    notes:
                      type: string
            examples:
              multi_item:
                summary: Multi-item atomic receive (2 SKUs, one transaction)
                value:
                  location_id: 91aa7588-4dc7-4edd-b172-7de91f5e1f78
                  notes: Restocking run from supplier
                  items:
                    - product_id: 7f6f3e14-eaad-4c45-b922-209f6dc6d140
                      quantity: 10
                      unit_cost: 12.5
                      notes: Circuit Breaker 10A White
                    - product_id: ec9288c3-12b1-474f-bb09-b0b15bb7a8ff
                      quantity: 5
                      unit_cost: 8.75
                      notes: Square D Breaker Black
              single_item:
                summary: Single-item compat mode
                value:
                  product_id: 7f6f3e14-eaad-4c45-b922-209f6dc6d140
                  location_id: 91aa7588-4dc7-4edd-b172-7de91f5e1f78
                  quantity: 25
                  unit_cost: 12.5
                  notes: Emergency restock
      responses:
        '201':
          description: Inventory received
          content:
            application/json:
              schema:
                type: object
                properties:
                  object:
                    type: string
                    enum:
                      - inventory_receive_result
              examples:
                multi_item_result:
                  summary: Multi-item receive result
                  value:
                    object: inventory_receive_result
                    items:
                      - index: 0
                        product_id: 7f6f3e14-eaad-4c45-b922-209f6dc6d140
                        location_id: 91aa7588-4dc7-4edd-b172-7de91f5e1f78
                        quantity: 10
                        unit_cost: 12.5
                        balance:
                          id: 0118ff93-8f65-4a72-ae7e-ca2a75526631
                          on_hand: 10
                          allocated: 0
                          available: 10
                          total_value: '125.00'
                          avg_unit_value: '12.5000'
                        transaction:
                          id: 3096987e-b156-4ee0-b373-8056f5bd8d91
                          type: receiving
                          quantity: 10
                          unit_price: '12.5000'
                          total_price: '125.00'
                          transaction_id: IVT-0000153
                      - index: 1
                        product_id: ec9288c3-12b1-474f-bb09-b0b15bb7a8ff
                        location_id: 91aa7588-4dc7-4edd-b172-7de91f5e1f78
                        quantity: 5
                        unit_cost: 8.75
                        balance:
                          id: 6e082a9d-7314-4bd9-9bf3-609b3aae12b3
                          on_hand: 5
                          allocated: 0
                          available: 5
                          total_value: '43.75'
                          avg_unit_value: '8.7500'
                        transaction:
                          id: f7d36a63-008b-4973-9025-e22328786e40
                          type: receiving
                          quantity: 5
                          unit_price: '8.7500'
                          total_price: '43.75'
                          transaction_id: IVT-0000154
                    summary:
                      total_items: 2
                      total_quantity: 15
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Error'
        '403':
          $ref: '#/components/responses/Error'
      security:
        - ApiKeyAuth: []
components:
  parameters:
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: false
      description: |
        Client-generated unique key for idempotent POST/PATCH/DELETE operations.
        Alias for the Idempotency parameter. Max 255 chars. On retry with the
        same key, the original response is returned without re-executing the
        operation. Keys expire after 24 hours.
      schema:
        type: string
        maxLength: 255
  responses:
    Error:
      description: Error response (400/401/403/404/409/422/429/500)
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
  schemas:
    ErrorEnvelope:
      type: object
      description: |
        Canonical error response envelope. All API errors use this shape.
      required:
        - error
        - code
      properties:
        error:
          type: string
          description: Machine-readable error key
          example: not_found
        code:
          type: string
          description: Machine-readable error code (often same as error)
          example: not_found
        type:
          type: string
          enum:
            - validation_error
            - permission_error
            - not_found
            - conflict
            - rate_limit
            - internal
            - expand_error
            - not_implemented
          example: not_found
        hint:
          type: string
          description: Human-readable one-sentence explanation (English)
          example: >-
            The requested order does not exist or does not belong to this
            entity.
        param:
          type: string
          description: The parameter that caused the error, if applicable
          example: expand[0]
        required:
          type: string
          description: The scope required (only on insufficient_scope errors)
          example: accounts:read
        request_id:
          type: string
          description: >-
            Unique request ID for support tracing (maps to CloudWatch log
            stream)
          example: req_abc123
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      description: |
        API key issued per entity via Settings > Developers > API Keys.
        Each key carries scopes (e.g. orders:read, products:write).
        Bearer token format: Authorization: Bearer ark_live_ent_<code>_<random>
        Test keys use ark_test_ent_<code>_<random>. Both are issued per entity
        via Settings > Developers > API Keys.

````