Return operations

Return operations record physical facts. Receipts state what reached a Flint Location, inspections state what an operator observed, and dispositions authorize the final merchandise outcome. Corrections create superseding observations instead of editing history.

These routes use the commerce.returns.operations.write scope and do not grant refund or resolution authority. That separation lets a warehouse or WMS integration record custody and condition without permission to move buyer funds. POST /v1/returns/{return_id}/process combines this work with decisions and resolutions, so it requires all three scopes: commerce.returns.write, commerce.returns.operations.write, and commerce.returns.resolutions.write. The Receiving and inspecting guide walks one parcel through all three.

Receipts and inspections are immutable observations. Before another fact consumes an observation, correct it by creating a replacement carrying supersedes_return_receipt_id (or the inspection equivalent) and a correction_reason. The original stays readable with an observation status of superseded. A receipt cannot be corrected after an inspection or disposition consumes it. Because automatic receipt disposition consumes matched merchandise immediately, use a policy revision with receipt_disposition_mode: manual when your workflow needs a receipt-correction window.

Receipt line shapes#

A receipt line takes one of three shapes, and the shape decides what its quantity is allowed to do next.

ShapeSendEffect
Matchedreturn_line_item_idCounts toward received_quantity and releases after_receipt refund timing
Unverifiedunverified_item with a name and SKUCounts toward no line and releases no gate. Raises a merchandise_exception blocker until verified
Excessquantity beyond what was approvedCounts as excess

Verify an unidentified line with POST /v1/return-receipts/{return_receipt_id}/line-items/{return_receipt_line_item_id}/verify once an operator establishes the identity. Unverified and excess quantity can only take a non-inventory outcome such as discard, donate, or return_to_buyer, because Flint does not know which inventory item to increase.

Inspections#

An inspection names the return_receipt_id it is checking and the location_id it happened at. Each line answers three separate questions, and all three are required:

  • condition grades the item: new, unopened, opened, used, damaged, defective, incomplete, undetermined. Choose undetermined when the item's condition could not be assessed.
  • finding_codes records what was discovered: matches_expected_item, wrong_item, damaged, defective, used, missing_parts, empty_package, counterfeit_suspected, other.
  • acceptance_status is the call: accepted, rejected, or review_required.

Several words appear in both condition and finding_codes and mean different things there, so read the field name alongside the value.

Accepted quantity satisfies after_inspection refund timing. Under manual receipt disposition, it becomes dispositionable. Under automatic receipt disposition, acceptance creates a successful sellable disposition and returns it in generated_dispositions. review_required defers the call instead: it raises an inspection_review_required blocker that holds the Return open until POST /v1/return-inspections/{return_inspection_id}/line-items/{return_inspection_line_item_id}/decide settles it with an acceptance_status and an acceptance_decision_reason of inspection_result, return_policy, manual_review, or other. The /decide route only settles review_required; correct an accepted or rejected call with a superseding inspection before a disposition consumes it.

Dispositions#

A disposition targets either a receipt line or an inspection line, never both. Four of the eleven types change stock levels at the inventory_location_id you name.

Disposition typeStock effectinventory_location_id
sellableAdds to sellable stockRequired
quality_controlOn hand, not sellableRequired
damagedOn hand, not sellableRequired
quarantinedOn hand, not sellableRequired
lostNone. Records that the unit never arrivedRequired
repair, refurbish, liquidate, donate, discard, return_to_buyerNoneRejected

lost takes a location but moves no stock; it records where the loss was booked. The last row rejects inventory_location_id rather than ignoring it, so sending one fails the request.

A failed disposition exposes retry, which preserves the disposition and effect identities so stock cannot move twice. When the type, destination, quantity, or source has changed, create a new disposition naming replaces_return_disposition_id instead. Replacement transfers only unused capacity, and both retry and replacement are refused once an inventory effect starts processing.

The Return operation object#

Every field on a return operation, as returned by retrieve and carried by the endpoints below.

Attributes

canceled_atstring

RFC3339 timestamp.

created_atstringRequired

RFC3339 timestamp.

created_byobjectRequired
disposition_typeenumRequired
  • sellable
  • quality_control
  • damaged
  • quarantined
  • repair
  • refurbish
  • liquidate
  • donate
  • discard
  • return_to_buyer
  • lost
external_reference_idstring

Caller-owned identifier for this resource in an external system.

failure_codestring

Reason code for a failed merchandise disposition, when available.

failure_messagestring

Explanation of a failed merchandise disposition, when available.

