Ingrid Returns Partner API (1.0.0)

Download OpenAPI specification:

The Ingrid Returns API enables e-commerce platforms and merchants to integrate with Ingrid's returns platform using only an API key.

Integration model

Ingrid operates on an inverted integration model -- instead of Ingrid calling your APIs, you push data to Ingrid and Ingrid notifies you via webhooks when action is required on your side (e.g. issuing a refund). You then confirm completion back to Ingrid.

Authentication

All requests require an x-api-key header containing your merchant API key.

Monetary values

All monetary values in the API are decimal numbers in the currency's major unit. For example, 19.99 means 19 euros and 99 cents, not 1999 cents. The currency is always specified alongside money amounts via a currencyCode field using ISO 4217 codes (e.g. "SEK", "EUR", "GBP").

Integration flow -- step by step

This section describes the full lifecycle of an e-commerce integration with Ingrid Returns, from order placement through to refund completion.

Step 1: Sync your product catalog (mandatory)

Before pushing orders, sync your product catalog to Ingrid using POST /products. Each product should include its variants. Orders reference products by productId and variantId, so products must exist before orders that reference them can be created.

You only need to push each product once -- call POST /products again to update product data (title, images, variants, etc.) at any time.

Step 2: Push orders (mandatory)

When a customer places an order, push it to Ingrid using POST /orders. Line items reference products and variants by ID -- Ingrid uses the product data to show product information in the return portal.

When the order is fulfilled (shipped), call POST /orders again (or PATCH /orders/{orderId}) to add shipment and tracking information. Ingrid uses this to determine return eligibility and to track inbound return parcels.

Step 3: Customer initiates a return

Returns are typically initiated by the customer through Ingrid's return portal, which you embed on your site or link to from order confirmation emails. The portal handles reason selection, return shipping method, and label generation.

Alternatively, you can create returns programmatically via POST /orders/{orderId}/returns -- for example from your own customer service tool or a custom return flow.

You can track return progress by polling GET /returns or by subscribing to webhook events.

Step 4: Warehouse receives the return (choose one)

When the returned items physically arrive at your warehouse, someone needs to report what was received and in what condition. Ingrid supports three ways to do this -- choose the one that fits your operations:

Option A: Warehouse report via API (this API) If you run your own warehouse or have a custom WMS, submit a warehouse report via POST /warehouse-reports. Specify which return, order, or tracking reference the report is for, and for each returned item indicate whether it was received in acceptable condition (APPROVED) or not (DENIED).

Option B: Supported WMS integration Ingrid has built-in integrations with several warehouse management systems (e.g. Ongoing, ShipHero, ShipMonk, and others). If your WMS is supported, warehouse reports are created automatically when your warehouse processes the return. WMS integrations can be configured through the Ingrid backoffice.

Option C: Ingrid backoffice Quality Check If you prefer a manual workflow, warehouse staff can use the Ingrid backoffice to inspect returned items and submit a quality check report.

Regardless of which option you choose, the outcome is the same: approved items proceed to refund calculation, denied items do not.

Step 5: Refund (mandatory)

Once a warehouse report is processed, Ingrid calculates the refund amount based on the approved items and any configured deductions (return shipping cost, handling fee, etc.).

Ingrid marks the refund transaction as AWAITING_EXTERNAL_REFUND, meaning it is ready for you to issue. You have two options for discovering pending refunds:

  • Webhooks (recommended): Register a REFUND_PENDING_EXTERNAL webhook. Ingrid sends a POST to your callback URL with the full refund details as soon as the refund is created -- no additional API call is needed.
  • Polling: Call GET /refund-transactions?status=AWAITING_EXTERNAL_REFUND periodically to find refund transactions that need action.

Issue the refund to the customer in your payment system for the amount specified in totalAmount, then confirm it via POST /refund-transactions/{refundTransactionId}/complete. This marks the return as SUCCESS.

Step 6: Handle exchanges (optional)

Exchanges occur when a customer chooses to swap a returned item for a different variant (e.g. a different size or color) instead of receiving a refund. If your shop has exchanges enabled, this step runs alongside the refund flow.

