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.
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 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").
This section describes the full lifecycle of an e-commerce integration with Ingrid Returns, from order placement through to refund completion.
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.
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.
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.
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.
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:
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.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.
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:
AWAITING_EXTERNAL_HANDLING, meaning it is ready for you to act on.EXCHANGE_PENDING_EXTERNAL
webhook. Ingrid sends a POST with the full exchange details as soon as the
exchange is created.GET /exchanges?status=AWAITING_EXTERNAL_HANDLING
periodically.items array to see which variant the
customer is exchanging to (exchangeToVariantId).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).
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.
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 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.
| 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) |
{- "data": [
- {
- "exchangeOrderId": "4521",
- "returnId": "283060",
- "orderId": "48aced20913c030c836d4187019b712f",
- "status": "AWAITING_EXTERNAL_HANDLING",
- "currencyCode": "SEK",
- "exchangeCost": 0,
- "items": [
- {
- "exchangeOrderItemId": "EOI-001",
- "orderLineItemId": "L527_1036L527_1036M",
- "exchangeFromProductId": "PROD-123",
- "exchangeFromVariantId": "VAR-456",
- "exchangeToProductId": "PROD-123",
- "exchangeToVariantId": "VAR-789",
- "quantity": 1
}
], - "createdAt": "2026-01-17T11:00:00Z"
}
], - "pageInfo": {
- "hasNext": false,
- "hasPrevious": false
}
}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.
| exchangeOrderId required | string |
{- "exchangeOrderId": "4521",
- "returnId": "283060",
- "orderId": "48aced20913c030c836d4187019b712f",
- "status": "AWAITING_EXTERNAL_HANDLING",
- "currencyCode": "SEK",
- "exchangeCost": 0,
- "items": [
- {
- "exchangeOrderItemId": "EOI-001",
- "orderLineItemId": "L527_1036L527_1036M",
- "exchangeFromProductId": "PROD-123",
- "exchangeFromVariantId": "VAR-456",
- "exchangeToProductId": "PROD-123",
- "exchangeToVariantId": "VAR-789",
- "quantity": 1
}
], - "createdAt": "2026-01-17T11:00:00Z"
}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.
| exchangeOrderId required | string |
| 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) |
{- "completedOrderId": "ORDER-99001",
- "completedOrderNumber": "#10043",
- "completedOrderName": "Replacement for #1042"
}{- "exchangeOrderId": "4521",
- "returnId": "283060",
- "orderId": "48aced20913c030c836d4187019b712f",
- "status": "COMPLETED",
- "currencyCode": "SEK",
- "exchangeCost": 0,
- "items": [
- {
- "exchangeOrderItemId": "EOI-001",
- "orderLineItemId": "L527_1036L527_1036M",
- "exchangeFromProductId": "PROD-123",
- "exchangeFromVariantId": "VAR-456",
- "exchangeToProductId": "PROD-123",
- "exchangeToVariantId": "VAR-789",
- "quantity": 1
}
], - "createdAt": "2026-01-17T11:00:00Z"
}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).
| 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 |
{- "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": {
- "firstName": "Anna",
- "lastName": "Andersson",
- "email": "anna@example.com",
- "phone": "+46701234567",
- "street": "Storgatan 1",
- "city": "Stockholm",
- "zip": "11122",
- "countryCode": "SE"
}, - "lineItems": [
- {
- "lineItemId": "L527_1036L527_1036M",
- "productId": "PROD-123",
- "variantId": "VAR-456",
- "title": "T-Shirt",
- "sku": "TS-M-BLK",
- "originalUnitPrice": 299,
- "discountedUnitPrice": 299,
- "unitTaxes": 59.8,
- "quantity": 2
}
], - "shipments": [
- {
- "shipmentId": "SHIP-001",
- "shippedAt": "2026-01-15T14:30:00Z",
- "trackingReference": "TRK1234567890",
- "carrier": "PostNord",
- "lineItems": [
- {
- "shipmentLineItemId": "SLI-001",
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 2
}
]
}
], - "tags": [
- "holiday-2026"
]
}{- "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": {
- "firstName": "Anna",
- "lastName": "Andersson",
- "email": "anna@example.com",
- "phone": "+46701234567",
- "street": "Storgatan 1",
- "city": "Stockholm",
- "zip": "11122",
- "countryCode": "SE"
}, - "lineItems": [
- {
- "lineItemId": "L527_1036L527_1036M",
- "productId": "PROD-123",
- "variantId": "VAR-456",
- "title": "T-Shirt",
- "sku": "TS-M-BLK",
- "originalUnitPrice": 299,
- "discountedUnitPrice": 299,
- "unitTaxes": 59.8,
- "quantity": 2
}
], - "shipments": [
- {
- "shipmentId": "SHIP-001",
- "shippedAt": "2026-01-15T14:30:00Z",
- "trackingReference": "TRK1234567890",
- "carrier": "PostNord",
- "lineItems": [
- {
- "shipmentLineItemId": "SLI-001",
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 2
}
]
}
], - "tags": [
- "holiday-2026"
]
}List orders for your merchant account with optional date filters.
| 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) |
{- "data": [
- {
- "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": {
- "firstName": "Anna",
- "lastName": "Andersson",
- "email": "anna@example.com",
- "phone": "+46701234567",
- "street": "Storgatan 1",
- "city": "Stockholm",
- "zip": "11122",
- "countryCode": "SE"
}, - "lineItems": [
- {
- "lineItemId": "L527_1036L527_1036M",
- "productId": "PROD-123",
- "variantId": "VAR-456",
- "title": "T-Shirt",
- "sku": "TS-M-BLK",
- "originalUnitPrice": 299,
- "discountedUnitPrice": 299,
- "unitTaxes": 59.8,
- "quantity": 2
}
], - "shipments": [
- {
- "shipmentId": "SHIP-001",
- "shippedAt": "2026-01-15T14:30:00Z",
- "trackingReference": "TRK1234567890",
- "carrier": "PostNord",
- "lineItems": [
- {
- "shipmentLineItemId": "SLI-001",
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 2
}
]
}
], - "tags": [
- "holiday-2026"
]
}
], - "pageInfo": {
- "hasNext": false,
- "hasPrevious": false
}
}Get a single order by its ID.
| orderId required | string |
{- "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": {
- "firstName": "Anna",
- "lastName": "Andersson",
- "email": "anna@example.com",
- "phone": "+46701234567",
- "street": "Storgatan 1",
- "city": "Stockholm",
- "zip": "11122",
- "countryCode": "SE"
}, - "lineItems": [
- {
- "lineItemId": "L527_1036L527_1036M",
- "productId": "PROD-123",
- "variantId": "VAR-456",
- "title": "T-Shirt",
- "sku": "TS-M-BLK",
- "originalUnitPrice": 299,
- "discountedUnitPrice": 299,
- "unitTaxes": 59.8,
- "quantity": 2
}
], - "shipments": [
- {
- "shipmentId": "SHIP-001",
- "shippedAt": "2026-01-15T14:30:00Z",
- "trackingReference": "TRK1234567890",
- "carrier": "PostNord",
- "lineItems": [
- {
- "shipmentLineItemId": "SLI-001",
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 2
}
]
}
], - "tags": [
- "holiday-2026"
]
}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.
| orderId required | string |
| 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 |
{- "shippedAt": "2026-01-15T14:30:00Z",
- "shipments": [
- {
- "shipmentId": "SHIP-001",
- "shippedAt": "2026-01-15T14:30:00Z",
- "trackingReference": "TRK1234567890",
- "carrier": "PostNord",
- "lineItems": [
- {
- "shipmentLineItemId": "SLI-001",
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 2
}
]
}
]
}{- "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": {
- "firstName": "Anna",
- "lastName": "Andersson",
- "email": "anna@example.com",
- "phone": "+46701234567",
- "street": "Storgatan 1",
- "city": "Stockholm",
- "zip": "11122",
- "countryCode": "SE"
}, - "lineItems": [
- {
- "lineItemId": "L527_1036L527_1036M",
- "productId": "PROD-123",
- "variantId": "VAR-456",
- "title": "T-Shirt",
- "sku": "TS-M-BLK",
- "originalUnitPrice": 299,
- "discountedUnitPrice": 299,
- "unitTaxes": 59.8,
- "quantity": 2
}
], - "shipments": [
- {
- "shipmentId": "SHIP-001",
- "shippedAt": "2026-01-15T14:30:00Z",
- "trackingReference": "TRK1234567890",
- "carrier": "PostNord",
- "lineItems": [
- {
- "shipmentLineItemId": "SLI-001",
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 2
}
]
}
], - "tags": [
- "holiday-2026"
]
}List all returns for a specific order.
| orderId required | string |
{- "data": [
- {
- "returnId": "283060",
- "orderId": "48aced20913c030c836d4187019b712f",
- "status": "CONFIRMED",
- "items": [
- {
- "returnItemId": "RI-9001",
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 1,
- "reason": {
- "code": "DOESNT_FIT",
- "label": "Doesn't fit",
- "subReasonCode": "WRONG_SIZE",
- "subReasonLabel": "Wrong size"
}, - "status": "PENDING"
}
], - "shipment": {
- "shipmentId": "RSH-001",
- "carrier": "PostNord",
- "trackingReference": "RT9876543210",
- "bookedAt": "2026-01-16T09:00:00Z"
}, - "createdAt": "2026-01-16T09:00:00Z"
}
], - "pageInfo": {
- "hasNext": false,
- "hasPrevious": false
}
}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.
| orderId required | string |
required | Array of objects (ReturnCreateItem) non-empty List of order line items to return |
{- "items": [
- {
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 1,
- "reason": {
- "code": "DOESNT_FIT",
- "subReasonCode": "WRONG_SIZE"
}
}
]
}{- "returnId": "283060",
- "orderId": "48aced20913c030c836d4187019b712f",
- "status": "CONFIRMED",
- "items": [
- {
- "returnItemId": "RI-9001",
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 1,
- "reason": {
- "code": "DOESNT_FIT",
- "label": "Doesn't fit",
- "subReasonCode": "WRONG_SIZE",
- "subReasonLabel": "Wrong size"
}, - "status": "PENDING"
}
], - "shipment": {
- "shipmentId": "RSH-001",
- "carrier": "PostNord",
- "trackingReference": "RT9876543210",
- "bookedAt": "2026-01-16T09:00:00Z"
}, - "createdAt": "2026-01-16T09:00:00Z"
}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.
| 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) |
{- "productId": "PROD-123",
- "title": "Classic T-Shirt",
- "description": "Soft cotton t-shirt with a regular fit.",
- "productNumber": "TS-001",
- "variants": [
- {
- "variantId": "VAR-456",
- "title": "Medium / Black",
- "sku": "TS-M-BLK",
- "weightInGrams": 220,
- "hsCode": "6109.10",
- "manufacturingCountry": "PT",
- "properties": [
- {
- "type": "size",
- "value": "M"
}, - {
- "type": "color",
- "value": "Black",
- "hexColor": "#000000"
}
], - "availableInventory": 42
}
]
}{- "productId": "PROD-123",
- "title": "Classic T-Shirt",
- "description": "Soft cotton t-shirt with a regular fit.",
- "productNumber": "TS-001",
- "variants": [
- {
- "variantId": "VAR-456",
- "title": "Medium / Black",
- "sku": "TS-M-BLK",
- "weightInGrams": 220,
- "hsCode": "6109.10",
- "manufacturingCountry": "PT",
- "properties": [
- {
- "type": "size",
- "value": "M"
}, - {
- "type": "color",
- "value": "Black",
- "hexColor": "#000000"
}
], - "availableInventory": 42
}
], - "createdAt": "2026-01-10T08:00:00Z"
}List products for your merchant account.
| 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) |
{- "data": [
- {
- "productId": "PROD-123",
- "title": "Classic T-Shirt",
- "description": "Soft cotton t-shirt with a regular fit.",
- "productNumber": "TS-001",
- "variants": [
- {
- "variantId": "VAR-456",
- "title": "Medium / Black",
- "sku": "TS-M-BLK",
- "weightInGrams": 220,
- "hsCode": "6109.10",
- "manufacturingCountry": "PT",
- "properties": [
- {
- "type": "size",
- "value": "M"
}, - {
- "type": "color",
- "value": "Black",
- "hexColor": "#000000"
}
], - "availableInventory": 42
}
], - "createdAt": "2026-01-10T08:00:00Z"
}
], - "pageInfo": {
- "hasNext": false,
- "hasPrevious": false
}
}Get a single product by its ID.
| productId required | string |
{- "productId": "PROD-123",
- "title": "Classic T-Shirt",
- "description": "Soft cotton t-shirt with a regular fit.",
- "productNumber": "TS-001",
- "variants": [
- {
- "variantId": "VAR-456",
- "title": "Medium / Black",
- "sku": "TS-M-BLK",
- "weightInGrams": 220,
- "hsCode": "6109.10",
- "manufacturingCountry": "PT",
- "properties": [
- {
- "type": "size",
- "value": "M"
}, - {
- "type": "color",
- "value": "Black",
- "hexColor": "#000000"
}
], - "availableInventory": 42
}
], - "createdAt": "2026-01-10T08:00:00Z"
}Update product fields. Only provided fields are updated. To update variants, use the variant upsert endpoint or include them in a POST /products call.
| productId required | string |
| 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 |
{- "title": "Classic T-Shirt (organic cotton)",
- "description": "Now produced in 100% organic cotton."
}{- "productId": "PROD-123",
- "title": "Classic T-Shirt",
- "description": "Soft cotton t-shirt with a regular fit.",
- "productNumber": "TS-001",
- "variants": [
- {
- "variantId": "VAR-456",
- "title": "Medium / Black",
- "sku": "TS-M-BLK",
- "weightInGrams": 220,
- "hsCode": "6109.10",
- "manufacturingCountry": "PT",
- "properties": [
- {
- "type": "size",
- "value": "M"
}, - {
- "type": "color",
- "value": "Black",
- "hexColor": "#000000"
}
], - "availableInventory": 42
}
], - "createdAt": "2026-01-10T08:00:00Z"
}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.
| productId required | string |
| variantId required | string |
| 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 |
{- "title": "Medium / Black",
- "sku": "TS-M-BLK",
- "weightInGrams": 220,
- "availableInventory": 42
}{- "variantId": "VAR-456",
- "title": "Medium / Black",
- "sku": "TS-M-BLK",
- "weightInGrams": 220,
- "hsCode": "6109.10",
- "manufacturingCountry": "PT",
- "properties": [
- {
- "type": "size",
- "value": "M"
}, - {
- "type": "color",
- "value": "Black",
- "hexColor": "#000000"
}
], - "availableInventory": 42
}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.
| 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) |
{- "data": [
- {
- "refundTransactionId": "2578",
- "returnId": "283060",
- "orderId": "48aced20913c030c836d4187019b712f",
- "status": "AWAITING_EXTERNAL_REFUND",
- "currencyCode": "SEK",
- "totalAmount": 100,
- "totals": {
- "itemsAmount": 120,
- "shippingAmount": 0
}, - "deductions": {
- "returnHandlingCost": 10,
- "returnShipmentCost": 10
}, - "lineItems": [
- {
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 1,
- "amount": 120
}
], - "createdAt": "2026-01-17T11:00:00Z"
}
], - "pageInfo": {
- "hasNext": false,
- "hasPrevious": false
}
}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).
| refundTransactionId required | string |
{- "refundTransactionId": "2578",
- "returnId": "283060",
- "orderId": "48aced20913c030c836d4187019b712f",
- "status": "AWAITING_EXTERNAL_REFUND",
- "currencyCode": "SEK",
- "totalAmount": 100,
- "totals": {
- "itemsAmount": 120,
- "shippingAmount": 0
}, - "deductions": {
- "returnHandlingCost": 10,
- "returnShipmentCost": 10
}, - "lineItems": [
- {
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 1,
- "amount": 120
}
], - "createdAt": "2026-01-17T11:00:00Z"
}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.
| refundTransactionId required | string |
| 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 |
{- "amount": 100,
- "currencyCode": "SEK",
- "transactionId": "ch_3MtwBwLkdIwHu7ix28a3tqPa"
}{- "refundTransactionId": "2578",
- "returnId": "283060",
- "orderId": "48aced20913c030c836d4187019b712f",
- "status": "SUCCESS",
- "currencyCode": "SEK",
- "totalAmount": 100,
- "totals": {
- "itemsAmount": 120,
- "shippingAmount": 0
}, - "deductions": {
- "returnHandlingCost": 10,
- "returnShipmentCost": 10
}, - "lineItems": [
- {
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 1,
- "amount": 120
}
], - "createdAt": "2026-01-17T11:00:00Z"
}List returns for your merchant account with optional filters.
| 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) |
{- "data": [
- {
- "returnId": "283060",
- "orderId": "48aced20913c030c836d4187019b712f",
- "status": "CONFIRMED",
- "items": [
- {
- "returnItemId": "RI-9001",
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 1,
- "reason": {
- "code": "DOESNT_FIT",
- "label": "Doesn't fit",
- "subReasonCode": "WRONG_SIZE",
- "subReasonLabel": "Wrong size"
}, - "status": "PENDING"
}
], - "shipment": {
- "shipmentId": "RSH-001",
- "carrier": "PostNord",
- "trackingReference": "RT9876543210",
- "bookedAt": "2026-01-16T09:00:00Z"
}, - "createdAt": "2026-01-16T09:00:00Z"
}
], - "pageInfo": {
- "hasNext": false,
- "hasPrevious": false
}
}Get a single return by its ID.
| returnId required | string |
{- "returnId": "283060",
- "orderId": "48aced20913c030c836d4187019b712f",
- "status": "CONFIRMED",
- "items": [
- {
- "returnItemId": "RI-9001",
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 1,
- "reason": {
- "code": "DOESNT_FIT",
- "label": "Doesn't fit",
- "subReasonCode": "WRONG_SIZE",
- "subReasonLabel": "Wrong size"
}, - "status": "PENDING"
}
], - "shipment": {
- "shipmentId": "RSH-001",
- "carrier": "PostNord",
- "trackingReference": "RT9876543210",
- "bookedAt": "2026-01-16T09:00:00Z"
}, - "createdAt": "2026-01-16T09:00:00Z"
}Cancel a return that has not yet been received by the warehouse.
Returns in RECEIVED, REFUND_PENDING, or COMPLETED status cannot be cancelled.
| returnId required | string |
{- "returnId": "283060",
- "orderId": "48aced20913c030c836d4187019b712f",
- "status": "CANCELLED",
- "items": [
- {
- "returnItemId": "RI-9001",
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 1,
- "reason": {
- "code": "DOESNT_FIT",
- "label": "Doesn't fit",
- "subReasonCode": "WRONG_SIZE",
- "subReasonLabel": "Wrong size"
}, - "status": "PENDING"
}
], - "shipment": {
- "shipmentId": "RSH-001",
- "carrier": "PostNord",
- "trackingReference": "RT9876543210",
- "bookedAt": "2026-01-16T09:00:00Z"
}, - "createdAt": "2026-01-16T09:00:00Z"
}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.
| 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 |
{- "returnId": "283060",
- "items": [
- {
- "returnItemId": "RI-9001",
- "orderLineItemId": "L527_1036L527_1036M",
- "sku": "TS-M-BLK",
- "quantity": 1,
- "action": "APPROVED"
}
], - "reportProcessing": "PROCESS_IMMEDIATELY"
}{- "warehouseReportId": "WR-7700",
- "returnId": "283060",
- "orderId": "48aced20913c030c836d4187019b712f",
- "status": "PROCESSING",
- "items": [
- {
- "returnItemId": "RI-9001",
- "orderLineItemId": "L527_1036L527_1036M",
- "sku": "TS-M-BLK",
- "quantity": 1,
- "action": "APPROVED"
}
], - "createdAt": "2026-01-18T13:15:00Z"
}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.
| type required | string Enum: "REFUND_PENDING_EXTERNAL" "EXCHANGE_PENDING_EXTERNAL" The event type — always |
| 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 |
| 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 |
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 |
{- "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": {
- "itemsAmount": 120,
- "shippingAmount": 0
}, - "deductions": {
- "returnHandlingCost": 10,
- "returnShipmentCost": 10
}, - "lineItems": [
- {
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 1,
- "amount": 120
}
]
}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.
| type required | string Enum: "REFUND_PENDING_EXTERNAL" "EXCHANGE_PENDING_EXTERNAL" The event type — always |
| 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 |
| 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 |
Array of objects (ExchangePendingExternalLineItem) Per-line-item exchange breakdown |
{- "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": [
- {
- "orderLineItemId": "L527_1036L527_1036M",
- "quantity": 1,
- "exchangeFromProductId": "PROD-123",
- "exchangeFromVariantId": "VAR-456",
- "exchangeToProductId": "PROD-789",
- "exchangeToVariantId": "VAR-012"
}
]
}