Return reasons

Return reasons are stable, merchant-visible explanations for why a buyer requested a Return. Flint provides a default reason set, and merchants can add or archive their own reasons. Return lines freeze the selected reason identity and display name so archived reasons remain understandable in historical records.

Built-in reasons#

These reasons are available in every merchant environment without setup. Send the ID in line_items[].return_reason_id; the handle alone is not accepted. Built-in reasons cannot be edited or archived. A reason that requires a note also requires buyer_note on the return line.

HandleReturn reason IDNote required
changed_mindrrsn_1T6HXAX0CEXP6YA5K1T392KJE6No
too_smallrrsn_7264NP74WFWQFJM9ZK37KGBW31No
too_largerrsn_51T64508KCQ9TX9BXY67TPM3ZQNo
damaged_on_arrivalrrsn_5PACJDCF4YPWRCH9JNP5Y6THDQYes
defectiverrsn_3BQ939HAEA2C8N5QWG4ZSDA7HVYes
wrong_itemrrsn_33250Y53P4V7EV7XZ3GYHRQHCAYes
arrived_laterrsn_0EMCCQEJKQJJCNP72CJ98MMXG5No
no_longer_neededrrsn_51572JN88BP55HN0V6EYDQ1K3HNo
otherrrsn_0G0YF6HGRX0HCWX4939BQNMC8MYes

Reason vocabularies#

Buyer reasons are distinct from inspection findings, decline reasons, override reasons, and Refund reasons. Keep those facts separate even when their human wording is similar: a buyer saying "damaged" and a warehouse finding damaged are different claims about the same parcel, and the difference is the point when one of them is wrong.

VocabularySupplied byField
Return reasonThe buyerreturn_reason_id on the Return line
Inspection findingThe warehousefinding_codes on an inspection line
Decline reasonThe merchantdecline_reason on a decision
Override reasonThe merchantoverride_reason, required when deviating from an active policy
Refund reasonFlintreason on the Refund, mapped from the buyer's return reason

A Refund raised by a Return resolution derives its own reason from the buyer's: defective becomes defective_product, wrong_item becomes wrong_item_shipped, too_small, too_large, and damaged_on_arrival become not_as_described, arrived_late becomes arrived_too_late, changed_mind becomes customer_changed_mind, and no_longer_needed becomes requested_by_customer. Reasons you define yourself have no equivalent and map to other, as does a Refund covering lines that gave different reasons.

Writes#

handle is the stable identifier you match on; name is what a buyer reads. is_note_required forces a free-text note when the reason is chosen, which is worth setting on anything you would otherwise have to email the buyer about.

When updating a merchant reason, omit category_handles to keep the current list and send category_handles: [] to clear it. Send description: null to clear the description.

Archiving stops buyers selecting a reason. Returns that already recorded it keep the frozen name, so tidying the list never changes what an old Return means.

The Return reason object#

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

Attributes

category_handlesarray of stringRequired
created_atstringRequired

RFC3339 timestamp.

descriptionstring
external_reference_idstring

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

handlestringRequired
is_note_requiredbooleanRequired
namestringRequired
return_reason_idstringRequired
sourceenumRequired
  • flint
  • merchant
statusenumRequired
  • active
  • archived
supported_actionsarray of stringRequired
updated_atstringRequired

RFC3339 timestamp.

versionintegerRequired

List return reasons#

GET/v1/return-reasons

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 Return reasons, including Flint-provided defaults and merchant-defined reasons.

Query parameters

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 reason ID, handle, name, description, or external reference ID.

sourceenum

Filter by source.

  • flint
  • merchant
statusarray of enum

Filter by status.

  • active
  • archived

Response · 200

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

Create return reason#

POST/v1/return-reasonsIdempotent

Requires scope commerce.return_reasons.write

Create a merchant Return reason buyers can select. Buyer reasons are distinct from inspection findings, decline reasons, and Refund reasons.

Request body

category_handlesarray of string
descriptionstring
external_reference_idstring

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

handlestringRequired
is_note_requiredboolean
namestringRequired

Response · 201

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

Update return reason#

PATCH/v1/return-reasons/{return_reason_id}Idempotent

Requires scope commerce.return_reasons.write

Update a Return reason. Send null to clear description. A present category_handles array replaces the existing set.

Path parameters

return_reason_idstringRequired

Flint return reason id.

Request body

category_handlesarray of string
descriptionstring or null
expected_versioninteger
external_reference_idstring or null

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

is_note_requiredboolean
namestring

Response · 200

Same response as Create return reason.

curl -X PATCH https://api.withflintpay.com/v1/return-reasons/{return_reason_id} \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "category_handles": [
      ""
    ],
    "description": "",
    "expected_version": 0,
    "external_reference_id": "",
    "is_note_required": false,
    "name": ""
  }'
curl -X DELETE https://api.withflintpay.com/v1/return-reasons/{return_reason_id} \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

Was this helpful?