How it works:

  1. The customer selects a replacement variant during the return flow in the return portal.
  2. Depending on your settings, the exchange can either be triggered immediately or later (for example, once the shipment is in transit, or the return arrived at the warehouse). Once the condition is met, and exchange is created with status AWAITING_EXTERNAL_HANDLING, meaning it is ready for you to act on.
  3. Discover exchange orders that need handling -- two options:
    • Webhooks (recommended): Register an EXCHANGE_PENDING_EXTERNAL webhook. Ingrid sends a POST with the full exchange details as soon as the exchange is created.
    • Polling: Call GET /exchanges?status=AWAITING_EXTERNAL_HANDLING periodically.
  4. For each exchange order, inspect the items array to see which variant the customer is exchanging to (exchangeToVariantId).
  5. Create the replacement order in your own e-commerce / fulfillment system.
  6. Call POST /exchanges/{exchangeOrderId}/complete with the replacement order details (completedOrderId, completedOrderNumber, completedOrderName).

Exchanges are independent of refunds -- a return can have both a refund (for non-exchanged items) and an exchange (for swapped items).

Returns

The Ingrid Returns API is how e-commerce platforms and merchants push the data that powers the Ingrid returns platform - product and order sync, return creation, warehouse reporting, refund confirmation, and exchange fulfillment. Once your data is in Ingrid, the full post-purchase experience is available, including the customer-facing return portal where shoppers register their returns. This API does not cover the return portal at the moment, but it will be added in a future change.

Ingrid operates on an inverted integration model - instead of Ingrid calling your APIs, you push data to Ingrid and Ingrid notifies you via webhooks when action is required on your side (e.g. issuing a refund). You then confirm completion back to Ingrid.

All requests require an x-api-key header containing your merchant API key. All monetary values are decimal numbers in the currency's major unit (e.g. 19.99 = 19 euros and 99 cents). Currency is specified via currencyCode using ISO 4217 codes.

Integration flow

Step 1 - Sync products: Push your product catalog via POST /products. Products must exist before orders that reference them.

Step 2 - Push orders: Create orders via POST /orders. Update with shipment and tracking data when fulfilled via PATCH /orders/{orderId}.

Step 3 - Customer initiates a return: Typically through Ingrid's return portal, or programmatically via POST /orders/{orderId}/returns.

Step 4 - Warehouse receives the return: Report received items via POST /warehouse-reports, a supported WMS integration, or the Ingrid backoffice.

Step 5 - Refund: Ingrid creates a refund transaction with status AWAITING_EXTERNAL_REFUND. Discover pending refunds via the REFUND_PENDING_EXTERNAL webhook or polling (GET /refund-transactions?status=AWAITING_EXTERNAL_REFUND). Issue the refund, then confirm via POST /refund-transactions/{refundTransactionId}/complete.

Step 6 - Exchanges (optional): Exchange orders are created with status AWAITING_EXTERNAL_HANDLING. Discover via the EXCHANGE_PENDING_EXTERNAL webhook or polling (GET /exchanges?status=AWAITING_EXTERNAL_HANDLING). Create the replacement order, then confirm via POST /exchanges/{exchangeOrderId}/complete.

List exchange orders

List exchange orders for your merchant account with optional filters.

To find exchanges that need your attention, poll with ?status=AWAITING_EXTERNAL_HANDLING. For each returned exchange, inspect the items to determine which replacement variants to fulfill, then call POST /exchanges/{exchangeOrderId}/complete after creating the replacement order in your system.

Authorizations:
ApiKeyAuth
query Parameters
page
integer <int32>

Zero-indexed page number (default 0, i.e. the first page)

size
integer <int32> <= 100

Number of items per page (default 20, maximum 100)

status
string (ExchangeOrderStatus)
Enum: "PENDING" "AWAITING_EXTERNAL_HANDLING" "COMPLETED" "CANCELLED"

Filter by exchange order status

from
string <date-time>

Filter exchanges created on or after this date-time (ISO 8601)

to
string <date-time>

Filter exchanges created before this date-time (ISO 8601)

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pageInfo": {
    }
}

Get an exchange order by ID

Fetch the full details of a specific exchange order, including its current status, the items being exchanged (original and replacement variants), currency, and any exchange cost.

Authorizations:
ApiKeyAuth
path Parameters
exchangeOrderId
required
string

Responses

Response samples

Content type
application/json
{
  • "exchangeOrderId": "4521",
  • "returnId": "283060",
  • "orderId": "48aced20913c030c836d4187019b712f",
  • "status": "AWAITING_EXTERNAL_HANDLING",
  • "currencyCode": "SEK",
  • "exchangeCost": 0,
  • "items": [
    ],
  • "createdAt": "2026-01-17T11:00:00Z"
}

