Inventory

Inventory tracks how much of a thing you have, where it is, and what is already promised to someone else.

Two resources carry the state. An inventory item is the thing you stock; a catalog variant points at one rather than carrying its own counter, so the same physical stock can back several sellable products. An inventory level is one inventory item at one Location, and it is where quantities actually live. Every other resource here either changes a level or explains a change.

New to this surface? The Inventory guide walks one item from first stock through a paid, fulfilled order.

Quantity states#

A level does not have a single count. It has physical stock, claims against that stock, and a derived number you can still sell.

QuantityMeaning
on_hand_quantityPhysically present, in any condition
quality_control_quantity, damaged_quantity, quarantined_quantityPresent but not sellable
held_quantityClaimed by an open reservation, not yet paid
committed_quantityClaimed and confirmed, not yet shipped
safety_stock_quantityDeliberately withheld from sale
available_quantityDerived: what you can still sell
shortage_quantityDerived: claims exceeding sellable stock

available_quantity and shortage_quantity are computed, never written. You change stock by recording what happened, and Flint derives the rest.

Committed stock is still physically present. It leaves on_hand_quantity only when fulfillment consumes it, which is why canceling before shipment restores availability without any physical movement.

The three write semantics#

Every command that changes a quantity uses exactly one semantic, and its field names tell you which:

  • Relative delta (*_quantity_delta) for adjustments. "Twenty-five more arrived."
  • Absolute value (target_safety_stock_quantity) for safety stock. "Keep five units unavailable for sale."
  • Cumulative target (target_*_quantity) for reservation transitions. "Two of these should be committed by now."

Cumulative targets converge: resending a target you already applied succeeds and changes nothing. A bare quantity field never appears on a converging transition, so a target can't be mistaken for a delta.

What a quantity command returns#

Every command that changes a quantity returns an operation-specific result object with the same effect fields: the echoed idempotency_key, the inventory_movement_ids it produced, and resulting_inventory_levels, a complete post-commit projection of every level it touched. Commands backed by a resource also include that created or updated resource under its documented field. You do not need a follow-up read to learn where the numbers landed, and a replay returns the levels as of the original command rather than whatever they are now.

Inventory list page_token values are opaque and bound to the route and filters that produced them. Reuse the token unchanged with the same filters; changing a filter requires starting from the first page. Scalar filters accept one value, not repeated or comma-joined alternatives.

Idempotency is required, not optional#

Every command that can change a quantity rejects a request with no Idempotency-Key, returning 400 IDEMPOTENCY_KEY_REQUIRED. Flint will not generate one for you, because a generated key cannot protect the case that actually matters: your request succeeded, the response never reached you, and you retry.

Reusing a key with identical input returns the original result, including the original level projections rather than whatever the quantities happen to be now. Reusing it with different input is a conflict. This holds for far longer than ordinary HTTP idempotency retention, so a delayed webhook or warehouse replay from last week still cannot double-count.

Concurrency#

Anything with a mutable basis takes an expected revision and rejects a stale one rather than overwriting a concurrent change: expected_inventory_item_revision, expected_inventory_allocation_policy_revision, expected_inventory_reservation_revision, and expected_safety_stock_quantity on safety stock lines. Read, then send back what you read.

Reserving stock#

POST /v1/inventory-reservations routes demand and holds stock in one atomic operation. You give it demand, a routing source, and an owner; it decides which Locations serve the demand and holds the quantity there. It is all or nothing: if the whole request cannot be satisfied, nothing is held and the response says what fell short.

The owner names what holds the stock (key, your own cart or session identifier) and when the claim lapses (expires_at, required, at most 15 minutes out). One active reservation per key. If a buyer needs longer to pay, POST /v1/inventory-reservations/{id}/start-payment-window replaces the deadline once with a window of up to 1800 seconds; at that deadline the remaining hold is released while committed and consumed quantity survive.

Held quantity moves forward through commit, then consume, and can leave through release or reallocation. Consumed and released quantities are terminal; nothing returns to held. release names the bucket it drains (target_released_from_held_quantity or target_released_from_committed_quantity), so no priority rule decides for you.

Availability checks and routing previews answer "what would happen" without holding anything. They are advisory by construction: only a reservation prevents overselling.

Orders and checkout#

Selling through a Flint order does not require calling any of this yourself. Set inventory_routing_source on the order and Flint holds stock when payment begins, commits it when payment succeeds, releases it when payment fails, and consumes it when fulfillment hands the goods off. The order carries inventory_reservation_id for the claim and inventory_demand_revision, which advances whenever tracked demand or routing changes.

An order with tracked line items and no routing source cannot hold stock: paying it returns INVENTORY_ROUTING_SOURCE_REQUIRED. If no location can serve the demand, payment fails with INVENTORY_UNAVAILABLE before money moves.

When payment succeeds but stock cannot be committed, the order reports inventory_exception_status: "paid_inventory_failed" and emits order.inventory_exception.created. Resolve it with POST /v1/orders/{order_id}/inventory-exception/resolve, or set post_payment_inventory_failure_action to auto_refund in settings to have Flint refund instead.

Reserve directly only when the cart lives outside Flint: your own storefront, a POS, or a system that holds stock before an order exists.

Routing across locations#

The routing source decides which Locations can serve demand, and every request that creates tracked demand carries exactly one:

  • {"type": "fixed_location", "location_id": "loc_..."} sends everything to one Location. Single-site merchants never need a policy.
  • {"type": "policy", "inventory_allocation_policy_id": "invp_..."} resolves the policy's current version when the request is made.
  • {"type": "policy_version", "inventory_allocation_policy_version_id": "invpv_..."} pins an exact version.

A policy version ranks Locations into priority groups. Routing is deterministic and prefers to keep an order together:

  1. Eligible Locations are ordered by ascending group priority, then ascending location ID.
  2. If any single eligible Location can satisfy the whole request, it takes all of it.
  3. Otherwise, if splitting_behavior is split_when_required, Flint walks that same order and takes as much as each Location can serve, up to maximum_locations_per_assignment.

single_location fails instead of splitting. Per-demand and fulfillment constraints can narrow this further but never widen it: the effective rule is the intersection, so a line that must ship whole stays whole even under split_when_required.

Publishing a new policy version affects future routing. Existing reservations and quotes keep the version they pinned.

When stock is promised but missing#

A loss, damage adjustment, or other physical correction can leave more claims than sellable stock. Flint does not pretend otherwise. It protects claims deterministically (committed before held, oldest first) and reports the remainder as at_risk_held_quantity and at_risk_committed_quantity on the reservation lines, alongside inventory.shortage.detected and inventory.reservation.at_risk events.

At-risk quantity cannot be consumed. The reservation exposes an inventory_action_required object naming the affected lines, and payment dispatch refuses to start against an at-risk hold rather than taking money it cannot honor. Replenish with an adjustment or release the affected claim before retrying commerce.

Everything else is an explanation#

Adjustments and reservation transitions ensure that every change to a level has a durable reason attached. Each one produces inventory movements, an append-only record of what changed and what the level looked like afterward. When a number is wrong, the movement history is how you find out why, which is why physical commands carry occurred_at and source-system provenance: the moment stock actually moved, not the moment your system got around to telling us.

Endpoints

List inventory adjustments#

GET/v1/inventory-adjustmentsRequires scope: commerce.inventory.read or commerce.inventory.write

List inventory adjustments.

Query parameters
page_sizeinteger

Number of resources to return.

page_tokenstring

Stable cursor returned by the previous page.

inventory_item_idstring

Filter by inventory item.

location_idstring

Filter by Location.

reasonenum

Filter by adjustment reason.

received_stockdamagecondition_changedtheftlossmanual_correctionother
idempotency_keystring

Recover an adjustment by idempotency key.

source_system_typeenum

Filter by source-system type.

manualposwmserpflintother
external_source_idstring

Filter by external source ID.

external_actor_idstring

Filter by external actor ID.

occurred_afterstring

Lower bound for occurred_at.

occurred_beforestring

Upper bound for occurred_at.

created_afterstring

Lower bound for created_at.

created_beforestring

Upper bound for created_at.

Response · 200
dataarray of objectrequired
metaobject
next_page_tokenstring
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDED
Bash
curl https://api.withflintpay.com/v1/inventory-adjustments \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": [
    {
      "created_at": "2026-07-21T14:18:04Z",
      "external_actor_id": "receiver_204",
      "idempotency_key": "receiving-1842",
      "inventory_adjustment_id": "invadj_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "lines": [
        {
          "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "on_hand_quantity_delta": 25
        }
      ],
      "note": "Receiving record 1842",
      "occurred_at": "2026-07-21T14:18:00Z",
      "reason": "received_stock",
      "source_system": {
        "external_source_id": "east-coast-wms",
        "type": "wms"
      }
    }
  ],
  "next_page_token": "",
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Create inventory adjustment#

POST/v1/inventory-adjustmentsIdempotentRequires scope: commerce.inventory.write

Record a physical stock change as signed deltas. Returns the created adjustment, its movement IDs, and the resulting level for every level touched.

Request body
external_actor_idstring
linesarray of objectrequired
notestring
occurred_atstring

RFC3339 timestamp.

reasonenumrequired
received_stockdamagecondition_changedtheftlossmanual_correctionother
source_systemobjectrequired
Response · 201
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-adjustments \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "external_actor_id": "receiver_204",
    "lines": [
      {
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "on_hand_quantity_delta": 25
      }
    ],
    "note": "Receiving record 1842",
    "occurred_at": "2026-07-21T14:18:00Z",
    "reason": "received_stock",
    "source_system": {
      "external_source_id": "east-coast-wms",
      "type": "wms"
    }
  }'
JSON
{
  "data": {
    "idempotency_key": "receiving-1842",
    "inventory_adjustment": {
      "created_at": "2026-07-21T14:18:04Z",
      "external_actor_id": "receiver_204",
      "idempotency_key": "receiving-1842",
      "inventory_adjustment_id": "invadj_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "lines": [
        {
          "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "on_hand_quantity_delta": 25
        }
      ],
      "note": "Receiving record 1842",
      "occurred_at": "2026-07-21T14:18:00Z",
      "reason": "received_stock",
      "source_system": {
        "external_source_id": "east-coast-wms",
        "type": "wms"
      }
    },
    "inventory_movement_ids": [
      "invm_01K0P7W6A4N9F3J2T8Q5R1C6XM"
    ],
    "resulting_inventory_levels": [
      {
        "available_quantity": 31,
        "committed_quantity": 6,
        "created_at": "2026-05-02T11:04:00Z",
        "damaged_quantity": 2,
        "held_quantity": 4,
        "incoming_quantity": 0,
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_claim_revision": 7,
        "inventory_level_id": "invl_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_physical_revision": 9,
        "inventory_level_revision": 18,
        "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "on_hand_quantity": 48,
        "quality_control_quantity": 0,
        "quarantined_quantity": 0,
        "safety_stock_quantity": 5,
        "shortage_quantity": 0,
        "unavailable_on_hand_quantity": 2,
        "updated_at": "2026-07-21T14:18:00Z"
      }
    ]
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Get inventory adjustment#

GET/v1/inventory-adjustments/{inventory_adjustment_id}Requires scope: commerce.inventory.read or commerce.inventory.write

Get inventory adjustment.

Path parameters
inventory_adjustment_idstringrequired

Flint inventory adjustment ID.

Response · 200
dataobjectrequired

A recorded physical stock change, such as receiving, damage, or a manual correction.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl https://api.withflintpay.com/v1/inventory-adjustments/invadj_01K0P7W6A4N9F3J2T8Q5R1C6XM \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": {
    "created_at": "2026-07-21T14:18:04Z",
    "external_actor_id": "receiver_204",
    "idempotency_key": "receiving-1842",
    "inventory_adjustment_id": "invadj_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "lines": [
      {
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "on_hand_quantity_delta": 25
      }
    ],
    "note": "Receiving record 1842",
    "occurred_at": "2026-07-21T14:18:00Z",
    "reason": "received_stock",
    "source_system": {
      "external_source_id": "east-coast-wms",
      "type": "wms"
    }
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