inventory_location_idstring
inventory_movement_idsarray of stringRequired
inventory_receipt_idstring
metadatamap of stringRequired
occurred_atstringRequired

RFC3339 timestamp.

quantityintegerRequired

Whole-number quantity; fractional quantities are not supported.

reasonenumRequired
  • inspection_result
  • return_policy
  • warehouse_override
  • safety_requirement
  • other
reason_messagestring
replaced_by_return_disposition_idstring
replaces_return_disposition_idstring
return_disposition_idstringRequired
return_idstringRequired
return_inspection_line_item_idstring
return_line_item_idstring
return_receipt_line_item_idstring
statusenumRequired
  • pending
  • succeeded
  • failed
  • canceled
supported_actionsarray of stringRequired
updated_atstringRequired

RFC3339 timestamp.

versionintegerRequired

List return dispositions#

GET/v1/return-dispositions

Requires scope commerce.return_policies.write or commerce.return_reasons.write or commerce.returns.operations.write or commerce.returns.read or commerce.returns.resolutions.write or commerce.returns.write

List merchandise dispositions. Omitting return_id lists dispositions across every Return for the merchant.

Query parameters

created_afterstring

RFC3339 created after filter.

created_beforestring

RFC3339 created before filter.

disposition_typeenum

Filter by disposition type.

  • sellable
  • quality_control
  • damaged
  • quarantined
  • repair
  • refurbish
  • liquidate
  • donate
  • discard
  • return_to_buyer
  • lost
external_reference_idstring

Exact-match filter on the caller-owned external reference ID.

inventory_location_idstring

Filter by inventory location id.

occurred_afterstring

RFC3339 occurred after filter.

occurred_beforestring

RFC3339 occurred before filter.

page_sizeinteger

Page size. Defaults to 20 and is capped at 100.

page_tokenstring

Opaque cursor returned by the previous page.

querystring

Search by return disposition ID or external reference ID.

replaces_return_disposition_idstring

Filter by replaces return disposition id.

return_idstring

Filter by return id.

return_inspection_line_item_idstring

Filter by return inspection line item id.

return_line_item_idstring

Filter by return line item id.

return_receipt_line_item_idstring

Filter by return receipt line item id.

statusenum

Filter by status.

  • pending
  • succeeded
  • failed
  • canceled
updated_afterstring

RFC3339 updated after filter.

updated_beforestring

RFC3339 updated before filter.

Response · 200

dataarray of objectRequired
metaobject
next_page_tokenstring
request_idstring
curl https://api.withflintpay.com/v1/return-dispositions \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

Get return disposition#

GET/v1/return-dispositions/{return_disposition_id}

Requires scope commerce.return_policies.write or commerce.return_reasons.write or commerce.returns.operations.write or commerce.returns.read or commerce.returns.resolutions.write or commerce.returns.write

Retrieve one disposition with its type, destination, quantity, status, and any linked inventory effect.

Path parameters

return_disposition_idstringRequired

Flint return disposition id.

Response · 200

dataobjectRequired
metaobject
request_idstring
curl https://api.withflintpay.com/v1/return-dispositions/retdsp_01K0P7W6A4N9F3J2T8Q5R1C6XM \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"
curl -X POST https://api.withflintpay.com/v1/return-dispositions/retdsp_01K0P7W6A4N9F3J2T8Q5R1C6XM/cancel \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "reason": "created_in_error"
  }'

Retry return disposition#

POST/v1/return-dispositions/{return_disposition_id}/retryIdempotent

Requires scope commerce.returns.operations.write

Retry a failed disposition with the same immutable intent. Disposition and effect identities are preserved, so a retry does not move stock twice.

Path parameters

return_disposition_idstringRequired

Flint return disposition id.

Request body

expected_versioninteger
reasonenumRequired
  • dependency_recovered
  • mapping_corrected
  • operator_retry
  • other
reason_messagestring

Response · 200

Same response as Get return disposition.

curl -X POST https://api.withflintpay.com/v1/return-dispositions/retdsp_01K0P7W6A4N9F3J2T8Q5R1C6XM/retry \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "reason": "dependency_recovered"
  }'

List return inspections#

GET/v1/return-inspections

Requires scope commerce.return_policies.write or commerce.return_reasons.write or commerce.returns.operations.write or commerce.returns.read or commerce.returns.resolutions.write or commerce.returns.write

List inspection observations. Omitting return_id lists inspections across every Return for the merchant.

Query parameters

acceptance_statusenum

Filter by acceptance status.

  • accepted
  • rejected
  • review_required