Complete an exchange order

Notify Ingrid that you have successfully handled the exchange order by creating a replacement order in your own system. This transitions the exchange status from AWAITING_EXTERNAL_HANDLING to COMPLETED.

Prerequisite: The exchange must be in AWAITING_EXTERNAL_HANDLING status. Calling this on an exchange in any other status returns a 400 error.

Include the replacement order details so Ingrid can track the exchange end-to-end. At minimum, provide completedOrderId.

Authorizations:
ApiKeyAuth
path Parameters
exchangeOrderId
required
string
Request Body schema: application/json
required
completedOrderId
string

The unique ID of the replacement order in your system

completedOrderNumber
string

The order number of the replacement order (human-readable, e.g. "#10042")

completedOrderName
string

A display name for the replacement order (optional, for reference in the backoffice)

Responses

Request samples

Content type
application/json
{
  • "completedOrderId": "ORDER-99001",
  • "completedOrderNumber": "#10043",
  • "completedOrderName": "Replacement for #1042"
}

Response samples

Content type
application/json
{
  • "exchangeOrderId": "4521",
  • "returnId": "283060",
  • "orderId": "48aced20913c030c836d4187019b712f",
  • "status": "COMPLETED",
  • "currencyCode": "SEK",
  • "exchangeCost": 0,
  • "items": [
    ],
  • "createdAt": "2026-01-17T11:00:00Z"
}

Create or update an order

Push an order into Ingrid. If an order with the same orderId already exists for your merchant account it will be updated (upsert semantics). Note that orderId is scoped to your merchant account -- two different merchants can use the same orderId without collision.

Line items reference products and variants by productId and variantId. Products must be created via POST /products before they can be referenced in orders.

Call this endpoint when an order is placed and again when it is fulfilled (i.e. once you have shipment and tracking information to include).

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
orderId
required
string

Your internal order identifier (used for all subsequent API calls). Order IDs are scoped to your merchant account -- two different merchants can use the same orderId without collision.

orderName
string

Human-readable order name shown to customers, e.g. "#1042"

orderNumber
integer <int64>

Order number

currencyCode
required
string

ISO 4217 currency code, e.g. "SEK"

shippingCost
required
number <double>

Decimal value in the order's major currency unit (e.g. 5.99 means $5.99)

totalAmount
required
number <double>

Total order value, decimal in the order's major currency unit

giftCardAmount
number <double>

Amount paid with gift card, decimal in the order's major currency unit

taxesAmount
number <double>

Total taxes, decimal in the order's major currency unit

orderedAt
string <date-time>

When the customer placed the order

shippedAt
string <date-time>

When the order was first shipped (if fulfilled)

required
object

Customer shipping address

required
Array of objects (OrderLineItem)

Line items on this order

Array of objects (Shipment)

Outbound shipments for this order. Include at least one shipment once the order has been fulfilled. Ingrid uses this to determine return eligibility.

tags
Array of strings

Tags for categorizing the order

Responses

Request samples

Content type
application/json
{
  • "orderId": "48aced20913c030c836d4187019b712f",
  • "orderName": "#1042",
  • "orderNumber": 1042,
  • "currencyCode": "SEK",
  • "shippingCost": 49,
  • "totalAmount": 599,
  • "giftCardAmount": 0,
  • "taxesAmount": 119.8,
  • "orderedAt": "2026-01-15T10:00:00Z",
  • "shippedAt": "2026-01-15T14:30:00Z",
  • "shippingAddress": {
    },
  • "lineItems": [
    ],
  • "shipments": [
    ],
  • "tags": [
    ]
}

Response samples

Content type
application/json
{
  • "orderId": "48aced20913c030c836d4187019b712f",
  • "orderName": "#1042",
  • "orderNumber": 1042,
  • "currencyCode": "SEK",
  • "shippingCost": 49,
  • "totalAmount": 599,
  • "giftCardAmount": 0,
  • "taxesAmount": 119.8,
  • "orderedAt": "2026-01-15T10:00:00Z",
  • "shippedAt": "2026-01-15T14:30:00Z",
  • "shippingAddress": {
    },
  • "lineItems": [
    ],
  • "shipments": [
    ],
  • "tags": [
    ]
}

List orders

List orders for your merchant account with optional date filters.

Authorizations:
ApiKeyAuth
query Parameters
page
integer <int32>

