Complete API reference for integrating with beeShip Warehouse Management System
Copyright © 2025 beeShip GmbH. All rights reserved.
This API is the proprietary property of beeShip GmbH. By using this API, you agree to:
For commercial use or higher rate limits, please contact: support@de.beeship.io
Download the ready-to-use Postman collection and environment below. Import both into Postman, fill in your API key, email and password in the environment once, and every request is pre-configured to hit app.beeship.io.
In Postman: File → Import both JSON files, then select the beeShip API environment from the top-right dropdown and fill in your credentials.
All API requests should be made to this base URL with the appropriate endpoint path.
All API requests must include:
X-API-Key, X-Email, X-Passwordapplication/json (for POST/PUT requests)Success Response:
Error Response:
The beeShip WMS API uses Triple Authentication for enhanced security.
| Header | Description | Example |
|---|---|---|
X-API-Key |
Your tenant's unique API key | c1fe8d64dd95e504... |
X-Email |
Your user email address | user@company.com |
X-Password |
Your account password | YourPassword123 |
beeShip GmbH enforces rate limits to ensure fair usage and system stability.
| Endpoint Type | Requests per Minute | Burst Limit |
|---|---|---|
| General (GET) | 250 | 300 |
| Orders | 100 | 120 |
| Batch Operations | 1 | 2 |
Response headers include rate limit information:
Note: beeShip GmbH reserves the right to adjust rate limits without notice.
| Code | Meaning | Description |
|---|---|---|
| 200 | OK | Request successful |
| 201 | Created | Resource created successfully |
| 400 | Bad Request | Invalid request data or parameters |
| 401 | Unauthorized | Authentication failed |
| 403 | Forbidden | Insufficient permissions |
| 404 | Not Found | Resource not found |
| 429 | Too Many Requests | Rate limit exceeded |
| 500 | Internal Server Error | Server error occurred |
Manage products including inventory, images, variations, and stock levels.
| Parameter | Type | Required | Description |
|---|---|---|---|
page |
integer | Optional | Page number (default: 1) |
limit |
integer | Optional | Items per page (default: 20, max: 250) |
search |
string | Optional | Search in name, SKU, EAN |
Create a new product in the warehouse management system.
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | Required | Product name (max 255 characters) |
sku |
string | Required | Unique SKU code (stock keeping unit) |
ean |
string | Optional | EAN/UPC barcode number |
description |
text | Optional | Detailed product description |
price |
decimal | Optional | Selling price (2 decimal places) |
cost_price |
decimal | Optional | Cost/purchase price |
weight |
integer | Optional | Weight in grams |
length |
decimal | Optional | Length in centimeters |
width |
decimal | Optional | Width in centimeters |
height |
decimal | Optional | Height in centimeters |
min_stock |
integer | Optional | Minimum stock alert level |
max_stock |
integer | Optional | Maximum stock capacity |
manufacturer |
string | Optional | Manufacturer/brand name |
country_of_origin |
string | Optional | 2-letter country code (e.g., DE, US, CN) |
customs_tariff_number |
string | Optional | HS tariff code for customs |
category |
string | Optional | Product category |
location |
string | Optional | Warehouse location code (e.g., A-01-02) |
Replace {id} with the product ID you want to retrieve.
Update an existing product. Send only the fields you want to update. All fields are optional - only include the fields you wish to modify.
| Field | Type | Required | Description |
|---|---|---|---|
external_item_id |
string | Optional | External item identifier from source platform |
sku |
string | Optional | Unique SKU code (stock keeping unit). Must be unique within tenant. |
ean |
string | Optional | EAN/UPC barcode number |
name |
string | Optional | Product name (max 255 characters) |
description |
text | Optional | Detailed product description |
weight |
decimal | Optional | Weight in grams (default: 0) |
length |
decimal | Optional | Length in centimeters (default: 0) |
width |
decimal | Optional | Width in centimeters (default: 0) |
height |
decimal | Optional | Height in centimeters (default: 0) |
min_stock |
integer | Optional | Minimum stock alert level (default: 0) |
max_stock |
integer | Optional | Maximum stock capacity (default: 0) |
manufacturer |
string | Optional | Manufacturer name |
brand |
string | Optional | Brand name |
country_of_origin |
string | Optional | Country of origin code |
customs_tariff_number |
string | Optional | Customs tariff/harmonized system number |
net_weight |
decimal | Optional | Net weight in grams (default: 0) |
gross_weight |
decimal | Optional | Gross weight in grams (defaults to weight if not provided) |
product_type |
integer | Optional | Product type identifier (default: 0) |
exclude_from_picklist |
boolean | Optional | Whether to exclude product from picklists (default: 0/false) |
einkaufs_preis |
decimal | Optional | Purchase price/cost price |
external_ids |
array | Optional | Array of external ID objects. Each object must have platform (string, required) and external_id (string, required). Replaces all existing external IDs. |
images |
array | Optional | Array of image objects. Each object must have image_url (string, required). Optional fields: external_id, thumbnail_url, is_primary (boolean), sort_order (integer). Replaces all existing images. |
variations |
array | Optional | Array of variation objects. Each object must have attribute_name (string, required) and attribute_value (string, required). Optional: parent_product_id (integer). Replaces all existing variations. |
components |
array | Optional | Array of component objects for bundle/set products. Each object must have component_product_id (integer, required). Optional: quantity (integer, default: 1). Replaces all existing components. |
Returns the stock of a product per storage location, including batch number (Charge) and expiry date (MHD). total_stock is all available stock, sellable_stock is the stock your sales channels see (everything except Sperr-Lager locations).
Books stock for a product at a storage location: book in, book out, correct a quantity, clear a location or move stock to another location. Batch number (Charge) and expiry date (MHD) are supported for every booking. Each booking is written to the stock movement log (Bestandsprotokoll) and the new sellable stock is sent to the product's sales channel, exactly like a booking in the beeShip app.
| Action | Description |
|---|---|
add |
Books stock in at location. The location is created automatically if it does not exist yet. |
subtract |
Books stock out at location. Without batch / expiry date, stock with the earliest expiry date is used first. |
set |
Sets the quantity of one stock row (location + batch + expiry date) to quantity, e.g. after a stock count. 0 clears the row. |
remove |
Books out all stock at location (only the given batch / expiry date, if provided). |
transfer |
Moves quantity from location to to_location. Batch and expiry date move along. |
| Field | Type | Required | Description |
|---|---|---|---|
action |
string | Required | add, subtract, set, remove or transfer |
location |
string | Required | Storage location code (for transfer: the source location) |
quantity |
integer | Required | Number of units, at least 1. For set the new quantity (0 allowed). Not used for remove. |
to_location |
string | Optional | Target location code. Required for transfer; created automatically if it does not exist. |
batch_number |
string | Optional | Batch number / Charge (max 50 characters) |
expiry_date |
date | Optional | Expiry date / MHD in the format YYYY-MM-DD |
location_type |
string | Optional | Type of location: picking, nachschub or sperr |
to_location_type |
string | Optional | Type of to_location: picking, nachschub or sperr |
reason |
string | Optional | Reason shown in the stock movement log (default API) |
set and transfer use exactly the given combination (no batch = stock without batch).subtract and transfer are rejected with 409 if the location holds less than the requested quantity. Nothing is booked in that case.add, subtract, set and remove are booked for all of them.sperr location do not change the stock your sales channels see.Permanently delete a product from the system.
Manage customer orders, including creation, updates, and status tracking.
| Parameter | Type | Description |
|---|---|---|
status |
string | Filter by status: pending, processing, shipped, completed, cancelled |
limit |
integer | Items per page (default: 20, max: 100) |
Create a new customer order with full shipping details and line items.
| Field | Type | Required | Description |
|---|---|---|---|
order_number |
string | Optional | Your order number (auto-generated if not provided) |
external_order_id |
string | Optional | Order ID from external system (Shopify, WooCommerce, etc.) |
source_platform |
string | Optional | Source platform (shopify, woocommerce, manual, api, etc.) |
customer |
object | Required | Customer information object |
customer.name |
string | Required | Customer full name |
customer.email |
string | Required | Customer email address |
customer.phone |
string | Optional | Customer phone number |
shipping_address |
object | Required | Shipping address object |
shipping_address.name |
string | Optional | Recipient name (defaults to customer name) |
shipping_address.street |
string | Required | Street name |
shipping_address.house_number |
string | Required | House/building number |
shipping_address.postal_code |
string | Required | Postal/ZIP code |
shipping_address.city |
string | Required | City name |
shipping_address.country |
string | Required | Country name |
shipping_address.country_code |
string | Required | 2-letter country code (DE, US, GB, etc.) |
billing_address |
object | Optional | Billing address (defaults to shipping address if not provided) |
items |
array | Required | Array of order line items |
items[].product_id |
integer | Required | Product ID from your products table |
items[].quantity |
integer | Required | Quantity ordered |
items[].price |
decimal | Optional | Override price (uses product price if not provided) |
shipping_cost |
decimal | Optional | Shipping cost |
tax_amount |
decimal | Optional | Tax amount |
discount |
decimal | Optional | Discount amount |
currency |
string | Optional | Currency code (default: EUR) |
notes |
string | Optional | Internal notes |
customer_comment |
string | Optional | Customer's comment/note |
tags |
array | Optional | Array of tag strings (e.g., ["express", "gift", "vip"]) |
Update an existing order. Send only the fields you want to update. All fields are optional - only include the fields you wish to modify. Note: source_platform is automatically set to 'api' for all API updates.
| Field | Type | Required | Description |
|---|---|---|---|
external_order_id |
string | Optional | External order identifier from source platform |
source_platform |
string | Optional | Source platform identifier (automatically set to 'api' for API updates, regardless of input value) |
shop_id |
integer | Optional | Shop/store identifier (defaults to tenant_id if not provided) |
order_number |
string | Optional | Order number (must be unique within tenant) |
order_date |
datetime | Optional | Order date and time (format: YYYY-MM-DD HH:MM:SS) |
status |
string | Optional | Order status. Valid values: 'bestellt (ordered)', 'bestaetigt (confirmed)', 'bezahlt (paid)', 'versendet (shipped)', 'reklamation (complaint)', 'geloescht (deleted)', 'abgeschlossen (completed)', 'storniert (canceled)', 'archiviert (archived)', 'bewertet (reviewed)', 'gepackt (packed)', '1_mahnung (1st reminder)', '2_mahnung (2nd reminder)', 'angeboten (offered)', 'zahlungserinnerung (payment reminder)', 'im_fulfillment (in fulfillment)'. Triggers post-processing (shipping rules, tag rules, picking strategy) when changed. |
total_amount |
decimal | Optional | Total order amount (default: 0) |
currency |
string | Optional | Currency code (default: EUR) |
shipping_provider_id |
integer | Optional | Shipping provider identifier |
shipping_provider_product_id |
integer | Optional | Shipping provider product/service identifier |
seller_comment |
text | Optional | Internal seller/merchant comments |
customer_comments |
text | Optional | Customer comments/notes |
shipping_cost |
decimal | Optional | Shipping cost amount |
payment_terms |
string | Optional | Payment terms description |
items |
array | Optional | Array of order item objects. Each item should have product_sku (string) or product_id (integer). Required fields: quantity (integer, default: 1). Optional fields: external_item_id, transaction_id, product_title, ean, unit_price, total_price, tax_amount, tax_index, is_component (boolean), parent_set_info, product_type. Replaces all existing items. Maximum 250 items per request. |
addresses |
array | Optional | Array of address objects. Each address must have address_type (string, required). Optional fields: external_address_id, company, first_name, last_name, street, house_number, additional_info, postal_code, city, state, country, country_code, phone, email. Replaces all existing addresses. |
tags |
array | Optional | Array of tag strings. Replaces all existing tags. Triggers tag rules and picking strategy when changed. |
Manage picklist templates for warehouse picking operations. The picklists these templates create are in the Active Picklists API.
Create a new picklist template for warehouse picking operations. Picklist templates define how orders are grouped and processed for picking.
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | Required | Picklist template name |
tag |
string | Required | Unique tag identifier for this picklist template. Must be unique within tenant. Used to match orders to this picklist. |
picking_type |
string | Required | Type of picking method. Valid values: 'rollende kommissionierung' (rolling picking), 'sammelkommissionierung' (batch picking), 'ausdruckbare pickliste' (printable picklist) |
max_orders_per_list |
integer | Required | Maximum number of orders that can be assigned to a single picklist |
description |
string | Optional | Description of the picklist template |
warehouse_id |
integer | Optional | Warehouse identifier (default: 1) |
sorting_method |
string | Optional | Method for sorting orders in the picklist. Valid values: 'order_date', 'priority', 'shipping_method', 'custom' (default: 'order_date') |
batch_size |
integer | Optional | Batch size for processing (default: 0) |
auto_assign |
boolean | Optional | Whether to automatically assign orders to this picklist (default: 0/false) |
require_confirmation |
boolean | Optional | Whether confirmation is required before processing (default: 0/false) |
print_labels |
boolean | Optional | Whether to print labels for items (default: 1/true) |
consolidate_items |
boolean | Optional | Whether to consolidate items from multiple orders (default: 0/false) |
priority |
integer | Optional | Priority level for picklist assignment (lower numbers = higher priority). Must be unique within picking type. Ignored for 'ausdruckbare pickliste' type (automatically set to 0). Valid only for 'rollende kommissionierung' and 'sammelkommissionierung' types. |
show_artikel_barcodes |
boolean | Optional | Whether to show product/article barcodes (default: 1/true) |
show_auftrag_barcodes |
boolean | Optional | Whether to show order barcodes (default: 1/true) |
is_active |
boolean | Optional | Whether the picklist template is active (default: 1/true) |
visible_users |
array | Optional | Array of user IDs (integers) who can see this picklist template. If not provided, template is visible to all users. |
tag field must be unique within your tenant. This tag is used to match orders to picklist templates. The priority field must be unique within the same picking type (for 'rollende kommissionierung' and 'sammelkommissionierung' only). For 'ausdruckbare pickliste' type, priority is automatically set to 0.
The real picklists in your warehouse – the lists the templates above produce. See status, orders, items, trolleys and the pick progress (what is picked and what is still open), and change or delete lists. This is the data behind the picklist dashboard and the printable picklists in beeShip.
409 when goods are already picked or the list is running/completed – add &force=1 to do it anyway (picked goods must then be put back by hand). Access tokens with the scope write:single can use PATCH but no DELETE.
Returns picklists with their progress. Without status only active picklists (draft and in progress) are returned, sorted like the dashboard: running first, then drafts, then completed; newest first.
| Parameter | Type | Required | Description |
|---|---|---|---|
status |
string | Optional | active (default), all, or a comma list of draft, in_progress, completed |
picking_type |
string | Optional | ausdruckbare pickliste, rollende kommissionierung, sammelkommissionierung or zweistufige kommissionierung |
template_id |
integer | Optional | Only picklists of this template |
warehouse_id |
integer | Optional | Only picklists of this warehouse |
assigned_user_id |
integer | Optional | Only picklists assigned to this user |
is_printed |
boolean | Optional | Printed or not printed picklists |
tag |
string | Optional | Picklists containing an order with this tag |
cart_id |
string | Optional | Picklists on this trolley, or none for picklists without a trolley |
has_shipped_orders |
boolean | Optional | Picklists with (or without) shipped orders |
order_id |
integer | Optional | Picklists containing this order |
external_order_id |
string | Optional | Picklists containing this order (ID from the sales channel) |
created_from |
date | Optional | Created on or after (YYYY-MM-DD or date-time) |
created_to |
date | Optional | Created on or before (YYYY-MM-DD = whole day) |
page |
integer | Optional | Page number (default: 1) |
limit |
integer | Optional | Items per page (default: 20, max: 250) |
Counts your picklists per status and per picking type.
Returns one picklist including its progress, all orders and all items (lines). orders and items are shortened in this example – each entry looks like the ones under "Get Orders" and "Get Items".
Where is the picklist? Lines, quantities and orders split into picked, partially picked and open, plus every line that still has to be picked.
The orders on the picklist in picking order, with their pick state (open, partially_picked, picked), tags and shipping label.
Every line of the picklist: product, required, picked and open quantity, the storage location it was picked from and who picked it. Use picklist_item_id to change the picked quantity.
Changes the status, the assigned picker or the printed flag. Setting the status to completed runs the same steps as finishing the list in beeShip (history, orders to "im Fulfillment", trolleys released). The response is the updated picklist, like "Get Picklist".
| Parameter | Type | Required | Description |
|---|---|---|---|
status |
string | Optional | draft, in_progress or completed |
assigned_user_id |
integer|null | Optional | beeShip user who picks the list; null removes the assignment |
is_printed |
boolean | Optional | Mark the list as printed or not printed |
draft. The status cancelled is not used – delete the picklist instead.
Deletes the picklist with the same cleanup as the picklist dashboard. Its orders become free and can be assigned to a new picklist. Draft picklists without picked goods are deleted directly; everything else needs &force=1.
| Parameter | Type | Required | Description |
|---|---|---|---|
force |
boolean | Optional | 1 = also delete running/completed lists or lists with picked goods |
Moves an order up or down on the picklist (lower sort_order comes first). Returns the orders in their new order.
| Parameter | Type | Required | Description |
|---|---|---|---|
sort_order |
integer | Required | New position of the order |
Takes one order off the picklist; the order becomes free again. If it was the last order, the picklist is deleted automatically (picklist_deleted: true). An order with picked goods or a completed list needs &force=1.
| Parameter | Type | Required | Description |
|---|---|---|---|
force |
boolean | Optional | 1 = remove even with picked goods or on a completed list |
Sets the picked quantity of one line (0 up to the required quantity). No stock is booked. Lowering the quantity also lowers the recorded pick locations, so the packing station never books more than was picked. Not possible on a completed picklist.
| Parameter | Type | Required | Description |
|---|---|---|---|
quantity_picked |
integer | Required | New picked quantity, 0 … quantity_required |
Manage suppliers (vendors/manufacturers) with full contact and address information.
Create a new supplier (vendor) in the system.
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | Required | Supplier company name |
contact_person |
string | Optional | Primary contact person name |
email |
string | Optional | Supplier email address |
phone |
string | Optional | Supplier phone number |
website |
string | Optional | Supplier website URL |
street |
string | Optional | Street name |
house_number |
string | Optional | House/building number |
postal_code |
string | Optional | Postal/ZIP code |
city |
string | Optional | City name |
country |
string | Optional | Country name |
country_code |
string | Optional | 2-letter country code (DE, US, etc.) |
tax_id |
string | Optional | Tax ID / VAT number |
notes |
text | Optional | Internal notes about the supplier |
Manage purchase orders (vendor orders) from suppliers for inventory replenishment.
| Parameter | Type | Required | Description |
|---|---|---|---|
page |
integer | Optional | Page number (default: 1) |
limit |
integer | Optional | Items per page (default: 20, max: 250) |
status |
string | Optional | Filter by status (pending, ordered, received, cancelled) |
supplier_id |
integer | Optional | Filter by supplier ID |
Retrieve detailed information about a specific vendor order including all line items.
Create a new purchase order to order inventory from a supplier.
| Field | Type | Required | Description |
|---|---|---|---|
supplier_id |
integer | Required | ID of the supplier |
order_number |
string | Optional | Custom order number (auto-generated if not provided) |
order_date |
date | Optional | Order date (YYYY-MM-DD, defaults to today) |
expected_delivery |
date | Optional | Expected delivery date (YYYY-MM-DD) |
items |
array | Required | Array of order line items |
items[].product_id |
integer | Required | Product ID to order |
items[].quantity |
integer | Required | Quantity to order |
items[].unit_price |
decimal | Optional | Purchase price per unit |
currency |
string | Optional | Currency code (default: EUR) |
notes |
text | Optional | Internal notes for the order |
Update an existing vendor order. Send only the fields you want to update. All fields are optional - only include the fields you wish to modify.
| Field | Type | Required | Description |
|---|---|---|---|
status |
string | Optional | Vendor order status. Common values: 'pending', 'ordered', 'confirmed', 'in_transit', 'received', 'cancelled', 'completed' |
expected_delivery |
date | Optional | Expected delivery date (format: YYYY-MM-DD) |
notes |
text | Optional | Internal notes or comments about the vendor order |
supplier_id |
integer | Optional | Supplier/vendor identifier (must exist in system) |
order_number |
string | Optional | Purchase order number (must be unique within tenant) |
order_date |
date | Optional | Order date (format: YYYY-MM-DD) |
items |
array | Optional | Array of order item objects. Each item should have product_id (integer, required), quantity (integer, required), and unit_price (decimal, optional). Replaces all existing items. |
items array, the entire array is replaced. To add items, include all existing items plus the new ones.
Delete a vendor order from the system. Only orders with "pending" status can be deleted.
Note: Orders that have been placed (status: ordered or received) cannot be deleted. Use the status update endpoint to cancel them instead.
Manage customer returns (Retouren) — covers everything done by the desktop returns.php and mobile mobile_returns.php pages: create returns from a known order or unknown package, scan/inspect items, transition status, upload photos, restock to warehouse locations, record refunds, and read the full audit history.
All routes are tenant-scoped (via auth headers) and live under the returns endpoint. Sub-resources use PATH_INFO, exactly like the Orders API:
GET /api/index.php/{return_id}?endpoint=returnsGET /api/index.php/{return_id}/items?endpoint=returnsPATCH /api/index.php/{return_id}/status?endpoint=returnsPOST /api/index.php/{return_id}/restock?endpoint=returnsPOST /api/index.php/{return_id}/refund?endpoint=returnsGET /api/index.php/search?endpoint=returns&q=...GET /api/index.php/reasons?endpoint=returnsGET /api/index.php/conditions?endpoint=returnsStatus enum: pending, received, inspecting, approved, rejected, processing, completed, cancelled
Return type: customer_initiated, manual, system
Refund method: original_payment, store_credit, exchange, none
File category: photo, document, inspection, damage, other
Returns a paginated list of returns for the authenticated tenant, with an embedded reason name and aggregate item counts per return.
| Param | Type | Description |
|---|---|---|
page | int | Page number (default 1) |
limit | int | Items per page, max 250 (default 25) |
status | string | Single status or comma-separated list (e.g. received,inspecting) |
return_type | string | One of customer_initiated, manual, system |
order_id | int | Filter by original order ID |
external_order_id | string | Filter by external (platform) order ID |
tracking_number | string | Exact match on tracking number |
return_number | string | Partial match on return number |
assigned_to | int | Filter by assigned user_id |
warehouse_id | int | Filter by warehouse |
date_from / date_to | datetime | Filter on created_at (ISO format) |
q | string | Free-text search across number, tracking, email, name, external order ID |
sort | string | created_at | updated_at | status | return_number | received_at |
dir | string | asc | desc (default desc) |
Returns the full return record, joined with its reason, plus arrays of items, files, and the most recent 50 history entries.
Creates a return. Pass order_id for a known-order return, or set unknown: true for a package that arrived without prior context (status defaults to received). For known returns the API validates each item against the order's quantities and any prior non-cancelled returns to prevent over-returning.
| Field | Type | Required | Description |
|---|---|---|---|
order_id | int | Required (known) | ID of the original order in this tenant |
unknown | bool | Optional | If true, no order_id needed; status auto-set to received |
return_type | string | Optional | Default manual |
status | string | Optional | Default pending (or received for unknown) |
return_number | string | Optional | Auto-generated (RET-YYYY-NNNNNN) if omitted |
tracking_number | string | Optional | Tracking number of incoming package |
return_reason_id | int | Optional | Must belong to this tenant |
custom_reason | text | Optional | Free-text reason if not using predefined |
customer_name / customer_email | string | Optional | Customer info for notifications |
shipping_address_id / billing_address_id | int | Optional | References to order_addresses |
notes / customer_notes | text | Optional | Internal / customer-provided notes |
assigned_to / warehouse_id | int | Optional | Assignee and warehouse |
items[] | array | Required (known) | See item fields below |
| Field | Type | Description |
|---|---|---|
order_item_id | int | FK to order_items.item_id |
product_id / product_sku / product_name / ean | mixed | Snapshot of product info |
quantity_returned | int | Required, > 0; cannot exceed remaining quantity on the order |
quantity_received / quantity_approved | int | Optional initial inspection counts |
condition_id | int | FK to return_conditions |
unit_price / refund_amount | decimal | Optional pricing |
restock_location_id | int | Optional pre-assigned storage location |
Response 201: { return_id, return_number, status, message }
Updates mutable fields on the return. Cannot change status here — use the dedicated status endpoint so transitions are timestamped and logged.
Updatable: return_number, tracking_number, return_reason_id, custom_reason, customer_email, customer_name, shipping_address_id, billing_address_id, notes, customer_notes, assigned_to, warehouse_id, refund_amount, refund_method.
Soft-cancels the return (sets status to cancelled). Returns already in completed status are rejected with HTTP 409. Optional JSON body: { "notes": "..." }.
Transitions the return status, automatically stamps the matching timestamp column (received_at, inspected_at, approved_at, rejected_at, completed_at) and writes a row to return_history.
Returns items with their condition info joined in (condition_name, condition_code, can_restock).
Appends items to an existing return — primarily used to assign products to an unknown package once it has been inspected. If the return is linked to an order, the same over-return validation is applied (taking already-added items on this same return into account).
Updates inspection-related fields on a single item.
Updatable: quantity_received, quantity_approved, quantity_rejected, condition_id, condition_notes, inspection_notes, unit_price, refund_amount, restock_location_id.
Removes a return item. Blocked (HTTP 409) when the return status is processing or completed.
Marks an inspected item as restocked at a warehouse location. Verifies the location belongs to the tenant and that quantity does not exceed quantity_returned.
Marks the return as refunded (sets refund_processed = 1, stamps refund_processed_at) and logs a refunded history entry.
Lists all active files/photos/documents attached to the return.
Accepts two modes:
file part plus optional file_category, return_item_id, ftp_server_id, description form fields. The server stores the file under uploads/returns/{tenant_id}/.file_path, file_name, file_size, file_type, mime_type, ftp_server_id. Use this when the mobile app already pushed the file to an FTP server.Soft-deletes the file (sets is_active = 0).
Returns up to limit (default 100, max 500) history rows, newest first, with the username of the actor. metadata is decoded JSON.
Lightweight search across return number, tracking number, external order ID, customer email and name. Intended for autocomplete / mobile lookup. Required: q. Optional: limit (default 20, max 50).
List or create configurable return reasons for this tenant. POST requires reason_code and reason_name; optional flags: requires_approval, auto_approve, requires_inspection, allow_partial_return, refund_percentage, sort_order, description.
List configured item conditions (e.g. Wie Neu, Beschädigt) used in item inspections.
return_history (action + previous/new status + user_id + optional JSON metadata).return_reason_id, condition_id, location_id, order_id) are verified against the authenticated tenant.quantity_returned across all prior non-cancelled returns for the same order before allowing new items.returns (received_at, inspected_at, …).