created_afterstring

RFC3339 created after filter.

created_beforestring

RFC3339 created before filter.

external_reference_idstring

Exact-match filter on the caller-owned external reference ID.

inspected_afterstring

RFC3339 inspected after filter.

inspected_beforestring

RFC3339 inspected before filter.

location_idstring

Filter by location id.

page_sizeinteger

Page size. Defaults to 20 and is capped at 100.

page_tokenstring

Opaque cursor returned by the previous page.

querystring

Search by return inspection ID or external reference ID.

return_idstring

Filter by return id.

return_line_item_idstring

Filter by return line item id.

return_receipt_idstring

Filter by return receipt id.

source_system_typeenum

Filter by source system type.

  • manual
  • pos
  • wms
  • erp
  • other
  • flint
statusenum

Filter by status.

  • current
  • superseded

Response · 200

dataarray of objectRequired
metaobject
next_page_tokenstring
request_idstring
curl https://api.withflintpay.com/v1/return-inspections \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

Get return inspection#

GET/v1/return-inspections/{return_inspection_id}

Requires scope commerce.return_policies.write or commerce.return_reasons.write or commerce.returns.operations.write or commerce.returns.read or commerce.returns.resolutions.write or commerce.returns.write

Retrieve one inspection with its line items, findings, and current or superseded observation status.

Path parameters

return_inspection_idstringRequired

Flint return inspection id.

Response · 200

dataobjectRequired
metaobject
request_idstring
curl https://api.withflintpay.com/v1/return-inspections/{return_inspection_id} \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

Decide return inspection line item#

POST/v1/return-inspections/{return_inspection_id}/line-items/{return_inspection_line_item_id}/decideIdempotent

Requires scope commerce.returns.operations.write

Record the accept or reject outcome for inspected quantity. Accepted quantity becomes dispositionable and satisfies after_inspection refund timing.

Path parameters

return_inspection_idstringRequired

Flint return inspection id.

return_inspection_line_item_idstringRequired

Flint return inspection line item id.

Request body

acceptance_decision_reasonenumRequired
  • inspection_result
  • return_policy
  • manual_review
  • other
acceptance_decision_reason_messagestring
acceptance_statusenumRequired
  • accepted
  • rejected
  • review_required
expected_versioninteger

Response · 200

Same response as Get return inspection.

curl -X POST https://api.withflintpay.com/v1/return-inspections/{return_inspection_id}/line-items/{return_inspection_line_item_id}/decide \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "acceptance_decision_reason": "inspection_result",
    "acceptance_status": "accepted"
  }'

List return receipts#

GET/v1/return-receipts

Requires scope commerce.return_policies.write or commerce.return_reasons.write or commerce.returns.operations.write or commerce.returns.read or commerce.returns.resolutions.write or commerce.returns.write

List merchandise receipts. Omitting return_id lists receipts across every Return for the merchant.

Query parameters

created_afterstring

RFC3339 created after filter.

created_beforestring

RFC3339 created before filter.

external_reference_idstring

Exact-match filter on the caller-owned external reference ID.

page_sizeinteger

Page size. Defaults to 20 and is capped at 100.

page_tokenstring

Opaque cursor returned by the previous page.

querystring

Search by return receipt ID or external reference ID.

received_afterstring

RFC3339 received after filter.

received_beforestring

RFC3339 received before filter.

receiving_location_idstring

Filter by receiving location id.

return_idstring

Filter by return id.

return_line_item_idstring

Filter by return line item id.

shipment_idstring

Filter by shipment id.

source_system_typeenum

Filter by source system type.

  • manual
  • pos
  • wms
  • erp
  • other
  • flint
statusenum

Filter by status.

  • current
  • superseded
verification_statusenum

Filter by verification status.

  • matched
  • unverified
  • excess

Response · 200

dataarray of objectRequired
metaobject
next_page_tokenstring
request_idstring
curl https://api.withflintpay.com/v1/return-receipts \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

Get return receipt#

GET/v1/return-receipts/{return_receipt_id}

Requires scope commerce.return_policies.write or commerce.return_reasons.write or commerce.returns.operations.write or commerce.returns.read or commerce.returns.resolutions.write or commerce.returns.write

Retrieve one merchandise receipt with its line items and its current or superseded observation status.

Path parameters

return_receipt_idstringRequired

Flint return receipt id.

Response · 200

dataobjectRequired
metaobject
request_idstring
curl https://api.withflintpay.com/v1/return-receipts/{return_receipt_id} \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

Verify return receipt line item#