Zero-indexed page number (default 0, i.e. the first page)

size
integer <int32> <= 100

Number of items per page (default 20, maximum 100)

from
string <date-time>

Filter orders placed on or after this date-time (ISO 8601)

to
string <date-time>

Filter orders placed before this date-time (ISO 8601)

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pageInfo": {
    }
}

Get an order

Get a single order by its ID.

Authorizations:
ApiKeyAuth
path Parameters
orderId
required
string

Responses

Response samples

Content type
application/json
{
  • "orderId": "48aced20913c030c836d4187019b712f",
  • "orderName": "#1042",
  • "orderNumber": 1042,
  • "currencyCode": "SEK",
  • "shippingCost": 49,
  • "totalAmount": 599,
  • "giftCardAmount": 0,
  • "taxesAmount": 119.8,
  • "orderedAt": "2026-01-15T10:00:00Z",
  • "shippedAt": "2026-01-15T14:30:00Z",
  • "shippingAddress": {
    },
  • "lineItems": [
    ],
  • "shipments": [
    ],
  • "tags": [
    ]
}

Update an order

Update fulfillment data on an existing order. Typically called when an order is shipped and you have tracking information to add.

Only include the fields you want to update -- omitted fields are left unchanged.

Authorizations:
ApiKeyAuth
path Parameters
orderId
required
string
Request Body schema: application/json
required
orderName
string
orderNumber
integer <int64>
currencyCode
string
shippingCost
number <double>

Decimal value in the order's major currency unit (e.g. 5.99)

totalAmount
number <double>

Decimal value in the order's major currency unit

giftCardAmount
number <double>

Decimal value in the order's major currency unit

taxesAmount
number <double>

Decimal value in the order's major currency unit

orderedAt
string <date-time>
shippedAt
string <date-time>
object

The template for adding optional properties.

Array of objects (OrderLineItem)
Array of objects (Shipment)
tags
Array of strings

Responses

Request samples

Content type
application/json
{
  • "shippedAt": "2026-01-15T14:30:00Z",
  • "shipments": [
    ]
}

Response samples

Content type
application/json
{
  • "orderId": "48aced20913c030c836d4187019b712f",
  • "orderName": "#1042",
  • "orderNumber": 1042,
  • "currencyCode": "SEK",
  • "shippingCost": 49,
  • "totalAmount": 599,
  • "giftCardAmount": 0,
  • "taxesAmount": 119.8,
  • "orderedAt": "2026-01-15T10:00:00Z",
  • "shippedAt": "2026-01-15T14:30:00Z",
  • "shippingAddress": {
    },
  • "lineItems": [
    ],
  • "shipments": [
    ],
  • "tags": [
    ]
}

List returns for an order

List all returns for a specific order.

Authorizations:
ApiKeyAuth
path Parameters
orderId
required
string

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pageInfo": {
    }
}

Create a return

Create a return programmatically on behalf of the merchant or customer, as opposed to the customer initiating the return through the Ingrid portal.

Specify which order line items to return and optionally a reason and a customer note. The return is created in PENDING status and will be confirmed and processed through the normal return lifecycle.

Authorizations:
ApiKeyAuth
path Parameters
orderId
required
string
Request Body schema: application/json
required
required
Array of objects (ReturnCreateItem) non-empty

List of order line items to return

Responses

Request samples

Content type
application/json
{
  • "items": [
    ]
}

Response samples

Content type
application/json
{
  • "returnId": "283060",
  • "orderId": "48aced20913c030c836d4187019b712f",
  • "status": "CONFIRMED",
  • "items": [
    ],
  • "shipment": {
    },
  • "createdAt": "2026-01-16T09:00:00Z"
}

Create or update a product

Create a new product or update an existing one. If a product with the given productId already exists, it will be updated. Variants included in the request will be created or updated by variantId.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
productId
required
string

Your internal product identifier

title
required
string

Product display name

description
string

Product description

imageSrc
string <uri>

Main product image URL

imageSrcs
Array of strings <uri> [ items <uri > ]

Additional image URLs

Array of objects (ProductCategory)
productNumber
string
Array of objects (ProductVariant)

Responses

Request samples

Content type
application/json
{
  • "productId": "PROD-123",
  • "title": "Classic T-Shirt",
  • "description": "Soft cotton t-shirt with a regular fit.",
  • "productNumber": "TS-001",
  • "variants": [
    ]
}

