> ## 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.

# Create a quick check

> Creates and immediately prints a one-off check outside of a batch, for an urgent or ad-hoc vendor payment, given the payee, amount, and GL expense account to debit. Requires `purchasing:write` scope, and the journal entry posts immediately using the next number in the entity's check sequence.



## OpenAPI

````yaml /openapi.yaml post /quick-check
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.

    **Changelog.** Entries are dated and name every published contract whose
    MEANING moved, not

    only the ones whose field names changed. The narrative version of the same
    entries, written

    for integrators, is published at https://arcuserp.mintlify.app/changelog.


    **2026-09-22 (planned 2026-09-21), REORDER-BUYER-TRUTH: demand changed what
    it MEANS on three

    published contracts, with no field renamed.** An integrator that pins field
    names sees no

    breakage and different numbers, which is why this entry exists.

      - **Demand now counts build consumption.** `demand_avg_per_day` on the public product, kit
        and inventory-balance objects, and `daily_demand` / `demand_basis` / `net_suggested_qty`
        on `GET /v1/purchasing/reorder-report`, are composed from fulfilled sales lines PLUS
        posted `build_consume` inventory draws: each physical decrement of a product counts
        exactly once. The previous rule adopted an internal-consumption basis only when the sales
        blend was exactly zero, so a product both sold AND consumed into work orders planned as
        if the build draws did not exist. Products drawn into work orders move; on one
        production-shaped dataset five did, the largest from 0.05/day to 14.95/day.
      - **`demand_basis` now carries four values, not two:** `sales`, `sales_and_builds`,
        `builds` and `consumption`. A consumer with a two-branch reader (anything that is not
        `consumption` is `sales`) silently hides the two new ones.
      - **`current_demand_units` on `GET /v1/inventory/balances/:id` moved, by a second rule.**
        It counts committed-but-unshipped CUSTOMER demand, and it now counts a kit component's
        own line rather than its parent kit line, and excludes non-sales documents. On one
        production dataset 269 of 1,043 balance rows changed, 227 of them downward; the largest
        single move was 1,941 to 25, on a product whose open PURCHASE order line had been
        reported as customer demand. Re-baseline anything that alerts or reorders off this field.
      - `run_rate_30/90/180/365` and `blended_daily` on the same balance object move for the
        first reason above.
      - **Added, not changed:** `GET /v1/purchasing/reorder-report` accepts `demand_window` and
        returns the unit, cover-through and reorder-point-provenance fields documented on that
        operation; `order_multiple` is accepted and returned on the product-vendor doors.
      - **Volume note.** The `inventory.low_stock`, `inventory.out_of_stock` and
        `inventory.back_in_stock` webhook events are population-gated on
        `on_hand <= reorder_point`, and reorder points move with the demand above, so
        subscribers should expect a one-time step change in event volume around the release.
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:
  /quick-check:
    post:
      tags:
        - Purchasing
      summary: Create a quick check
      description: >-
        Creates and immediately prints a one-off check outside of a batch, for
        an urgent or ad-hoc vendor payment, given the payee, amount, and GL
        expense account to debit. Requires `purchasing:write` scope, and the
        journal entry posts immediately using the next number in the entity's
        check sequence.
      operationId: quickCheckV1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - vendor_id
                - amount
                - gl_account_id
              properties:
                vendor_id:
                  type: string
                  format: uuid
                amount:
                  type: number
                gl_account_id:
                  type: string
                  format: uuid
                memo:
                  type: string
                payment_date:
                  type: string
                  format: date
      responses:
        '201':
          description: Created quick check
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PrintedCheck'
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Error'
        '403':
          $ref: '#/components/responses/Error'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    PrintedCheck:
      type: object
      description: A check printed by Arcus (paper AP payment).
      properties:
        id:
          type: string
          format: uuid
        object:
          type: string
          enum:
            - printed_check
        entity_id:
          type: string
          format: uuid
          readOnly: true
        check_number:
          type: integer
          readOnly: true
          description: Sequential per bank account.
        bank_account_id:
          type: string
          format: uuid
        vendor_id:
          type: string
          format: uuid
        amount:
          type: number
        memo:
          type: string
          nullable: true
        status:
          type: string
          enum:
            - printed
            - reprinted
            - voided
            - cleared
          readOnly: true
        printed_at:
          type: string
          format: date-time
          readOnly: true
        voided_at:
          type: string
          format: date-time
          nullable: true
          readOnly: true
        cleared_at:
          type: string
          format: date-time
          nullable: true
          readOnly: true
        cleared_source:
          type: string
          nullable: true
          readOnly: true
          enum:
            - bank_match
            - manual_clear
            - register_only
            - migrated
          description: >
            The EVIDENCE CLASS behind status=cleared. `register_only` means the
            payment leg already credited a bank account and no journal entry was
            posted for the clear, so the row is a register truth and NOT a bank
            fact. Null on a check cleared before migration 20260915a, when
            nothing recorded the class.
        cleared_bank_transaction_id:
          type: string
          format: uuid
          nullable: true
          readOnly: true
          description: >
            The bank line that paid this check. Written when the clear is driven
            by a matched bank row; null for a manual clear and for every check
            cleared before 2026-09-18. When it is null the pairing may still be
            recorded on the bank side.
        cleared_bank_txn_id:
          type: string
          format: uuid
          nullable: true
          readOnly: true
          description: >
            RETRIEVE ONLY (GET /v1/printed-checks/{id}); absent from the list
            response. The RESOLVED bank line: `cleared_bank_transaction_id` when
            this check carries the forward stamp, otherwise the bank row whose
            `matched_printed_check_id` names this check. A check that is still
            `printed` has no forward stamp by definition, so this is the only
            field that can answer "which line will pay it" before the clear.
            Pass it as `bank_transaction_id` on POST
            /v1/printed-checks/{id}/clear and the relief is dated the day the
            BANK paid rather than today.
        drawn_on_bank_name:
          type: string
          nullable: true
          readOnly: true
          description: >
            RETRIEVE ONLY (GET /v1/printed-checks/{id}). The LIST response, GET
            /v1/printed-checks, does NOT carry it and carries no live-drawee
            field under any name: that door answers from the stored row, so the
            only bank name on a list item is the issue-time snapshot
            `bank_account_name`, and a list item can therefore name a bank this
            check is no longer drawn on. Retrieve the check to get this field.
            The name of the bank this check is CURRENTLY drawn on, resolved from
            `printed_checks.bank_account_id` (falling back to the linked AP
            payment's bank) and falling back to the issue-time snapshot
            `bank_account_name` only when no drawee resolves. It is a different
            fact from `bank_account_name`, which is what the PAPER said at issue
            time and is what a re-print reproduces: after the drawee is moved
            with PATCH /v1/printed-checks/{id}/bank the two disagree, and this
            field is the one that names the bank whose statement the check
            belongs on and whose GL its clearing relief will credit. Null only
            when the check has no resolvable drawee AND carries no snapshot.
        cleared_link_source:
          type: string
          nullable: true
          readOnly: true
          enum:
            - forward_stamp
            - reverse_link
          description: >
            RETRIEVE ONLY. WHICH pairing answered for `cleared_bank_txn_id`:
            `forward_stamp` is the check's own column (written by the clear that
            relieved it) and `reverse_link` is the bank row pointing back at the
            check. Null when nothing pairs.
        cleared_link_conflict:
          type: boolean
          readOnly: true
          description: >
            RETRIEVE ONLY. True when the check names one bank line AND a
            DIFFERENT bank row also points at this check. Two lines claiming one
            check is the shape of a double relief, so it is surfaced rather than
            silently resolved; `cleared_bank_txn_id` still answers with the
            forward stamp.
        cleared_bank_date:
          type: string
          format: date
          nullable: true
          readOnly: true
          description: >-
            RETRIEVE ONLY. The resolved bank line's own transaction date: the
            day the relief is dated when this line drives the clear.
        cleared_bank_amount:
          type: number
          nullable: true
          readOnly: true
          description: >-
            RETRIEVE ONLY. The resolved bank line's signed amount, so a caller
            can compare it with the check before clearing.
        cleared_bank_description:
          type: string
          nullable: true
          readOnly: true
          description: >-
            RETRIEVE ONLY. The resolved bank line's description as the bank sent
            it.
    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
  responses:
    Error:
      description: Error response (400/401/403/404/409/422/429/500)
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
  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.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.