Fulfillment Manager API · orders
An order's or quote's margin
GET /orders/{orderId}/margins
An order's or quote's margin, per line and in total: revenue net of discounts and tax against each SKU's cost basis now (a kit, its parts').
no-cost lines are counted, never guessed; belowMinimum flags a line under its catalog's minimum. Read-only.
Access
Requires margins:read.
How scopes come from roles: Scopes and roles. Getting a token: Authentication and app tokens.
AI agent tool
Agents call this as fulfillment_get_order_margins (Fulfillment: Get order margins), in the accounting toolset. It only reads.
Connecting an agent: AI agents.
Example
curl -X GET 'https://fulfillment.getmanifold.io/orders/ord_01a15652-63f7-7a81-9b92-d8e9f0a1b2c3/margins' \
-H "Authorization: Bearer $MANIFOLD_TOKEN"const response = await fetch("https://fulfillment.getmanifold.io/orders/ord_01a15652-63f7-7a81-9b92-d8e9f0a1b2c3/margins", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.MANIFOLD_TOKEN}` },
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);
const answer = await response.json();{
"orderId": "ord_01a15652-63f7-7a81-9b92-d8e9f0a1b2c3",
"currency": "AUD",
"lines": [
{
"lineId": "lin_01a15652-63f7-7a81-9b92-e9f0a1b2c3d4",
"sku": "MUG-SPECKLE",
"catalogId": "cat_01a15880-2a10-7b2c-8d3e-4f5a6b7c8d9e",
"quantity": 48,
"status": "costed",
"revenueCents": 100800,
"unitCostCents": 1250,
"costCents": 60000,
"marginCents": 40800,
"marginBps": 4048,
"minimumMarginBps": 3500,
"belowMinimum": false
},
{
"lineId": "lin_01a15652-63f7-7a81-9b92-f0a1b2c3d4e5",
"sku": "BOWL-SALT-L",
"catalogId": "cat_01a15880-2a10-7b2c-8d3e-4f5a6b7c8d9e",
"quantity": 6,
"status": "costed",
"revenueCents": 22800,
"unitCostCents": 2600,
"costCents": 15600,
"marginCents": 7200,
"marginBps": 3158,
"minimumMarginBps": 3500,
"belowMinimum": true
}
],
"order": {
"revenueCents": 123600,
"costCents": 75600,
"marginCents": 48000,
"marginBps": 3883,
"linesWithoutCost": 0,
"unpricedLines": 0,
"linesBelowMinimum": 1
}
}The panel writes this call in other languages. It does not send it: Manifold's APIs do not take calls from a web
page on another site, so run the call from your own code or terminal. The whole API as OpenAPI: fulfillment-manager.openapi.json. Base URL https://fulfillment.getmanifold.io.
Errors
Every refusal is a status and a JSON body whose _tag names it. A refused call changes nothing.
401
| Refusal | What it means | What to do |
|---|---|---|
Unauthorized reason | The token is missing, expired or not one Manifold issued. | Get a fresh token and send the call again. |
TokenAlreadyUsed tokenId | A single-use app token was already spent. | Mint a new token for this call. |
402
| Refusal | What it means | What to do |
|---|---|---|
SubscriptionRequired status | The organization's subscription has lapsed, so writes are refused. | An owner settles billing. Reads still work meanwhile. |
403
| Refusal | What it means | What to do |
|---|---|---|
TenantRequired userId | The token names no organization. | Choose the organization, then get a new token. |
ScopeRequired required | The token's roles do not grant the scope this call needs. | Ask an owner or admin for a role that grants it. |
404
| Refusal | What it means | What to do |
|---|---|---|
FulfillmentOrderNotFound orderId | No such record in this organization. | Check the id in the path or the body. |
409
| Refusal | What it means | What to do |
|---|---|---|
MirroredFromSource source | This area is fed by your source system until the organization goes live. | Make the change in the source system, or go live first. |
502
| Refusal | What it means | What to do |
|---|---|---|
InventoryUnavailable reason | The inventory service did not answer, so nothing changed. | Try again shortly. |
503
| Refusal | What it means | What to do |
|---|---|---|
RequestLogUnavailable tokenId, reason | The service could not record the request, so it did nothing. | Try again shortly. |
How refusals work everywhere: Errors.