Response samples

Content type
application/json
{
  • "productId": "PROD-123",
  • "title": "Classic T-Shirt",
  • "description": "Soft cotton t-shirt with a regular fit.",
  • "productNumber": "TS-001",
  • "variants": [
    ],
  • "createdAt": "2026-01-10T08:00:00Z"
}

List products

List products for your merchant account.

Authorizations:
ApiKeyAuth
query Parameters
page
integer <int32>

Zero-indexed page number (default 0, i.e. the first page)

size
integer <int32> <= 100

Number of items per page (default 20, maximum 100)

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pageInfo": {
    }
}

Get a product

Get a single product by its ID.

Authorizations:
ApiKeyAuth
path Parameters
productId
required
string

Responses

Response samples

Content type
application/json
{
  • "productId": "PROD-123",
  • "title": "Classic T-Shirt",
  • "description": "Soft cotton t-shirt with a regular fit.",
  • "productNumber": "TS-001",
  • "variants": [
    ],
  • "createdAt": "2026-01-10T08:00:00Z"
}

Update a product

Update product fields. Only provided fields are updated. To update variants, use the variant upsert endpoint or include them in a POST /products call.

Authorizations:
ApiKeyAuth
path Parameters
productId
required
string
Request Body schema: application/json
required
title
string

Product display name

description
string

Product description

imageSrc
string <uri>

Main product image URL

imageSrcs
Array of strings <uri> [ items <uri > ]

Additional image URLs

Array of objects (ProductCategory)
productNumber
string

Responses

Request samples

Content type
application/json
{
  • "title": "Classic T-Shirt (organic cotton)",
  • "description": "Now produced in 100% organic cotton."
}

Response samples

Content type
application/json
{
  • "productId": "PROD-123",
  • "title": "Classic T-Shirt",
  • "description": "Soft cotton t-shirt with a regular fit.",
  • "productNumber": "TS-001",
  • "variants": [
    ],
  • "createdAt": "2026-01-10T08:00:00Z"
}

Create or update a variant

Create or update a single variant on a product. If the variant already exists, it will be updated. If the product does not exist, returns 404.

Authorizations:
ApiKeyAuth
path Parameters
productId
required
string
variantId
required
string
Request Body schema: application/json
required
title
string

Variant display name, e.g. "Medium / Black"

sku
required
string
barCode
string
weightInGrams
integer <int32>

Variant weight in grams

imageSrc
string <uri>

Variant image URL

imageSrcs
Array of strings <uri> [ items <uri > ]

Additional variant image URLs

tags
Array of strings
hsCode
string

Harmonized system code for customs

manufacturingCountry
string
Array of objects (ProductVariantProperty)

Variant attributes (size, colour, etc.)

availableInventory
integer <int32>

Available inventory quantity for this variant

Responses

Request samples

Content type
application/json
{
  • "title": "Medium / Black",
  • "sku": "TS-M-BLK",
  • "weightInGrams": 220,
  • "availableInventory": 42
}

Response samples

Content type
application/json
{
  • "variantId": "VAR-456",
  • "title": "Medium / Black",
  • "sku": "TS-M-BLK",
  • "weightInGrams": 220,
  • "hsCode": "6109.10",
  • "manufacturingCountry": "PT",
  • "properties": [
    ],
  • "availableInventory": 42
}

List refund transactions

List refund transactions for your merchant account. Use ?status=AWAITING_EXTERNAL_REFUND to fetch refund transactions that are ready for you to issue. Subscribe to the refund.pending webhook event to be notified in real time instead of polling.

Authorizations:
ApiKeyAuth
query Parameters
page
integer <int32>

Zero-indexed page number (default 0, i.e. the first page)

size
integer <int32> <= 100

Number of items per page (default 20, maximum 100)

status
string (RefundTransactionStatus)
Enum: "PENDING" "AWAITING_EXTERNAL_REFUND" "SUCCESS" "FAILED"

Filter by refund transaction status

from
string <date-time>

Filter refund transactions created on or after this date-time (ISO 8601)

to
string <date-time>

Filter refund transactions created before this date-time (ISO 8601)

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pageInfo": {
    }
}

Get a refund transaction

Fetch the full detail of a refund transaction including the total amount, currency, per-line-item breakdown, and any deductions (e.g. return shipping cost).

Authorizations:
ApiKeyAuth
path Parameters
refundTransactionId
required
string