List inventory allocation policies#

GET/v1/inventory-allocation-policiesRequires scope: commerce.inventory.read or commerce.inventory.write

List inventory allocation policies.

Query parameters
page_sizeinteger

Number of resources to return.

page_tokenstring

Stable cursor returned by the previous page.

statusenum

Filter by policy status.

activeinactivearchived
Response · 200
dataarray of objectrequired
metaobject
next_page_tokenstring
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDED
Bash
curl https://api.withflintpay.com/v1/inventory-allocation-policies \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": [
    {
      "created_at": "2026-06-01T10:00:00Z",
      "current_inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "current_version": {
        "created_at": "2026-06-01T10:00:00Z",
        "inventory_allocation_policy_id": "invp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "location_groups": [
          {
            "group_priority": 1,
            "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM"
          },
          {
            "group_priority": 2,
            "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6YN"
          }
        ],
        "maximum_locations_per_assignment": 3,
        "splitting_behavior": "split_when_required",
        "within_group_order": "location_id_ascending"
      },
      "inventory_allocation_policy_id": "invp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_allocation_policy_revision": 2,
      "metadata": {},
      "name": "US retail routing",
      "status": "active",
      "updated_at": "2026-06-01T10:00:00Z"
    }
  ],
  "next_page_token": "",
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Create inventory allocation policy#

POST/v1/inventory-allocation-policiesIdempotentRequires scope: commerce.inventory_policies.write

Create an allocation policy. Creation publishes version 1 inline, so a policy always has a current version.

Request body
metadatamap of string
namestringrequired
statusenumrequired
activeinactive
versionobjectrequired
Response · 201
dataobjectrequired

Named, versioned rules that decide which Locations serve demand and in what order.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-allocation-policies \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "name": "US retail routing",
    "status": "active",
    "version": {
      "location_groups": [
        {
          "group_priority": 1,
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM"
        }
      ],
      "maximum_locations_per_assignment": 3,
      "splitting_behavior": "split_when_required",
      "within_group_order": "location_id_ascending"
    }
  }'
JSON
{
  "data": {
    "created_at": "2026-06-01T10:00:00Z",
    "current_inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "current_version": {
      "created_at": "2026-06-01T10:00:00Z",
      "inventory_allocation_policy_id": "invp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "location_groups": [
        {
          "group_priority": 1,
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM"
        },
        {
          "group_priority": 2,
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6YN"
        }
      ],
      "maximum_locations_per_assignment": 3,
      "splitting_behavior": "split_when_required",
      "within_group_order": "location_id_ascending"
    },
    "inventory_allocation_policy_id": "invp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_allocation_policy_revision": 2,
    "metadata": {},
    "name": "US retail routing",
    "status": "active",
    "updated_at": "2026-06-01T10:00:00Z"
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Get inventory allocation policy#

GET/v1/inventory-allocation-policies/{inventory_allocation_policy_id}Requires scope: commerce.inventory.read or commerce.inventory.write

Get inventory allocation policy.

Path parameters
inventory_allocation_policy_idstringrequired

Flint inventory allocation policy ID.

Response · 200
dataobjectrequired

Named, versioned rules that decide which Locations serve demand and in what order.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl https://api.withflintpay.com/v1/inventory-allocation-policies/invp_01K0P7W6A4N9F3J2T8Q5R1C6XM \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": {
    "created_at": "2026-06-01T10:00:00Z",
    "current_inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "current_version": {
      "created_at": "2026-06-01T10:00:00Z",
      "inventory_allocation_policy_id": "invp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "location_groups": [
        {
          "group_priority": 1,
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM"
        },
        {
          "group_priority": 2,
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6YN"
        }
      ],
      "maximum_locations_per_assignment": 3,
      "splitting_behavior": "split_when_required",
      "within_group_order": "location_id_ascending"
    },
    "inventory_allocation_policy_id": "invp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_allocation_policy_revision": 2,
    "metadata": {},
    "name": "US retail routing",
    "status": "active",
    "updated_at": "2026-06-01T10:00:00Z"
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Update inventory allocation policy#

PATCH/v1/inventory-allocation-policies/{inventory_allocation_policy_id}IdempotentRequires scope: commerce.inventory_policies.write

Update inventory allocation policy.

Path parameters
inventory_allocation_policy_idstringrequired

Flint inventory allocation policy ID.

Request body
expected_inventory_allocation_policy_revisionintegerrequired
metadataarray of integer
namestring
Response · 200
dataobjectrequired

Named, versioned rules that decide which Locations serve demand and in what order.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X PATCH https://api.withflintpay.com/v1/inventory-allocation-policies/invp_01K0P7W6A4N9F3J2T8Q5R1C6XM \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_allocation_policy_revision": 2,
    "name": "US retail routing"
  }'
JSON
{
  "data": {
    "created_at": "2026-06-01T10:00:00Z",
    "current_inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "current_version": {
      "created_at": "2026-06-01T10:00:00Z",
      "inventory_allocation_policy_id": "invp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "location_groups": [
        {
          "group_priority": 1,
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM"
        },
        {
          "group_priority": 2,
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6YN"
        }
      ],
      "maximum_locations_per_assignment": 3,
      "splitting_behavior": "split_when_required",
      "within_group_order": "location_id_ascending"
    },
    "inventory_allocation_policy_id": "invp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_allocation_policy_revision": 2,
    "metadata": {},
    "name": "US retail routing",
    "status": "active",
    "updated_at": "2026-06-01T10:00:00Z"
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Activate inventory allocation policy#

POST/v1/inventory-allocation-policies/{inventory_allocation_policy_id}/activateIdempotentRequires scope: commerce.inventory_policies.write

Activate inventory allocation policy.

Path parameters
inventory_allocation_policy_idstringrequired

Flint inventory allocation policy ID.

Request body
expected_inventory_allocation_policy_revisionintegerrequired
Response · 200
dataobjectrequired

Named, versioned rules that decide which Locations serve demand and in what order.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-allocation-policies/invp_01K0P7W6A4N9F3J2T8Q5R1C6XM/activate \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_allocation_policy_revision": 2
  }'
JSON
{
  "data": {
    "created_at": "2026-06-01T10:00:00Z",
    "current_inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "current_version": {
      "created_at": "2026-06-01T10:00:00Z",
      "inventory_allocation_policy_id": "invp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "location_groups": [
        {
          "group_priority": 1,
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM"
        },
        {
          "group_priority": 2,
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6YN"
        }
      ],
      "maximum_locations_per_assignment": 3,
      "splitting_behavior": "split_when_required",
      "within_group_order": "location_id_ascending"
    },
    "inventory_allocation_policy_id": "invp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_allocation_policy_revision": 2,
    "metadata": {},
    "name": "US retail routing",
    "status": "active",
    "updated_at": "2026-06-01T10:00:00Z"
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Archive inventory allocation policy#

POST/v1/inventory-allocation-policies/{inventory_allocation_policy_id}/archiveIdempotentRequires scope: commerce.inventory_policies.write

Archive inventory allocation policy.

Path parameters
inventory_allocation_policy_idstringrequired

Flint inventory allocation policy ID.

Request body
expected_inventory_allocation_policy_revisionintegerrequired
Response · 200
dataobjectrequired

Named, versioned rules that decide which Locations serve demand and in what order.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-allocation-policies/invp_01K0P7W6A4N9F3J2T8Q5R1C6XM/archive \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_allocation_policy_revision": 2
  }'
JSON
{
  "data": {
    "created_at": "2026-06-01T10:00:00Z",
    "current_inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "current_version": {
      "created_at": "2026-06-01T10:00:00Z",
      "inventory_allocation_policy_id": "invp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "location_groups": [
        {
          "group_priority": 1,
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM"
        },
        {
          "group_priority": 2,
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6YN"
        }
      ],
      "maximum_locations_per_assignment": 3,
      "splitting_behavior": "split_when_required",
      "within_group_order": "location_id_ascending"
    },
    "inventory_allocation_policy_id": "invp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_allocation_policy_revision": 2,
    "metadata": {},
    "name": "US retail routing",
    "status": "active",
    "updated_at": "2026-06-01T10:00:00Z"
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Deactivate inventory allocation policy#

POST/v1/inventory-allocation-policies/{inventory_allocation_policy_id}/deactivateIdempotentRequires scope: commerce.inventory_policies.write

Deactivate inventory allocation policy.

Path parameters
inventory_allocation_policy_idstringrequired

Flint inventory allocation policy ID.

Request body
expected_inventory_allocation_policy_revisionintegerrequired
Response · 200
dataobjectrequired

Named, versioned rules that decide which Locations serve demand and in what order.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-allocation-policies/invp_01K0P7W6A4N9F3J2T8Q5R1C6XM/deactivate \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_allocation_policy_revision": 2
  }'
JSON
{
  "data": {
    "created_at": "2026-06-01T10:00:00Z",
    "current_inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "current_version": {
      "created_at": "2026-06-01T10:00:00Z",
      "inventory_allocation_policy_id": "invp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "location_groups": [
        {
          "group_priority": 1,
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM"
        },
        {
          "group_priority": 2,
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6YN"
        }
      ],
      "maximum_locations_per_assignment": 3,
      "splitting_behavior": "split_when_required",
      "within_group_order": "location_id_ascending"
    },
    "inventory_allocation_policy_id": "invp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_allocation_policy_revision": 2,
    "metadata": {},
    "name": "US retail routing",
    "status": "active",
    "updated_at": "2026-06-01T10:00:00Z"
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Create inventory availability preview#

POST/v1/inventory-availability-previewsRequires scope: commerce.inventory.read or commerce.inventory.write

Read how much of each demand could be served right now. Advisory only: it holds no stock and is not persisted. Only a reservation prevents overselling.

Request body
demandsarray of objectrequired
destination_fingerprintstring
inventory_routing_sourceone ofrequired
Response · 200
dataobjectrequired

A non-binding read of how much of each demand could be served. It holds no stock.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-availability-previews \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "demands": [
      {
        "demand_key": "cart_line_1",
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "quantity": 2,
        "splitting_behavior": "single_location"
      }
    ],
    "inventory_routing_source": {
      "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "type": "fixed_location"
    }
  }'
JSON
{
  "data": {
    "expires_at": "2026-07-21T14:33:00Z",
    "inventory_routing_source": {
      "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "type": "policy_version"
    },
    "observed_at": "2026-07-21T14:18:00Z",
    "results": [
      {
        "availability_status": "partial",
        "demand_key": "cart_line_1",
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "locations": [
          {
            "availability_status": "partial",
            "available_quantity": 4,
            "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM"
          },
          {
            "availability_status": "none",
            "available_quantity": 0,
            "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6YN"
          }
        ],
        "requested_quantity": 6
      }
    ]
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

List inventory counts#

GET/v1/inventory-countsRequires scope: commerce.inventory.read or commerce.inventory.write

List inventory counts.

Query parameters
page_sizeinteger

Number of resources to return.

page_tokenstring

Stable cursor returned by the previous page.

inventory_item_idstring

Filter by a counted inventory item.

location_idstring

Filter by Location.

statusenum

Filter by count status.

draftappliedcanceled
idempotency_keystring

Recover a count by idempotency key.

created_afterstring

Lower bound for created_at.

created_beforestring

Upper bound for created_at.

applied_afterstring

Lower bound for applied_at.

applied_beforestring

Upper bound for applied_at.

Response · 200
dataarray of objectrequired
metaobject
next_page_tokenstring
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDED
Bash
curl https://api.withflintpay.com/v1/inventory-counts \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": [
    {
      "created_at": "2026-08-02T16:00:00Z",
      "idempotency_key": "example",
      "inventory_count_id": "example",
      "inventory_count_revision": 0,
      "lines": [
        {
          "captured_physical_revision": 0,
          "inventory_count_line_id": "example",
          "inventory_item_id": "example"
        }
      ],
      "location_id": "loc_01K1P6G4M7H2N8Q9R3S5T6V7WX",
      "status": "draft",
      "updated_at": "2026-08-02T16:00:00Z"
    }
  ],
  "next_page_token": "page_2",
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

Create inventory count#

POST/v1/inventory-countsIdempotentRequires scope: commerce.inventory.write

Open a physical count for selected inventory items at one Location.

Request body
inventory_item_idsarray of stringrequired
location_idstringrequired
Response · 201
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-counts \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "inventory_item_ids": [
      "example"
    ],
    "location_id": "loc_01K1P6G4M7H2N8Q9R3S5T6V7WX"
  }'