POST/v1/return-receipts/{return_receipt_id}/line-items/{return_receipt_line_item_id}/verifyIdempotent

Requires scope commerce.returns.operations.write

Establish the Return line identity for receipt quantity that arrived without one. Unverified quantity counts toward no line and releases no refund timing gate until it is verified.

Path parameters

return_receipt_idstringRequired

Flint return receipt id.

return_receipt_line_item_idstringRequired

Flint return receipt line item id.

Request body

expected_versioninteger
return_line_item_idstringRequired
verification_reasonenumRequired
  • order_match_confirmed
  • sku_match_confirmed
  • inspection_confirmed
  • merchant_review
  • other
verification_reason_messagestring

Response · 200

Same response as Get return receipt.

curl -X POST https://api.withflintpay.com/v1/return-receipts/{return_receipt_id}/line-items/{return_receipt_line_item_id}/verify \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "return_line_item_id": "",
    "verification_reason": "order_match_confirmed"
  }'

Create return disposition#

POST/v1/returns/{return_id}/dispositionsIdempotent

Requires scope commerce.returns.operations.write

Record an auditable merchandise disposition from either a receipt line or an inspection line.

Path parameters

return_idstringRequired

Flint return id.

Request body

Send exactly one of these

disposition_typeenumRequired
  • sellable
  • quality_control
  • damaged
  • quarantined
  • repair
  • refurbish
  • liquidate
  • donate
  • discard
  • return_to_buyer
  • lost
external_reference_idstring

Caller-owned identifier for this resource in an external system.

inventory_location_idstring
metadatamap of string
occurred_atstringRequired

RFC3339 timestamp.

quantityintegerRequired

Whole-number quantity; fractional quantities are not supported.

reasonenumRequired
  • inspection_result
  • return_policy
  • warehouse_override
  • safety_requirement
  • other
reason_messagestring
replaces_return_disposition_idstring
return_receipt_line_item_idstringRequired

Response · 201

Same response as Get return disposition.

curl -X POST https://api.withflintpay.com/v1/returns/ret_01K0P7W6A4N9F3J2T8Q5R1C6XM/dispositions \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "disposition_type": "sellable",
    "occurred_at": "",
    "quantity": 0,
    "reason": "inspection_result"
  }'

Create return inspection#

POST/v1/returns/{return_id}/inspectionsIdempotent

Requires scope commerce.returns.operations.write

Record an immutable inspection observation. Corrections supersede an earlier inspection instead of editing physical history.

Path parameters

return_idstringRequired

Flint return id.

Request body

correction_reasonenum
  • entry_error
  • duplicate_observation
  • source_correction
  • reconciliation_correction
  • other
correction_reason_messagestring
external_actor_idstring
external_reference_idstring

Caller-owned identifier for this resource in an external system.

inspected_atstringRequired

RFC3339 timestamp.

line_itemsarray of objectRequired
location_idstringRequired
return_receipt_idstringRequired
source_systemobject
supersedes_return_inspection_idstring

Response · 201

Same response as Get return inspection.

curl -X POST https://api.withflintpay.com/v1/returns/ret_01K0P7W6A4N9F3J2T8Q5R1C6XM/inspections \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "inspected_at": "",
    "line_items": [
      {
        "acceptance_status": "accepted",
        "condition": "new",
        "quantity": 0,
        "return_receipt_line_item_id": ""
      }
    ],
    "location_id": "",
    "return_receipt_id": ""
  }'

Create return receipt#

POST/v1/returns/{return_id}/receiptsIdempotent

Requires scope commerce.returns.operations.write

Record an immutable merchandise receipt observation. Corrections supersede an earlier receipt instead of editing physical history.

Path parameters

return_idstringRequired

Flint return id.

Request body

correction_reasonenum
  • entry_error
  • duplicate_observation
  • source_correction
  • reconciliation_correction
  • other
correction_reason_messagestring
external_actor_idstring
external_reference_idstring

Caller-owned identifier for this resource in an external system.

line_itemsarray of one ofRequired
received_atstringRequired

RFC3339 timestamp.

receiving_location_idstringRequired
shipment_idstring
source_systemobject
supersedes_return_receipt_idstring

Response · 201

Same response as Get return receipt.

curl -X POST https://api.withflintpay.com/v1/returns/ret_01K0P7W6A4N9F3J2T8Q5R1C6XM/receipts \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "line_items": [
      {
        "quantity": 0
      }
    ],
    "received_at": "",
    "receiving_location_id": ""
  }'

Was this helpful?