Responses

Response samples

Content type
application/json
{
  • "refundTransactionId": "2578",
  • "returnId": "283060",
  • "orderId": "48aced20913c030c836d4187019b712f",
  • "status": "AWAITING_EXTERNAL_REFUND",
  • "currencyCode": "SEK",
  • "totalAmount": 100,
  • "totals": {
    },
  • "deductions": {
    },
  • "lineItems": [
    ],
  • "createdAt": "2026-01-17T11:00:00Z"
}

Confirm a refund transaction was issued

Notify Ingrid that you have successfully issued the refund to the customer in your payment system. This marks the refund transaction as SUCCESS.

Call this endpoint after you receive a refund.pending webhook or after fetching a refund transaction with status AWAITING_EXTERNAL_REFUND.

Authorizations:
ApiKeyAuth
path Parameters
refundTransactionId
required
string
Request Body schema: application/json
required
amount
required
number <double>

Actual amount issued (may differ from requested if e.g. gift card adjustments were made)

currencyCode
required
string

ISO 4217 currency code

transactionId
string

Your payment gateway's transaction or refund reference

Responses

Request samples

Content type
application/json
{
  • "amount": 100,
  • "currencyCode": "SEK",
  • "transactionId": "ch_3MtwBwLkdIwHu7ix28a3tqPa"
}

Response samples

Content type
application/json
{
  • "refundTransactionId": "2578",
  • "returnId": "283060",
  • "orderId": "48aced20913c030c836d4187019b712f",
  • "status": "SUCCESS",
  • "currencyCode": "SEK",
  • "totalAmount": 100,
  • "totals": {
    },
  • "deductions": {
    },
  • "lineItems": [
    ],
  • "createdAt": "2026-01-17T11:00:00Z"
}

List returns

List returns for your merchant account with optional filters.

Authorizations:
ApiKeyAuth
query Parameters
page
integer <int32>

Zero-indexed page number (default 0, i.e. the first page)

size
integer <int32> <= 100

Number of items per page (default 20, maximum 100)

status
string (ReturnStatus)
Enum: "PENDING" "CONFIRMED" "READY" "IN_TRANSIT" "RECEIVED" "REFUND_PENDING" "COMPLETED" "CANCELLED"

Filter by return status

from
string <date-time>

Filter returns created on or after this date-time (ISO 8601)

to
string <date-time>

Filter returns created before this date-time (ISO 8601)

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pageInfo": {
    }
}

Get a return

Get a single return by its ID.

Authorizations:
ApiKeyAuth
path Parameters
returnId
required
string

Responses

Response samples

Content type
application/json
{
  • "returnId": "283060",
  • "orderId": "48aced20913c030c836d4187019b712f",
  • "status": "CONFIRMED",
  • "items": [
    ],
  • "shipment": {
    },
  • "createdAt": "2026-01-16T09:00:00Z"
}

Cancel a return

Cancel a return that has not yet been received by the warehouse. Returns in RECEIVED, REFUND_PENDING, or COMPLETED status cannot be cancelled.

Authorizations:
ApiKeyAuth
path Parameters
returnId
required
string

Responses

Response samples

Content type
application/json
{
  • "returnId": "283060",
  • "orderId": "48aced20913c030c836d4187019b712f",
  • "status": "CANCELLED",
  • "items": [
    ],
  • "shipment": {
    },
  • "createdAt": "2026-01-16T09:00:00Z"
}

Submit a warehouse report

Report which items were received at your warehouse and whether they passed inspection. This is the API-based alternative to using a supported WMS integration or the Ingrid backoffice Quality Check.

You must specify at least one of returnId, orderId, or shipmentTrackingReference in the request body so Ingrid can match the report to the correct return.

For each item, specify APPROVED (item received in acceptable condition, eligible for refund) or DENIED (item not acceptable, no refund).

After the report is processed, Ingrid will automatically calculate the refund for approved items and emit a refund.pending webhook. You then confirm the refund via POST /refund-transactions/{refundTransactionId}/complete.

Items not included in the report are treated as not received. If you received all items, include all of them.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
returnId
string

The Ingrid return ID. Use this when you know exactly which return this report is for.

orderId
string

Your order ID. Use this when items arrived but you don't have the Ingrid return ID. If the order has multiple returns, Ingrid will match items to the correct return.

shipmentTrackingReference
string