JSON
{
  "data": {
    "created_at": "2026-08-02T16:00:00Z",
    "idempotency_key": "example",
    "inventory_count_id": "example",
    "inventory_count_revision": 0,
    "lines": [
      {
        "captured_physical_revision": 0,
        "inventory_count_line_id": "example",
        "inventory_item_id": "example"
      }
    ],
    "location_id": "loc_01K1P6G4M7H2N8Q9R3S5T6V7WX",
    "status": "draft",
    "updated_at": "2026-08-02T16:00:00Z"
  },
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

Get inventory count#

GET/v1/inventory-counts/{inventory_count_id}Requires scope: commerce.inventory.read or commerce.inventory.write

Get inventory count.

Path parameters
inventory_count_idstringrequired

Flint inventory count ID.

Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl https://api.withflintpay.com/v1/inventory-counts/{inventory_count_id} \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": {
    "created_at": "2026-08-02T16:00:00Z",
    "idempotency_key": "example",
    "inventory_count_id": "example",
    "inventory_count_revision": 0,
    "lines": [
      {
        "captured_physical_revision": 0,
        "inventory_count_line_id": "example",
        "inventory_item_id": "example"
      }
    ],
    "location_id": "loc_01K1P6G4M7H2N8Q9R3S5T6V7WX",
    "status": "draft",
    "updated_at": "2026-08-02T16:00:00Z"
  },
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

Apply inventory count#

POST/v1/inventory-counts/{inventory_count_id}/applyIdempotentRequires scope: commerce.inventory.write

Apply a completed physical count to inventory levels.

Path parameters
inventory_count_idstringrequired

Flint inventory count ID.

Request body
expected_inventory_count_revisionintegerrequired
Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-counts/{inventory_count_id}/apply \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_count_revision": 0
  }'
JSON
{
  "data": {
    "idempotency_key": "example",
    "inventory_count": {
      "created_at": "2026-08-02T16:00:00Z",
      "idempotency_key": "example",
      "inventory_count_id": "example",
      "inventory_count_revision": 0,
      "lines": [
        {
          "captured_physical_revision": 0,
          "inventory_count_line_id": "example",
          "inventory_item_id": "example"
        }
      ],
      "location_id": "loc_01K1P6G4M7H2N8Q9R3S5T6V7WX",
      "status": "draft",
      "updated_at": "2026-08-02T16:00:00Z"
    },
    "inventory_movement_ids": [
      "example"
    ],
    "resulting_inventory_levels": [
      {
        "available_quantity": 1,
        "committed_quantity": 1,
        "created_at": "2026-08-02T16:00:00Z",
        "damaged_quantity": 1,
        "held_quantity": 1,
        "incoming_quantity": 1,
        "inventory_item_id": "example",
        "inventory_level_claim_revision": 1,
        "inventory_level_id": "example",
        "inventory_level_physical_revision": 1,
        "inventory_level_revision": 1,
        "location_id": "loc_01K1P6G4M7H2N8Q9R3S5T6V7WX",
        "on_hand_quantity": 1,
        "quality_control_quantity": 1,
        "quarantined_quantity": 1,
        "safety_stock_quantity": 1,
        "shortage_quantity": 1,
        "unavailable_on_hand_quantity": 1,
        "updated_at": "2026-08-02T16:00:00Z"
      }
    ]
  },
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

Cancel inventory count#

POST/v1/inventory-counts/{inventory_count_id}/cancelIdempotentRequires scope: commerce.inventory.write

Cancel an open physical count without changing inventory levels.

Path parameters
inventory_count_idstringrequired

Flint inventory count ID.

Request body
expected_inventory_count_revisionintegerrequired
Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-counts/{inventory_count_id}/cancel \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_count_revision": 0
  }'
JSON
{
  "data": {
    "idempotency_key": "example",
    "inventory_count": {
      "created_at": "2026-08-02T16:00:00Z",
      "idempotency_key": "example",
      "inventory_count_id": "example",
      "inventory_count_revision": 0,
      "lines": [
        {
          "captured_physical_revision": 0,
          "inventory_count_line_id": "example",
          "inventory_item_id": "example"
        }
      ],
      "location_id": "loc_01K1P6G4M7H2N8Q9R3S5T6V7WX",
      "status": "draft",
      "updated_at": "2026-08-02T16:00:00Z"
    },
    "inventory_movement_ids": [
      "example"
    ],
    "resulting_inventory_levels": [
      {
        "available_quantity": 1,
        "committed_quantity": 1,
        "created_at": "2026-08-02T16:00:00Z",
        "damaged_quantity": 1,
        "held_quantity": 1,
        "incoming_quantity": 1,
        "inventory_item_id": "example",
        "inventory_level_claim_revision": 1,
        "inventory_level_id": "example",
        "inventory_level_physical_revision": 1,
        "inventory_level_revision": 1,
        "location_id": "loc_01K1P6G4M7H2N8Q9R3S5T6V7WX",
        "on_hand_quantity": 1,
        "quality_control_quantity": 1,
        "quarantined_quantity": 1,
        "safety_stock_quantity": 1,
        "shortage_quantity": 1,
        "unavailable_on_hand_quantity": 1,
        "updated_at": "2026-08-02T16:00:00Z"
      }
    ]
  },
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

Put inventory count observations#

PUT/v1/inventory-counts/{inventory_count_id}/observationsIdempotentRequires scope: commerce.inventory.write

Record idempotent physical-count observations against the current count revision.

Path parameters
inventory_count_idstringrequired

Flint inventory count ID.

Request body
expected_inventory_count_revisionintegerrequired
external_actor_idstring
observationsarray of objectrequired
occurred_atstring

RFC3339 timestamp.

source_systemobjectrequired
Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X PUT https://api.withflintpay.com/v1/inventory-counts/{inventory_count_id}/observations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_count_revision": 0,
    "observations": [
      {
        "counted_damaged_quantity": 1,
        "counted_on_hand_quantity": 1,
        "counted_quality_control_quantity": 1,
        "counted_quarantined_quantity": 1,
        "inventory_item_id": "example"
      }
    ],
    "source_system": {
      "type": "manual"
    }
  }'
JSON
{
  "data": {
    "created_at": "2026-08-02T16:00:00Z",
    "idempotency_key": "example",
    "inventory_count_id": "example",
    "inventory_count_revision": 0,
    "lines": [
      {
        "captured_physical_revision": 0,
        "inventory_count_line_id": "example",
        "inventory_item_id": "example"
      }
    ],
    "location_id": "loc_01K1P6G4M7H2N8Q9R3S5T6V7WX",
    "status": "draft",
    "updated_at": "2026-08-02T16:00:00Z"
  },
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

List inventory items#

GET/v1/inventory-itemsRequires scope: commerce.inventory.read or commerce.inventory.write

List inventory items.

Query parameters
page_sizeinteger

Number of resources to return.

page_tokenstring

Stable cursor returned by the previous page.

statusenum

Filter by inventory item status.

activeinactivearchived
skustring

Filter by exact SKU.

barcodestring

Filter by exact barcode.

querystring

Search inventory item ID, name, SKU, or barcode.

Response · 200
dataarray of objectrequired
metaobject
next_page_tokenstring
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDED
Bash
curl https://api.withflintpay.com/v1/inventory-items \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": [
    {
      "barcode": "0781234567890",
      "created_at": "2026-05-02T11:04:00Z",
      "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_item_revision": 3,
      "metadata": {
        "supplier": "northwind"
      },
      "name": "Ceramic mug, 12oz",
      "sku": "mug-12-white",
      "status": "active",
      "updated_at": "2026-07-14T09:12:00Z"
    }
  ],
  "next_page_token": "",
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Create inventory item#

POST/v1/inventory-itemsIdempotentRequires scope: commerce.inventory.write

Create an inventory item. SKU and barcode are searchable attributes, not identity: they are not required to be unique.

Request body
barcodestring
metadatamap of string
namestringrequired
skustring
statusenumrequired
activeinactive
Response · 201
dataobjectrequired

A stock-keeping unit that inventory quantities are tracked against. Catalog variants reference an inventory item rather than carrying their own counter.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-items \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "barcode": "0781234567890",
    "name": "Ceramic mug, 12oz",
    "sku": "mug-12-white",
    "status": "active"
  }'
JSON
{
  "data": {
    "barcode": "0781234567890",
    "created_at": "2026-05-02T11:04:00Z",
    "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_item_revision": 3,
    "metadata": {
      "supplier": "northwind"
    },
    "name": "Ceramic mug, 12oz",
    "sku": "mug-12-white",
    "status": "active",
    "updated_at": "2026-07-14T09:12:00Z"
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Get inventory item#

GET/v1/inventory-items/{inventory_item_id}Requires scope: commerce.inventory.read or commerce.inventory.write

Get inventory item.

Path parameters
inventory_item_idstringrequired

Flint inventory item ID.

Response · 200
dataobjectrequired

A stock-keeping unit that inventory quantities are tracked against. Catalog variants reference an inventory item rather than carrying their own counter.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl https://api.withflintpay.com/v1/inventory-items/invi_01K0P7W6A4N9F3J2T8Q5R1C6XM \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": {
    "barcode": "0781234567890",
    "created_at": "2026-05-02T11:04:00Z",
    "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_item_revision": 3,
    "metadata": {
      "supplier": "northwind"
    },
    "name": "Ceramic mug, 12oz",
    "sku": "mug-12-white",
    "status": "active",
    "updated_at": "2026-07-14T09:12:00Z"
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Update inventory item#

PATCH/v1/inventory-items/{inventory_item_id}IdempotentRequires scope: commerce.inventory.write

Update an inventory item. Requires expected_inventory_item_revision. Send sku or barcode as null to clear.

Path parameters
inventory_item_idstringrequired

Flint inventory item ID.

Request body
barcodeobject
expected_inventory_item_revisionintegerrequired
metadataarray of integer
namestring
skuobject
Response · 200
dataobjectrequired

A stock-keeping unit that inventory quantities are tracked against. Catalog variants reference an inventory item rather than carrying their own counter.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X PATCH https://api.withflintpay.com/v1/inventory-items/invi_01K0P7W6A4N9F3J2T8Q5R1C6XM \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "barcode": null,
    "expected_inventory_item_revision": 3,
    "name": "Ceramic mug, 12oz (white)"
  }'
JSON
{
  "data": {
    "barcode": "0781234567890",
    "created_at": "2026-05-02T11:04:00Z",
    "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_item_revision": 3,
    "metadata": {
      "supplier": "northwind"
    },
    "name": "Ceramic mug, 12oz",
    "sku": "mug-12-white",
    "status": "active",
    "updated_at": "2026-07-14T09:12:00Z"
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Activate inventory item#

POST/v1/inventory-items/{inventory_item_id}/activateIdempotentRequires scope: commerce.inventory.write

Activate an inventory item for new catalog relationships and routing. Requires expected_inventory_item_revision.

Path parameters
inventory_item_idstringrequired

Flint inventory item ID.

Request body
expected_inventory_item_revisionintegerrequired
Response · 200
dataobjectrequired

A stock-keeping unit that inventory quantities are tracked against. Catalog variants reference an inventory item rather than carrying their own counter.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-items/invi_01K0P7W6A4N9F3J2T8Q5R1C6XM/activate \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_item_revision": 3
  }'
JSON
{
  "data": {
    "barcode": "0781234567890",
    "created_at": "2026-05-02T11:04:00Z",
    "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_item_revision": 3,
    "metadata": {
      "supplier": "northwind"
    },
    "name": "Ceramic mug, 12oz",
    "sku": "mug-12-white",
    "status": "active",
    "updated_at": "2026-07-14T09:12:00Z"
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Archive inventory item#

POST/v1/inventory-items/{inventory_item_id}/archiveIdempotentRequires scope: commerce.inventory.write

Archive inventory item.

Path parameters
inventory_item_idstringrequired

Flint inventory item ID.

Response · 200
dataobjectrequired

A stock-keeping unit that inventory quantities are tracked against. Catalog variants reference an inventory item rather than carrying their own counter.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-items/invi_01K0P7W6A4N9F3J2T8Q5R1C6XM/archive \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_item_revision": 3
  }'
JSON
{
  "data": {
    "barcode": "0781234567890",
    "created_at": "2026-05-02T11:04:00Z",
    "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_item_revision": 3,
    "metadata": {
      "supplier": "northwind"
    },
    "name": "Ceramic mug, 12oz",
    "sku": "mug-12-white",
    "status": "active",
    "updated_at": "2026-07-14T09:12:00Z"
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Deactivate inventory item#

POST/v1/inventory-items/{inventory_item_id}/deactivateIdempotentRequires scope: commerce.inventory.write

Deactivate an inventory item for new catalog relationships and routing without disturbing existing claims. Requires expected_inventory_item_revision.

Path parameters
inventory_item_idstringrequired

Flint inventory item ID.

Request body
expected_inventory_item_revisionintegerrequired
Response · 200
dataobjectrequired

A stock-keeping unit that inventory quantities are tracked against. Catalog variants reference an inventory item rather than carrying their own counter.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-items/invi_01K0P7W6A4N9F3J2T8Q5R1C6XM/deactivate \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_item_revision": 3
  }'
JSON
{
  "data": {
    "barcode": "0781234567890",
    "created_at": "2026-05-02T11:04:00Z",
    "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_item_revision": 3,
    "metadata": {
      "supplier": "northwind"
    },
    "name": "Ceramic mug, 12oz",
    "sku": "mug-12-white",
    "status": "active",
    "updated_at": "2026-07-14T09:12:00Z"
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

List inventory levels#

GET/v1/inventory-levelsRequires scope: commerce.inventory.read or commerce.inventory.write

List inventory levels. Levels are strongly consistent individually, but pages may reflect different committed instants; use an availability check or route-and-hold for a coherent multi-level decision.

Query parameters
page_sizeinteger

Number of resources to return.

page_tokenstring

Stable cursor returned by the previous page.

inventory_item_idstring

Filter by inventory item.

location_idstring

Filter by Location.

has_available_quantityboolean

Only include levels with available quantity.

has_unavailable_conditionboolean

Only include levels with unavailable physical stock.

has_shortageboolean

Only include levels with a shortage.

updated_afterstring

Lower bound for updated_at.

updated_beforestring

Upper bound for updated_at.

Response · 200
dataarray of objectrequired
metaobject
next_page_tokenstring
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDED
Bash
curl https://api.withflintpay.com/v1/inventory-levels \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": [
    {
      "available_quantity": 31,
      "committed_quantity": 6,
      "created_at": "2026-05-02T11:04:00Z",
      "damaged_quantity": 2,
      "held_quantity": 4,
      "incoming_quantity": 0,
      "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_level_claim_revision": 7,
      "inventory_level_id": "invl_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_level_physical_revision": 9,
      "inventory_level_revision": 18,
      "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "on_hand_quantity": 48,
      "quality_control_quantity": 0,
      "quarantined_quantity": 0,
      "safety_stock_quantity": 5,
      "shortage_quantity": 0,
      "unavailable_on_hand_quantity": 2,
      "updated_at": "2026-07-21T14:18:00Z"
    }
  ],
  "next_page_token": "",
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Get inventory level#

GET/v1/inventory-levels/{inventory_level_id}Requires scope: commerce.inventory.read or commerce.inventory.write

Get inventory level.

Path parameters
inventory_level_idstringrequired

Flint inventory level ID.

Response · 200
dataobjectrequired

The quantity state of one inventory item at one Location.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl https://api.withflintpay.com/v1/inventory-levels/invl_01K0P7W6A4N9F3J2T8Q5R1C6XM \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": {
    "available_quantity": 31,
    "committed_quantity": 6,
    "created_at": "2026-05-02T11:04:00Z",
    "damaged_quantity": 2,
    "held_quantity": 4,
    "incoming_quantity": 0,
    "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_level_claim_revision": 7,
    "inventory_level_id": "invl_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_level_physical_revision": 9,
    "inventory_level_revision": 18,
    "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "on_hand_quantity": 48,
    "quality_control_quantity": 0,
    "quarantined_quantity": 0,
    "safety_stock_quantity": 5,
    "shortage_quantity": 0,
    "unavailable_on_hand_quantity": 2,
    "updated_at": "2026-07-21T14:18:00Z"
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

List inventory movements#

GET/v1/inventory-movementsRequires scope: commerce.inventory.read or commerce.inventory.write

List inventory movements. Filter by idempotency_key to recover the movements a command produced.

Query parameters
page_sizeinteger

Number of resources to return.

page_tokenstring

Stable cursor returned by the previous page.

inventory_item_idstring

Filter by inventory item.

location_idstring

Filter by Location.

typestring

Filter by movement type.

reasonstring

Filter by movement reason.

idempotency_keystring

Recover movements by command idempotency key.

return_idstring

Filter by the customer Return that produced the movement.

return_disposition_idstring

Filter by the Return disposition that produced the movement.

source_system_typeenum

Filter by source-system type.

manualposwmserpflintother
external_source_idstring

Filter by external source ID.

external_actor_idstring

Filter by external actor ID.

occurred_afterstring

Lower bound for occurred_at.

occurred_beforestring

Upper bound for occurred_at.

created_afterstring

Lower bound for created_at.

created_beforestring

Upper bound for created_at.

source_reference_typestring

Filter by source-reference type.

source_reference_idstring

Filter by source-reference ID.

Response · 200
dataarray of objectrequired
metaobject
next_page_tokenstring
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDED
Bash
curl https://api.withflintpay.com/v1/inventory-movements \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": [
    {
      "created_at": "2026-07-21T14:18:04Z",
      "created_by": "usr_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "external_actor_id": "receiver_204",
      "idempotency_key": "receiving-1842",
      "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_level_claim_revision": 7,
      "inventory_level_id": "invl_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_level_physical_revision": 9,
      "inventory_level_revision": 18,
      "inventory_movement_id": "invm_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "note": "Receiving record 1842",
      "occurred_at": "2026-07-21T14:18:00Z",
      "on_hand_quantity_delta": 25,
      "reason": "received_stock",
      "resulting_inventory_level": {
        "available_quantity": 31,
        "committed_quantity": 6,
        "created_at": "2026-05-02T11:04:00Z",
        "damaged_quantity": 2,
        "held_quantity": 4,
        "incoming_quantity": 0,
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_claim_revision": 7,
        "inventory_level_id": "invl_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_physical_revision": 9,
        "inventory_level_revision": 18,
        "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "on_hand_quantity": 48,
        "quality_control_quantity": 0,
        "quarantined_quantity": 0,
        "safety_stock_quantity": 5,
        "shortage_quantity": 0,
        "unavailable_on_hand_quantity": 2,
        "updated_at": "2026-07-21T14:18:00Z"
      },
      "source_system": {
        "external_source_id": "east-coast-wms",
        "type": "wms"
      },
      "type": "adjustment"
    }
  ],
  "next_page_token": "",
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Get inventory movement#

GET/v1/inventory-movements/{inventory_movement_id}Requires scope: commerce.inventory.read or commerce.inventory.write

Get inventory movement.

Path parameters
inventory_movement_idstringrequired

Flint inventory movement ID.

Response · 200
dataobjectrequired

An immutable record of a single quantity change, including the level state it produced.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl https://api.withflintpay.com/v1/inventory-movements/invm_01K0P7W6A4N9F3J2T8Q5R1C6XM \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": {
    "created_at": "2026-07-21T14:18:04Z",
    "created_by": "usr_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "external_actor_id": "receiver_204",
    "idempotency_key": "receiving-1842",
    "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_level_claim_revision": 7,
    "inventory_level_id": "invl_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_level_physical_revision": 9,
    "inventory_level_revision": 18,
    "inventory_movement_id": "invm_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "note": "Receiving record 1842",
    "occurred_at": "2026-07-21T14:18:00Z",
    "on_hand_quantity_delta": 25,
    "reason": "received_stock",
    "resulting_inventory_level": {
      "available_quantity": 31,
      "committed_quantity": 6,
      "created_at": "2026-05-02T11:04:00Z",
      "damaged_quantity": 2,
      "held_quantity": 4,
      "incoming_quantity": 0,
      "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_level_claim_revision": 7,
      "inventory_level_id": "invl_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_level_physical_revision": 9,
      "inventory_level_revision": 18,
      "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "on_hand_quantity": 48,
      "quality_control_quantity": 0,
      "quarantined_quantity": 0,
      "safety_stock_quantity": 5,
      "shortage_quantity": 0,
      "unavailable_on_hand_quantity": 2,
      "updated_at": "2026-07-21T14:18:00Z"
    },
    "source_system": {
      "external_source_id": "east-coast-wms",
      "type": "wms"
    },
    "type": "adjustment"
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

List inventory reallocations#

GET/v1/inventory-reallocationsRequires scope: commerce.inventory.read or commerce.inventory.write

List inventory reallocations.

Query parameters
page_sizeinteger

Number of resources to return.

page_tokenstring

Stable cursor returned by the previous page.

source_inventory_reservation_idstring

Filter by the reservation being replaced.

replacement_inventory_reservation_idstring

Filter by the replacement reservation.

idempotency_keystring

Recover a reallocation by idempotency key.

created_afterstring

Lower bound for created_at.

created_beforestring

Upper bound for created_at.

Response · 200
dataarray of objectrequired
metaobject
next_page_tokenstring
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDED
Bash
curl https://api.withflintpay.com/v1/inventory-reallocations \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": [
    {
      "created_at": "2026-08-02T16:00:00Z",
      "expected_source_inventory_reservation_revision": 0,
      "idempotency_key": "example",
      "inventory_movement_ids": [
        "example"
      ],
      "inventory_reallocation_id": "example",
      "mappings": [
        {
          "quantity": 1,
          "replacement_bucket": "example",
          "replacement_demand_key": "example",
          "replacement_inventory_reservation_line_id": "example",
          "replacement_location_id": "example",
          "source_bucket": "example",
          "source_inventory_reservation_line_id": "example"
        }
      ],
      "replacement_inventory_reservation_id": "example",
      "source_inventory_reservation_id": "example"
    }
  ],
  "next_page_token": "page_2",
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

Create inventory reallocation#

POST/v1/inventory-reallocationsIdempotentRequires scope: commerce.inventory_reservations.write

Atomically replace one reservation's routing with a new reservation while preserving demand lineage.

Request body
assignmentsarray of object
demandsarray of objectrequired
destination_fingerprintstring
expected_source_inventory_reservation_revisionintegerrequired
inventory_routing_sourceone ofrequired
mappingsarray of objectrequired
source_inventory_reservation_idstringrequired
Response · 201
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-reallocations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "demands": [
      {
        "demand_key": "example",
        "inventory_item_id": "example",
        "quantity": 1,
        "splitting_behavior": "single_location"
      }
    ],
    "expected_source_inventory_reservation_revision": 0,
    "inventory_routing_source": {
      "location_id": "loc_01K1P6G4M7H2N8Q9R3S5T6V7WX",
      "type": "fixed_location"
    },
    "mappings": [
      {
        "quantity": 1,
        "replacement_demand_key": "example",
        "replacement_location_id": "example",
        "source_bucket": "example",
        "source_inventory_reservation_line_id": "example"
      }
    ],
    "source_inventory_reservation_id": "example"
  }'
JSON
{
  "data": {
    "created_at": "2026-08-02T16:00:00Z",
    "expected_source_inventory_reservation_revision": 0,
    "idempotency_key": "example",
    "inventory_movement_ids": [
      "example"
    ],
    "inventory_reallocation_id": "example",
    "mappings": [
      {
        "quantity": 1,
        "replacement_bucket": "example",
        "replacement_demand_key": "example",
        "replacement_inventory_reservation_line_id": "example",
        "replacement_location_id": "example",
        "source_bucket": "example",
        "source_inventory_reservation_line_id": "example"
      }
    ],
    "replacement_inventory_reservation_id": "example",
    "source_inventory_reservation_id": "example"
  },
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

Get inventory reallocation#

GET/v1/inventory-reallocations/{inventory_reallocation_id}Requires scope: commerce.inventory.read or commerce.inventory.write

Get inventory reallocation.

Path parameters
inventory_reallocation_idstringrequired

Flint inventory reallocation ID.

Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl https://api.withflintpay.com/v1/inventory-reallocations/{inventory_reallocation_id} \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": {
    "created_at": "2026-08-02T16:00:00Z",
    "expected_source_inventory_reservation_revision": 0,
    "idempotency_key": "example",
    "inventory_movement_ids": [
      "example"
    ],
    "inventory_reallocation_id": "example",
    "mappings": [
      {
        "quantity": 1,
        "replacement_bucket": "example",
        "replacement_demand_key": "example",
        "replacement_inventory_reservation_line_id": "example",
        "replacement_location_id": "example",
        "source_bucket": "example",
        "source_inventory_reservation_line_id": "example"
      }
    ],
    "replacement_inventory_reservation_id": "example",
    "source_inventory_reservation_id": "example"
  },
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

List inventory reservations#

GET/v1/inventory-reservationsRequires scope: commerce.inventory.read or commerce.inventory.write

List inventory reservations.

Query parameters
page_sizeinteger

Number of resources to return.

page_tokenstring

Stable cursor returned by the previous page.

statusenum

Filter by reservation status.

activeclosed
owner_typeenum

Filter by owner type.

merchantmerchant_payment_window
owner_keystring

Filter by exact owner key.

idempotency_keystring

Recover a reservation by idempotency key.

has_at_risk_quantityboolean

Only include reservations with at-risk quantity.

closed_reasonenum

Filter by how the reservation ended.

consumedreleasedexpiredreallocatedmixed
owner_expires_afterstring

Lower bound for the owner deadline.

owner_expires_beforestring

Upper bound for the owner deadline.

created_afterstring

Lower bound for created_at.

created_beforestring

Upper bound for created_at.

updated_afterstring

Lower bound for updated_at.

updated_beforestring

Upper bound for updated_at.

Response · 200
dataarray of objectrequired
metaobject
next_page_tokenstring
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDED
Bash
curl https://api.withflintpay.com/v1/inventory-reservations \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": [
    {
      "created_at": "2026-07-21T14:18:00Z",
      "idempotency_key": "cart-1842-hold",
      "inventory_reservation_id": "invr_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_reservation_revision": 4,
      "inventory_routing_source": {
        "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "type": "policy_version"
      },
      "lines": [
        {
          "allocated_quantity": 3,
          "at_risk_committed_quantity": 0,
          "at_risk_held_quantity": 0,
          "committed_quantity": 2,
          "consumed_quantity": 0,
          "demand_key": "cart_line_1",
          "geography_revision": 2,
          "held_quantity": 1,
          "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "inventory_reservation_line_id": "invrln_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "reallocated_quantity": 0,
          "released_from_committed_quantity": 0,
          "released_from_held_quantity": 0
        }
      ],
      "owner": {
        "expires_at": "2026-07-21T14:33:00Z",
        "key": "cart_1842",
        "type": "merchant"
      },
      "status": "active",
      "updated_at": "2026-07-21T14:21:00Z"
    }
  ],
  "next_page_token": "",
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Create inventory reservation#

POST/v1/inventory-reservationsIdempotentRequires scope: commerce.inventory_reservations.write

Route demand and hold stock in one atomic command. A provisional hold lasts at most 15 minutes before payment ownership.

Request body
option 1object
option 2object
Response · 201
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-reservations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "demands": [
      {
        "demand_key": "cart_line_1",
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "quantity": 2,
        "splitting_behavior": "single_location"
      }
    ],
    "inventory_routing_source": {
      "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "type": "policy_version"
    },
    "owner": {
      "expires_at": "2026-07-21T14:33:00Z",
      "key": "cart_1842",
      "type": "merchant"
    },
    "type": "standalone"
  }'