The carrier tracking number for the return parcel. Use this when you only have the tracking reference (e.g. from a carrier scan event).

required
Array of objects (WarehouseReportItem) non-empty

List of items received at the warehouse with their inspection results

reportProcessing
string
Enum: "PROCESS_IMMEDIATELY" "MANUAL_REVIEW"

How to process the report

returnStation
string

Identifier or name of the warehouse or return station where the items were received. Useful for merchants with multiple warehouses.

comment
string

Optional general note about this warehouse report

Responses

Request samples

Content type
application/json
{
  • "returnId": "283060",
  • "items": [
    ],
  • "reportProcessing": "PROCESS_IMMEDIATELY"
}

Response samples

Content type
application/json
{
  • "warehouseReportId": "WR-7700",
  • "returnId": "283060",
  • "orderId": "48aced20913c030c836d4187019b712f",
  • "status": "PROCESSING",
  • "items": [
    ],
  • "createdAt": "2026-01-18T13:15:00Z"
}

Webhooks

Refund pending external Webhook

Sent when a refund transaction is created with status AWAITING_EXTERNAL_REFUND. The merchant should issue the refund in their payment system and confirm via POST /refund-transactions/{refundTransactionId}/complete.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
type
required
string
Enum: "REFUND_PENDING_EXTERNAL" "EXCHANGE_PENDING_EXTERNAL"

The event type — always REFUND_PENDING_EXTERNAL for this payload

triggeredAt
required
string <date-time>

When the event was triggered, UTC

refundTransactionId
required
string

Identifier of the refund transaction that needs action

status
required
string

Current status of the refund transaction — always AWAITING_EXTERNAL_REFUND for this event

orderId
string

The partner-supplied order identifier this refund belongs to

returnId
string

Identifier of the return this refund was triggered by

currencyCode
string

ISO 4217 currency code of the refund amount

totalAmount
number <decimal128>

Total amount to refund to the customer, decimal in currencyCode

object (RefundPendingExternalTotals)

Gross refund breakdown before deductions, included in the REFUND_PENDING_EXTERNAL payload.

object (RefundPendingExternalDeductions)

Costs deducted from the gross refund, included in the REFUND_PENDING_EXTERNAL payload.

Array of objects (RefundPendingExternalLineItem)

Per-line-item refund breakdown

Responses

Request samples

Content type
application/json
{
  • "type": "REFUND_PENDING_EXTERNAL",
  • "triggeredAt": "2026-01-15T10:00:00Z",
  • "refundTransactionId": "2578",
  • "status": "AWAITING_EXTERNAL_REFUND",
  • "orderId": "48aced20913c030c836d4187019b712f",
  • "returnId": "283060",
  • "currencyCode": "SEK",
  • "totalAmount": 100,
  • "totals": {
    },
  • "deductions": {
    },
  • "lineItems": [
    ]
}

Exchange pending external Webhook

Sent when an exchange order is created with status AWAITING_EXTERNAL_HANDLING. The merchant should create the replacement order in their own system and confirm via POST /exchanges/{exchangeOrderId}/complete.

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required
type
required
string
Enum: "REFUND_PENDING_EXTERNAL" "EXCHANGE_PENDING_EXTERNAL"

The event type — always EXCHANGE_PENDING_EXTERNAL for this payload

triggeredAt
required
string <date-time>

When the event was triggered, UTC

exchangeOrderId
required
string

Identifier of the exchange order that needs action

status
required
string

Current status of the exchange order — always AWAITING_EXTERNAL_HANDLING for this event

orderId
string

The partner-supplied order identifier this exchange belongs to

returnId
string

Identifier of the return that triggered this exchange

currencyCode
string

ISO 4217 currency code of any amount charged for the exchange

exchangeCost
number <decimal128>

Amount charged to the customer for the exchange (if any), decimal in currencyCode

Array of objects (ExchangePendingExternalLineItem)

Per-line-item exchange breakdown

Responses

Request samples

Content type
application/json
{
  • "type": "EXCHANGE_PENDING_EXTERNAL",
  • "triggeredAt": "2026-01-15T10:00:00Z",
  • "exchangeOrderId": "4521",
  • "status": "AWAITING_EXTERNAL_HANDLING",
  • "orderId": "48aced20913c030c836d4187019b712f",
  • "returnId": "283060",
  • "currencyCode": "SEK",
  • "exchangeCost": 50,
  • "items": [
    ]
}