JSON
{
  "data": {
    "idempotency_key": "cart-1842-hold",
    "inventory_movement_ids": [
      "invm_01K0P7W6A4N9F3J2T8Q5R1C6XM"
    ],
    "inventory_reservation": {
      "created_at": "2026-07-21T14:18:00Z",
      "idempotency_key": "cart-1842-hold",
      "inventory_reservation_id": "invr_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_reservation_revision": 4,
      "inventory_routing_source": {
        "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "type": "policy_version"
      },
      "lines": [
        {
          "allocated_quantity": 3,
          "at_risk_committed_quantity": 0,
          "at_risk_held_quantity": 0,
          "committed_quantity": 2,
          "consumed_quantity": 0,
          "demand_key": "cart_line_1",
          "geography_revision": 2,
          "held_quantity": 1,
          "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "inventory_reservation_line_id": "invrln_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "reallocated_quantity": 0,
          "released_from_committed_quantity": 0,
          "released_from_held_quantity": 0
        }
      ],
      "owner": {
        "expires_at": "2026-07-21T14:33:00Z",
        "key": "cart_1842",
        "type": "merchant"
      },
      "status": "active",
      "updated_at": "2026-07-21T14:21:00Z"
    },
    "resulting_inventory_levels": [
      {
        "available_quantity": 31,
        "committed_quantity": 6,
        "created_at": "2026-05-02T11:04:00Z",
        "damaged_quantity": 2,
        "held_quantity": 4,
        "incoming_quantity": 0,
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_claim_revision": 7,
        "inventory_level_id": "invl_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_physical_revision": 9,
        "inventory_level_revision": 18,
        "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "on_hand_quantity": 48,
        "quality_control_quantity": 0,
        "quarantined_quantity": 0,
        "safety_stock_quantity": 5,
        "shortage_quantity": 0,
        "unavailable_on_hand_quantity": 2,
        "updated_at": "2026-07-21T14:18:00Z"
      }
    ]
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Get inventory reservation#

GET/v1/inventory-reservations/{inventory_reservation_id}Requires scope: commerce.inventory.read or commerce.inventory.write

Get inventory reservation.

Path parameters
inventory_reservation_idstringrequired

Flint inventory reservation ID.

Response · 200
dataobjectrequired

A claim on stock. Quantity moves from held to committed to consumed, and can be released or reallocated.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl https://api.withflintpay.com/v1/inventory-reservations/invr_01K0P7W6A4N9F3J2T8Q5R1C6XM \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": {
    "created_at": "2026-07-21T14:18:00Z",
    "idempotency_key": "cart-1842-hold",
    "inventory_reservation_id": "invr_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_reservation_revision": 4,
    "inventory_routing_source": {
      "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "type": "policy_version"
    },
    "lines": [
      {
        "allocated_quantity": 3,
        "at_risk_committed_quantity": 0,
        "at_risk_held_quantity": 0,
        "committed_quantity": 2,
        "consumed_quantity": 0,
        "demand_key": "cart_line_1",
        "geography_revision": 2,
        "held_quantity": 1,
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_reservation_line_id": "invrln_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "reallocated_quantity": 0,
        "released_from_committed_quantity": 0,
        "released_from_held_quantity": 0
      }
    ],
    "owner": {
      "expires_at": "2026-07-21T14:33:00Z",
      "key": "cart_1842",
      "type": "merchant"
    },
    "status": "active",
    "updated_at": "2026-07-21T14:21:00Z"
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Commit inventory reservation#

POST/v1/inventory-reservations/{inventory_reservation_id}/commitIdempotentRequires scope: commerce.inventory_reservations.write

Move held quantity to committed. Lines carry cumulative targets, so resending an applied target is a successful no-op.

Path parameters
inventory_reservation_idstringrequired

Flint inventory reservation ID.

Request body
expected_inventory_reservation_revisionintegerrequired

Reservation revision the caller last read.

linesarray of objectrequired
Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-reservations/invr_01K0P7W6A4N9F3J2T8Q5R1C6XM/commit \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_reservation_revision": 3,
    "lines": [
      {
        "inventory_reservation_line_id": "invrln_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "target_committed_quantity": 2
      }
    ]
  }'
JSON
{
  "data": {
    "idempotency_key": "cart-1842-hold",
    "inventory_movement_ids": [
      "invm_01K0P7W6A4N9F3J2T8Q5R1C6XM"
    ],
    "inventory_reservation": {
      "created_at": "2026-07-21T14:18:00Z",
      "idempotency_key": "cart-1842-hold",
      "inventory_reservation_id": "invr_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_reservation_revision": 4,
      "inventory_routing_source": {
        "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "type": "policy_version"
      },
      "lines": [
        {
          "allocated_quantity": 3,
          "at_risk_committed_quantity": 0,
          "at_risk_held_quantity": 0,
          "committed_quantity": 2,
          "consumed_quantity": 0,
          "demand_key": "cart_line_1",
          "geography_revision": 2,
          "held_quantity": 1,
          "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "inventory_reservation_line_id": "invrln_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "reallocated_quantity": 0,
          "released_from_committed_quantity": 0,
          "released_from_held_quantity": 0
        }
      ],
      "owner": {
        "expires_at": "2026-07-21T14:33:00Z",
        "key": "cart_1842",
        "type": "merchant"
      },
      "status": "active",
      "updated_at": "2026-07-21T14:21:00Z"
    },
    "resulting_inventory_levels": [
      {
        "available_quantity": 31,
        "committed_quantity": 6,
        "created_at": "2026-05-02T11:04:00Z",
        "damaged_quantity": 2,
        "held_quantity": 4,
        "incoming_quantity": 0,
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_claim_revision": 7,
        "inventory_level_id": "invl_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_physical_revision": 9,
        "inventory_level_revision": 18,
        "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "on_hand_quantity": 48,
        "quality_control_quantity": 0,
        "quarantined_quantity": 0,
        "safety_stock_quantity": 5,
        "shortage_quantity": 0,
        "unavailable_on_hand_quantity": 2,
        "updated_at": "2026-07-21T14:18:00Z"
      }
    ]
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Consume inventory reservation#

POST/v1/inventory-reservations/{inventory_reservation_id}/consumeIdempotentRequires scope: commerce.inventory_reservations.write

Consume committed quantity, permanently removing it from stock. Cumulative targets; consumed quantity is terminal.

Path parameters
inventory_reservation_idstringrequired

Flint inventory reservation ID.

Request body
expected_inventory_reservation_revisionintegerrequired

Reservation revision the caller last read.

linesarray of objectrequired
provenanceobjectrequired

When and where the physical handoff happened. Required on consume, rejected on commit and release.

Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-reservations/invr_01K0P7W6A4N9F3J2T8Q5R1C6XM/consume \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_reservation_revision": 5,
    "lines": [
      {
        "inventory_reservation_line_id": "invrln_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "target_consumed_quantity": 2
      }
    ],
    "provenance": {
      "occurred_at": "2026-07-21T15:40:00Z",
      "source_system": {
        "external_source_id": "east-coast-wms",
        "type": "wms"
      }
    }
  }'
JSON
{
  "data": {
    "idempotency_key": "cart-1842-hold",
    "inventory_movement_ids": [
      "invm_01K0P7W6A4N9F3J2T8Q5R1C6XM"
    ],
    "inventory_reservation": {
      "created_at": "2026-07-21T14:18:00Z",
      "idempotency_key": "cart-1842-hold",
      "inventory_reservation_id": "invr_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_reservation_revision": 4,
      "inventory_routing_source": {
        "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "type": "policy_version"
      },
      "lines": [
        {
          "allocated_quantity": 3,
          "at_risk_committed_quantity": 0,
          "at_risk_held_quantity": 0,
          "committed_quantity": 2,
          "consumed_quantity": 0,
          "demand_key": "cart_line_1",
          "geography_revision": 2,
          "held_quantity": 1,
          "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "inventory_reservation_line_id": "invrln_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "reallocated_quantity": 0,
          "released_from_committed_quantity": 0,
          "released_from_held_quantity": 0
        }
      ],
      "owner": {
        "expires_at": "2026-07-21T14:33:00Z",
        "key": "cart_1842",
        "type": "merchant"
      },
      "status": "active",
      "updated_at": "2026-07-21T14:21:00Z"
    },
    "resulting_inventory_levels": [
      {
        "available_quantity": 31,
        "committed_quantity": 6,
        "created_at": "2026-05-02T11:04:00Z",
        "damaged_quantity": 2,
        "held_quantity": 4,
        "incoming_quantity": 0,
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_claim_revision": 7,
        "inventory_level_id": "invl_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_physical_revision": 9,
        "inventory_level_revision": 18,
        "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "on_hand_quantity": 48,
        "quality_control_quantity": 0,
        "quarantined_quantity": 0,
        "safety_stock_quantity": 5,
        "shortage_quantity": 0,
        "unavailable_on_hand_quantity": 2,
        "updated_at": "2026-07-21T14:18:00Z"
      }
    ]
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Release inventory reservation#

POST/v1/inventory-reservations/{inventory_reservation_id}/releaseIdempotentRequires scope: commerce.inventory_reservations.write

Release held or committed quantity back to available. Cumulative targets; released quantity is terminal.

Path parameters
inventory_reservation_idstringrequired

Flint inventory reservation ID.

Request body
expected_inventory_reservation_revisionintegerrequired

Reservation revision the caller last read.

linesarray of objectrequired
Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-reservations/invr_01K0P7W6A4N9F3J2T8Q5R1C6XM/release \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_reservation_revision": 4,
    "lines": [
      {
        "inventory_reservation_line_id": "invrln_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "target_released_from_held_quantity": 1
      }
    ]
  }'
JSON
{
  "data": {
    "idempotency_key": "cart-1842-hold",
    "inventory_movement_ids": [
      "invm_01K0P7W6A4N9F3J2T8Q5R1C6XM"
    ],
    "inventory_reservation": {
      "created_at": "2026-07-21T14:18:00Z",
      "idempotency_key": "cart-1842-hold",
      "inventory_reservation_id": "invr_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_reservation_revision": 4,
      "inventory_routing_source": {
        "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "type": "policy_version"
      },
      "lines": [
        {
          "allocated_quantity": 3,
          "at_risk_committed_quantity": 0,
          "at_risk_held_quantity": 0,
          "committed_quantity": 2,
          "consumed_quantity": 0,
          "demand_key": "cart_line_1",
          "geography_revision": 2,
          "held_quantity": 1,
          "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "inventory_reservation_line_id": "invrln_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "reallocated_quantity": 0,
          "released_from_committed_quantity": 0,
          "released_from_held_quantity": 0
        }
      ],
      "owner": {
        "expires_at": "2026-07-21T14:33:00Z",
        "key": "cart_1842",
        "type": "merchant"
      },
      "status": "active",
      "updated_at": "2026-07-21T14:21:00Z"
    },
    "resulting_inventory_levels": [
      {
        "available_quantity": 31,
        "committed_quantity": 6,
        "created_at": "2026-05-02T11:04:00Z",
        "damaged_quantity": 2,
        "held_quantity": 4,
        "incoming_quantity": 0,
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_claim_revision": 7,
        "inventory_level_id": "invl_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_physical_revision": 9,
        "inventory_level_revision": 18,
        "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "on_hand_quantity": 48,
        "quality_control_quantity": 0,
        "quarantined_quantity": 0,
        "safety_stock_quantity": 5,
        "shortage_quantity": 0,
        "unavailable_on_hand_quantity": 2,
        "updated_at": "2026-07-21T14:18:00Z"
      }
    ]
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Start inventory reservation payment window#

POST/v1/inventory-reservations/{inventory_reservation_id}/start-payment-windowIdempotentRequires scope: commerce.inventory_reservations.write

Install payment-window ownership once, replacing the provisional deadline with one bounded by payment_window_duration_seconds (1800 second cap, no default and no silent clamp).

Path parameters
inventory_reservation_idstringrequired

Flint inventory reservation ID.

Request body
expected_inventory_reservation_revisionintegerrequired
payment_window_duration_secondsintegerrequired
Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-reservations/invr_01K0P7W6A4N9F3J2T8Q5R1C6XM/start-payment-window \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_reservation_revision": 4,
    "payment_window_duration_seconds": 900
  }'
JSON
{
  "data": {
    "idempotency_key": "cart-1842-hold",
    "inventory_movement_ids": [
      "invm_01K0P7W6A4N9F3J2T8Q5R1C6XM"
    ],
    "inventory_reservation": {
      "created_at": "2026-07-21T14:18:00Z",
      "idempotency_key": "cart-1842-hold",
      "inventory_reservation_id": "invr_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_reservation_revision": 4,
      "inventory_routing_source": {
        "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "type": "policy_version"
      },
      "lines": [
        {
          "allocated_quantity": 3,
          "at_risk_committed_quantity": 0,
          "at_risk_held_quantity": 0,
          "committed_quantity": 2,
          "consumed_quantity": 0,
          "demand_key": "cart_line_1",
          "geography_revision": 2,
          "held_quantity": 1,
          "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "inventory_reservation_line_id": "invrln_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "reallocated_quantity": 0,
          "released_from_committed_quantity": 0,
          "released_from_held_quantity": 0
        }
      ],
      "owner": {
        "expires_at": "2026-07-21T14:33:00Z",
        "key": "cart_1842",
        "type": "merchant"
      },
      "status": "active",
      "updated_at": "2026-07-21T14:21:00Z"
    },
    "resulting_inventory_levels": [
      {
        "available_quantity": 31,
        "committed_quantity": 6,
        "created_at": "2026-05-02T11:04:00Z",
        "damaged_quantity": 2,
        "held_quantity": 4,
        "incoming_quantity": 0,
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_claim_revision": 7,
        "inventory_level_id": "invl_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_physical_revision": 9,
        "inventory_level_revision": 18,
        "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "on_hand_quantity": 48,
        "quality_control_quantity": 0,
        "quarantined_quantity": 0,
        "safety_stock_quantity": 5,
        "shortage_quantity": 0,
        "unavailable_on_hand_quantity": 2,
        "updated_at": "2026-07-21T14:18:00Z"
      }
    ]
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

List inventory return receipts#

GET/v1/inventory-return-receiptsRequires scope: commerce.inventory.read or commerce.inventory.write

List completed inventory receipt effects. Use typed Return filters for reconciliation when the receipt was created by Returns.

Query parameters
page_sizeinteger

Number of resources to return.

page_tokenstring

Stable cursor returned by the previous page.

inventory_item_idstring

Filter by inventory item.

receiving_location_idstring

Filter by receiving Location.

inventory_reservation_idstring

Filter by source reservation.

return_idstring

Filter by the customer Return that produced the receipt.

return_disposition_idstring

Filter by the Return disposition that produced the receipt.

idempotency_keystring

Recover a receipt by command idempotency key.

source_system_typeenum

Filter by source-system type.

manualposwmserpflintother
external_source_idstring

Filter by external source ID.

external_actor_idstring

Filter by external actor ID.

occurred_afterstring

Lower bound for occurred_at.

occurred_beforestring

Upper bound for occurred_at.

created_afterstring

Lower bound for created_at.

created_beforestring

Upper bound for created_at.

Response · 200
dataarray of objectrequired
metaobject
next_page_tokenstring
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDED
Bash
curl https://api.withflintpay.com/v1/inventory-return-receipts \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": [
    {
      "created_at": "2026-07-21T14:18:04Z",
      "idempotency_key": "retdsp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_return_receipt_id": "invret_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "lines": [
        {
          "disposition": "sellable",
          "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "inventory_movement_id": "invm_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "inventory_return_receipt_line_id": "invretln_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "quantity": 1,
          "receiving_location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "return_disposition_id": "retdsp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "return_line_item_id": "retli_01K0P7W6A4N9F3J2T8Q5R1C6XM"
        }
      ],
      "occurred_at": "2026-07-21T14:18:00Z",
      "return_disposition_id": "retdsp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "return_id": "ret_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "source_system": {
        "type": "flint"
      }
    }
  ],
  "next_page_token": "",
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Create inventory return receipt#

POST/v1/inventory-return-receiptsIdempotentRequires scope: commerce.inventory.write

Record a completed inventory receipt and disposition. This is a downstream stock effect, not the customer Return lifecycle.

Request body
external_actor_idstring
linesarray of objectrequired
occurred_atstring

RFC3339 timestamp.

source_systemobjectrequired
Response · 201
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-return-receipts \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "external_actor_id": "receiver_204",
    "lines": [
      {
        "disposition": "sellable",
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "quantity": 1,
        "receiving_location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM"
      }
    ],
    "occurred_at": "2026-07-21T14:18:00Z",
    "source_system": {
      "external_source_id": "east-coast-wms",
      "type": "wms"
    }
  }'
JSON
{
  "data": {
    "idempotency_key": "receiving-1842",
    "inventory_movement_ids": [
      "invm_01K0P7W6A4N9F3J2T8Q5R1C6XM"
    ],
    "inventory_return_receipt": {
      "created_at": "2026-07-21T14:18:04Z",
      "idempotency_key": "retdsp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "inventory_return_receipt_id": "invret_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "lines": [
        {
          "disposition": "sellable",
          "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "inventory_movement_id": "invm_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "inventory_return_receipt_line_id": "invretln_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "quantity": 1,
          "receiving_location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "return_disposition_id": "retdsp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
          "return_line_item_id": "retli_01K0P7W6A4N9F3J2T8Q5R1C6XM"
        }
      ],
      "occurred_at": "2026-07-21T14:18:00Z",
      "return_disposition_id": "retdsp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "return_id": "ret_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "source_system": {
        "type": "flint"
      }
    },
    "resulting_inventory_levels": [
      {
        "available_quantity": 31,
        "committed_quantity": 6,
        "created_at": "2026-05-02T11:04:00Z",
        "damaged_quantity": 2,
        "held_quantity": 4,
        "incoming_quantity": 0,
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_claim_revision": 7,
        "inventory_level_id": "invl_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_physical_revision": 9,
        "inventory_level_revision": 18,
        "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "on_hand_quantity": 48,
        "quality_control_quantity": 0,
        "quarantined_quantity": 0,
        "safety_stock_quantity": 5,
        "shortage_quantity": 0,
        "unavailable_on_hand_quantity": 2,
        "updated_at": "2026-07-21T14:18:00Z"
      }
    ]
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Get inventory return receipt#

GET/v1/inventory-return-receipts/{inventory_return_receipt_id}Requires scope: commerce.inventory.read or commerce.inventory.write

Get inventory return receipt.

Path parameters
inventory_return_receipt_idstringrequired

Flint inventory return receipt ID.

Response · 200
dataobjectrequired

A completed inventory receipt and disposition that changes stock. It is a downstream effect of a customer Return, not the customer Return lifecycle.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl https://api.withflintpay.com/v1/inventory-return-receipts/invret_01K0P7W6A4N9F3J2T8Q5R1C6XM \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": {
    "created_at": "2026-07-21T14:18:04Z",
    "idempotency_key": "retdsp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "inventory_return_receipt_id": "invret_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "lines": [
      {
        "disposition": "sellable",
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_movement_id": "invm_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_return_receipt_line_id": "invretln_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "quantity": 1,
        "receiving_location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "return_disposition_id": "retdsp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "return_line_item_id": "retli_01K0P7W6A4N9F3J2T8Q5R1C6XM"
      }
    ],
    "occurred_at": "2026-07-21T14:18:00Z",
    "return_disposition_id": "retdsp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "return_id": "ret_01K0P7W6A4N9F3J2T8Q5R1C6XM",
    "source_system": {
      "type": "flint"
    }
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Create inventory routing preview#

POST/v1/inventory-routing-previewsRequires scope: commerce.inventory.read or commerce.inventory.write

Project how demand would be assigned to Locations. Advisory only: it holds no stock and is not persisted.

Request body
assignmentsarray of object
demandsarray of objectrequired
destination_fingerprintstring
inventory_routing_sourceone ofrequired
Response · 200
dataobjectrequired

A non-binding projection of how demand would be assigned to Locations. It holds no stock.

metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-routing-previews \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "demands": [
      {
        "demand_key": "cart_line_1",
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "quantity": 6,
        "splitting_behavior": "split_when_required"
      }
    ],
    "inventory_routing_source": {
      "inventory_allocation_policy_id": "invp_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "type": "policy"
    }
  }'
JSON
{
  "data": {
    "assignments": [
      {
        "demand_key": "cart_line_1",
        "geography_revision": 2,
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "quantity": 2
      }
    ],
    "demand_fingerprint": "dmd_9f2c1b7a",
    "expires_at": "2026-07-21T14:33:00Z",
    "inventory_routing_source": {
      "inventory_allocation_policy_version_id": "invpv_01K0P7W6A4N9F3J2T8Q5R1C6XM",
      "type": "policy_version"
    },
    "observed_at": "2026-07-21T14:18:00Z",
    "procedure": "single_location",
    "routing_fingerprint": "rtg_4c8e0d31"
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

Change inventory safety stock#

POST/v1/inventory-safety-stock-changesIdempotentRequires scope: commerce.inventory.write

Set safety stock to an absolute target per level, guarded by expected_safety_stock_quantity. Returns effects without creating a retrievable command resource.

Request body
linesarray of objectrequired
notestring
Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-safety-stock-changes \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "lines": [
      {
        "expected_safety_stock_quantity": 0,
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "target_safety_stock_quantity": 5
      }
    ],
    "note": "Holiday buffer"
  }'
JSON
{
  "data": {
    "idempotency_key": "holiday-buffer-1",
    "inventory_movement_ids": [
      "invm_01K0P7W6A4N9F3J2T8Q5R1C6XM"
    ],
    "lines": [
      {
        "expected_safety_stock_quantity": 0,
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "target_safety_stock_quantity": 5
      }
    ],
    "note": "Holiday buffer",
    "resulting_inventory_levels": [
      {
        "available_quantity": 31,
        "committed_quantity": 6,
        "created_at": "2026-05-02T11:04:00Z",
        "damaged_quantity": 2,
        "held_quantity": 4,
        "incoming_quantity": 0,
        "inventory_item_id": "invi_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_claim_revision": 7,
        "inventory_level_id": "invl_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "inventory_level_physical_revision": 9,
        "inventory_level_revision": 18,
        "location_id": "loc_01K0P7W6A4N9F3J2T8Q5R1C6XM",
        "on_hand_quantity": 48,
        "quality_control_quantity": 0,
        "quarantined_quantity": 0,
        "safety_stock_quantity": 5,
        "shortage_quantity": 0,
        "unavailable_on_hand_quantity": 2,
        "updated_at": "2026-07-21T14:18:00Z"
      }
    ]
  },
  "request_id": "req_01K0P7W6A4N9F3J2T8Q5R1C6XM"
}

List inventory transfers#

GET/v1/inventory-transfersRequires scope: commerce.inventory.read or commerce.inventory.write

List inventory transfers.

Query parameters
page_sizeinteger

Number of resources to return.

page_tokenstring

Stable cursor returned by the previous page.

inventory_item_idstring

Filter by inventory item.

origin_location_idstring

Filter by origin Location.

destination_location_idstring

Filter by destination Location.

statusenum

Filter by transfer status.

draftin_transitpartially_resolvedclosed
idempotency_keystring

Recover a transfer by idempotency key.

external_referencestring

Filter by caller-owned external reference.

closed_reasonenum

Filter by how the transfer ended.

receivedcanceledreceived_with_cancellationreturnedlostmixed
created_afterstring

Lower bound for created_at.

created_beforestring

Upper bound for created_at.

departed_afterstring

Lower bound for departed_at.

departed_beforestring

Upper bound for departed_at.

received_afterstring

Lower bound for received_at.

received_beforestring

Upper bound for received_at.

Response · 200
dataarray of objectrequired
metaobject
next_page_tokenstring
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDED
Bash
curl https://api.withflintpay.com/v1/inventory-transfers \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": [
    {
      "created_at": "2026-08-02T16:00:00Z",
      "destination_location_id": "example",
      "idempotency_key": "example",
      "inventory_transfer_id": "example",
      "inventory_transfer_revision": 0,
      "lines": [
        {
          "canceled_quantity": 1,
          "departed_quantity": 1,
          "inventory_item_id": "example",
          "inventory_transfer_line_id": "example",
          "lost_quantity": 1,
          "physical_condition": "sellable",
          "received_damaged_quantity": 1,
          "received_quality_control_quantity": 1,
          "received_quantity": 1,
          "received_quarantined_quantity": 1,
          "received_sellable_quantity": 1,
          "requested_quantity": 1,
          "returned_quantity": 1
        }
      ],
      "origin_location_id": "example",
      "status": "draft",
      "updated_at": "2026-08-02T16:00:00Z"
    }
  ],
  "next_page_token": "page_2",
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

Create inventory transfer#

POST/v1/inventory-transfersIdempotentRequires scope: commerce.inventory.write

Create a planned stock transfer between two Locations.

Request body
destination_location_idstringrequired
external_referencestring
linesarray of objectrequired
notestring
origin_location_idstringrequired
Response · 201
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-transfers \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "destination_location_id": "example",
    "lines": [
      {
        "inventory_item_id": "example",
        "physical_condition": "sellable",
        "requested_quantity": 1
      }
    ],
    "origin_location_id": "example"
  }'
JSON
{
  "data": {
    "created_at": "2026-08-02T16:00:00Z",
    "destination_location_id": "example",
    "idempotency_key": "example",
    "inventory_transfer_id": "example",
    "inventory_transfer_revision": 0,
    "lines": [
      {
        "canceled_quantity": 1,
        "departed_quantity": 1,
        "inventory_item_id": "example",
        "inventory_transfer_line_id": "example",
        "lost_quantity": 1,
        "physical_condition": "sellable",
        "received_damaged_quantity": 1,
        "received_quality_control_quantity": 1,
        "received_quantity": 1,
        "received_quarantined_quantity": 1,
        "received_sellable_quantity": 1,
        "requested_quantity": 1,
        "returned_quantity": 1
      }
    ],
    "origin_location_id": "example",
    "status": "draft",
    "updated_at": "2026-08-02T16:00:00Z"
  },
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

Get inventory transfer#

GET/v1/inventory-transfers/{inventory_transfer_id}Requires scope: commerce.inventory.read or commerce.inventory.write

Get inventory transfer.

Path parameters
inventory_transfer_idstringrequired

Flint inventory transfer ID.

Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl https://api.withflintpay.com/v1/inventory-transfers/{inventory_transfer_id} \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": {
    "created_at": "2026-08-02T16:00:00Z",
    "destination_location_id": "example",
    "idempotency_key": "example",
    "inventory_transfer_id": "example",
    "inventory_transfer_revision": 0,
    "lines": [
      {
        "canceled_quantity": 1,
        "departed_quantity": 1,
        "inventory_item_id": "example",
        "inventory_transfer_line_id": "example",
        "lost_quantity": 1,
        "physical_condition": "sellable",
        "received_damaged_quantity": 1,
        "received_quality_control_quantity": 1,
        "received_quantity": 1,
        "received_quarantined_quantity": 1,
        "received_sellable_quantity": 1,
        "requested_quantity": 1,
        "returned_quantity": 1
      }
    ],
    "origin_location_id": "example",
    "status": "draft",
    "updated_at": "2026-08-02T16:00:00Z"
  },
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

Update inventory transfer#

PATCH/v1/inventory-transfers/{inventory_transfer_id}IdempotentRequires scope: commerce.inventory.write

Update transfer planning details before stock departs.

Path parameters
inventory_transfer_idstringrequired

Flint inventory transfer ID.

Request body
expected_inventory_transfer_revisionintegerrequired
external_referenceobject
line_changesarray of integer
noteobject
Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X PATCH https://api.withflintpay.com/v1/inventory-transfers/{inventory_transfer_id} \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_transfer_revision": 0
  }'
JSON
{
  "data": {
    "created_at": "2026-08-02T16:00:00Z",
    "destination_location_id": "example",
    "idempotency_key": "example",
    "inventory_transfer_id": "example",
    "inventory_transfer_revision": 0,
    "lines": [
      {
        "canceled_quantity": 1,
        "departed_quantity": 1,
        "inventory_item_id": "example",
        "inventory_transfer_line_id": "example",
        "lost_quantity": 1,
        "physical_condition": "sellable",
        "received_damaged_quantity": 1,
        "received_quality_control_quantity": 1,
        "received_quantity": 1,
        "received_quarantined_quantity": 1,
        "received_sellable_quantity": 1,
        "requested_quantity": 1,
        "returned_quantity": 1
      }
    ],
    "origin_location_id": "example",
    "status": "draft",
    "updated_at": "2026-08-02T16:00:00Z"
  },
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

Cancel inventory transfer#

POST/v1/inventory-transfers/{inventory_transfer_id}/cancelIdempotentRequires scope: commerce.inventory.write

Cancel quantities that have not departed.

Path parameters
inventory_transfer_idstringrequired

Flint inventory transfer ID.

Request body
expected_inventory_transfer_revisionintegerrequired

Transfer revision the caller last read.

linesarray of objectrequired
provenanceobjectrequired
Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-transfers/{inventory_transfer_id}/cancel \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_transfer_revision": 1,
    "lines": [
      {
        "inventory_transfer_line_id": "example",
        "target_canceled_quantity": 0
      }
    ],
    "provenance": {
      "source_system": {
        "type": "manual"
      }
    }
  }'
JSON
{
  "data": {
    "idempotency_key": "example",
    "inventory_movement_ids": [
      "example"
    ],
    "inventory_transfer": {
      "created_at": "2026-08-02T16:00:00Z",
      "destination_location_id": "example",
      "idempotency_key": "example",
      "inventory_transfer_id": "example",
      "inventory_transfer_revision": 0,
      "lines": [
        {
          "canceled_quantity": 1,
          "departed_quantity": 1,
          "inventory_item_id": "example",
          "inventory_transfer_line_id": "example",
          "lost_quantity": 1,
          "physical_condition": "sellable",
          "received_damaged_quantity": 1,
          "received_quality_control_quantity": 1,
          "received_quantity": 1,
          "received_quarantined_quantity": 1,
          "received_sellable_quantity": 1,
          "requested_quantity": 1,
          "returned_quantity": 1
        }
      ],
      "origin_location_id": "example",
      "status": "draft",
      "updated_at": "2026-08-02T16:00:00Z"
    },
    "resulting_inventory_levels": [
      {
        "available_quantity": 1,
        "committed_quantity": 1,
        "created_at": "2026-08-02T16:00:00Z",
        "damaged_quantity": 1,
        "held_quantity": 1,
        "incoming_quantity": 1,
        "inventory_item_id": "example",
        "inventory_level_claim_revision": 1,
        "inventory_level_id": "example",
        "inventory_level_physical_revision": 1,
        "inventory_level_revision": 1,
        "location_id": "loc_01K1P6G4M7H2N8Q9R3S5T6V7WX",
        "on_hand_quantity": 1,
        "quality_control_quantity": 1,
        "quarantined_quantity": 1,
        "safety_stock_quantity": 1,
        "shortage_quantity": 1,
        "unavailable_on_hand_quantity": 1,
        "updated_at": "2026-08-02T16:00:00Z"
      }
    ]
  },
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

Depart inventory transfer#

POST/v1/inventory-transfers/{inventory_transfer_id}/departIdempotentRequires scope: commerce.inventory.write

Move cumulative transfer quantities out of the origin Location.

Path parameters
inventory_transfer_idstringrequired

Flint inventory transfer ID.

Request body
expected_inventory_transfer_revisionintegerrequired

Transfer revision the caller last read.

linesarray of objectrequired
provenanceobjectrequired
Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-transfers/{inventory_transfer_id}/depart \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_transfer_revision": 1,
    "lines": [
      {
        "inventory_transfer_line_id": "example",
        "target_departed_quantity": 0
      }
    ],
    "provenance": {
      "source_system": {
        "type": "manual"
      }
    }
  }'
JSON
{
  "data": {
    "idempotency_key": "example",
    "inventory_movement_ids": [
      "example"
    ],
    "inventory_transfer": {
      "created_at": "2026-08-02T16:00:00Z",
      "destination_location_id": "example",
      "idempotency_key": "example",
      "inventory_transfer_id": "example",
      "inventory_transfer_revision": 0,
      "lines": [
        {
          "canceled_quantity": 1,
          "departed_quantity": 1,
          "inventory_item_id": "example",
          "inventory_transfer_line_id": "example",
          "lost_quantity": 1,
          "physical_condition": "sellable",
          "received_damaged_quantity": 1,
          "received_quality_control_quantity": 1,
          "received_quantity": 1,
          "received_quarantined_quantity": 1,
          "received_sellable_quantity": 1,
          "requested_quantity": 1,
          "returned_quantity": 1
        }
      ],
      "origin_location_id": "example",
      "status": "draft",
      "updated_at": "2026-08-02T16:00:00Z"
    },
    "resulting_inventory_levels": [
      {
        "available_quantity": 1,
        "committed_quantity": 1,
        "created_at": "2026-08-02T16:00:00Z",
        "damaged_quantity": 1,
        "held_quantity": 1,
        "incoming_quantity": 1,
        "inventory_item_id": "example",
        "inventory_level_claim_revision": 1,
        "inventory_level_id": "example",
        "inventory_level_physical_revision": 1,
        "inventory_level_revision": 1,
        "location_id": "loc_01K1P6G4M7H2N8Q9R3S5T6V7WX",
        "on_hand_quantity": 1,
        "quality_control_quantity": 1,
        "quarantined_quantity": 1,
        "safety_stock_quantity": 1,
        "shortage_quantity": 1,
        "unavailable_on_hand_quantity": 1,
        "updated_at": "2026-08-02T16:00:00Z"
      }
    ]
  },
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

Receive inventory transfer#

POST/v1/inventory-transfers/{inventory_transfer_id}/receiveIdempotentRequires scope: commerce.inventory.write

Receive cumulative transfer quantities at the destination Location.

Path parameters
inventory_transfer_idstringrequired

Flint inventory transfer ID.

Request body
expected_inventory_transfer_revisionintegerrequired

Transfer revision the caller last read.

linesarray of objectrequired
provenanceobjectrequired
Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-transfers/{inventory_transfer_id}/receive \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_transfer_revision": 1,
    "lines": [
      {
        "inventory_transfer_line_id": "example",
        "target_received_quantity": 0
      }
    ],
    "provenance": {
      "source_system": {
        "type": "manual"
      }
    }
  }'
JSON
{
  "data": {
    "idempotency_key": "example",
    "inventory_movement_ids": [
      "example"
    ],
    "inventory_transfer": {
      "created_at": "2026-08-02T16:00:00Z",
      "destination_location_id": "example",
      "idempotency_key": "example",
      "inventory_transfer_id": "example",
      "inventory_transfer_revision": 0,
      "lines": [
        {
          "canceled_quantity": 1,
          "departed_quantity": 1,
          "inventory_item_id": "example",
          "inventory_transfer_line_id": "example",
          "lost_quantity": 1,
          "physical_condition": "sellable",
          "received_damaged_quantity": 1,
          "received_quality_control_quantity": 1,
          "received_quantity": 1,
          "received_quarantined_quantity": 1,
          "received_sellable_quantity": 1,
          "requested_quantity": 1,
          "returned_quantity": 1
        }
      ],
      "origin_location_id": "example",
      "status": "draft",
      "updated_at": "2026-08-02T16:00:00Z"
    },
    "resulting_inventory_levels": [
      {
        "available_quantity": 1,
        "committed_quantity": 1,
        "created_at": "2026-08-02T16:00:00Z",
        "damaged_quantity": 1,
        "held_quantity": 1,
        "incoming_quantity": 1,
        "inventory_item_id": "example",
        "inventory_level_claim_revision": 1,
        "inventory_level_id": "example",
        "inventory_level_physical_revision": 1,
        "inventory_level_revision": 1,
        "location_id": "loc_01K1P6G4M7H2N8Q9R3S5T6V7WX",
        "on_hand_quantity": 1,
        "quality_control_quantity": 1,
        "quarantined_quantity": 1,
        "safety_stock_quantity": 1,
        "shortage_quantity": 1,
        "unavailable_on_hand_quantity": 1,
        "updated_at": "2026-08-02T16:00:00Z"
      }
    ]
  },
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

Report inventory transfer loss#

POST/v1/inventory-transfers/{inventory_transfer_id}/report-lossIdempotentRequires scope: commerce.inventory.write

Record cumulative in-transit quantities as lost.

Path parameters
inventory_transfer_idstringrequired

Flint inventory transfer ID.

Request body
expected_inventory_transfer_revisionintegerrequired

Transfer revision the caller last read.

linesarray of objectrequired
provenanceobjectrequired
Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-transfers/{inventory_transfer_id}/report-loss \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_transfer_revision": 1,
    "lines": [
      {
        "inventory_transfer_line_id": "example",
        "target_lost_quantity": 0
      }
    ],
    "provenance": {
      "source_system": {
        "type": "manual"
      }
    }
  }'
JSON
{
  "data": {
    "idempotency_key": "example",
    "inventory_movement_ids": [
      "example"
    ],
    "inventory_transfer": {
      "created_at": "2026-08-02T16:00:00Z",
      "destination_location_id": "example",
      "idempotency_key": "example",
      "inventory_transfer_id": "example",
      "inventory_transfer_revision": 0,
      "lines": [
        {
          "canceled_quantity": 1,
          "departed_quantity": 1,
          "inventory_item_id": "example",
          "inventory_transfer_line_id": "example",
          "lost_quantity": 1,
          "physical_condition": "sellable",
          "received_damaged_quantity": 1,
          "received_quality_control_quantity": 1,
          "received_quantity": 1,
          "received_quarantined_quantity": 1,
          "received_sellable_quantity": 1,
          "requested_quantity": 1,
          "returned_quantity": 1
        }
      ],
      "origin_location_id": "example",
      "status": "draft",
      "updated_at": "2026-08-02T16:00:00Z"
    },
    "resulting_inventory_levels": [
      {
        "available_quantity": 1,
        "committed_quantity": 1,
        "created_at": "2026-08-02T16:00:00Z",
        "damaged_quantity": 1,
        "held_quantity": 1,
        "incoming_quantity": 1,
        "inventory_item_id": "example",
        "inventory_level_claim_revision": 1,
        "inventory_level_id": "example",
        "inventory_level_physical_revision": 1,
        "inventory_level_revision": 1,
        "location_id": "loc_01K1P6G4M7H2N8Q9R3S5T6V7WX",
        "on_hand_quantity": 1,
        "quality_control_quantity": 1,
        "quarantined_quantity": 1,
        "safety_stock_quantity": 1,
        "shortage_quantity": 1,
        "unavailable_on_hand_quantity": 1,
        "updated_at": "2026-08-02T16:00:00Z"
      }
    ]
  },
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}

Return inventory transfer to origin#

POST/v1/inventory-transfers/{inventory_transfer_id}/return-to-originIdempotentRequires scope: commerce.inventory.write

Return cumulative in-transit quantities to the origin Location.

Path parameters
inventory_transfer_idstringrequired

Flint inventory transfer ID.

Request body
expected_inventory_transfer_revisionintegerrequired

Transfer revision the caller last read.

linesarray of objectrequired
provenanceobjectrequired
Response · 200
dataobjectrequired
metaobject
request_idstring

Error codes

AUTH_REQUIREDINSUFFICIENT_SCOPEINVALID_REQUESTRATE_LIMIT_EXCEEDEDRESOURCE_NOT_FOUND
Bash
curl -X POST https://api.withflintpay.com/v1/inventory-transfers/{inventory_transfer_id}/return-to-origin \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_inventory_transfer_revision": 1,
    "lines": [
      {
        "inventory_transfer_line_id": "example",
        "target_returned_quantity": 0
      }
    ],
    "provenance": {
      "source_system": {
        "type": "manual"
      }
    }
  }'
JSON
{
  "data": {
    "idempotency_key": "example",
    "inventory_movement_ids": [
      "example"
    ],
    "inventory_transfer": {
      "created_at": "2026-08-02T16:00:00Z",
      "destination_location_id": "example",
      "idempotency_key": "example",
      "inventory_transfer_id": "example",
      "inventory_transfer_revision": 0,
      "lines": [
        {
          "canceled_quantity": 1,
          "departed_quantity": 1,
          "inventory_item_id": "example",
          "inventory_transfer_line_id": "example",
          "lost_quantity": 1,
          "physical_condition": "sellable",
          "received_damaged_quantity": 1,
          "received_quality_control_quantity": 1,
          "received_quantity": 1,
          "received_quarantined_quantity": 1,
          "received_sellable_quantity": 1,
          "requested_quantity": 1,
          "returned_quantity": 1
        }
      ],
      "origin_location_id": "example",
      "status": "draft",
      "updated_at": "2026-08-02T16:00:00Z"
    },
    "resulting_inventory_levels": [
      {
        "available_quantity": 1,
        "committed_quantity": 1,
        "created_at": "2026-08-02T16:00:00Z",
        "damaged_quantity": 1,
        "held_quantity": 1,
        "incoming_quantity": 1,
        "inventory_item_id": "example",
        "inventory_level_claim_revision": 1,
        "inventory_level_id": "example",
        "inventory_level_physical_revision": 1,
        "inventory_level_revision": 1,
        "location_id": "loc_01K1P6G4M7H2N8Q9R3S5T6V7WX",
        "on_hand_quantity": 1,
        "quality_control_quantity": 1,
        "quarantined_quantity": 1,
        "safety_stock_quantity": 1,
        "shortage_quantity": 1,
        "unavailable_on_hand_quantity": 1,
        "updated_at": "2026-08-02T16:00:00Z"
      }
    ]
  },
  "request_id": "req_01K1P6G4M7H2N8Q9R3S5T6V7WX"
}
Rate this doc