Fulfillment Manager API · customer
The one document a customer link opens
GET /customer/{tenantId}/{token}
The one document a customer link opens — a quote, an order's status and parcels, an invoice with the order's payments, or a parcel's tracking — presented as the organization's messages present it, with what the customer may do (actions) and the business's country and time zone to write money and dates in.
404 CustomerLinkNotFound for any token that opens nothing (unknown, altered, revoked, another organization's); 429 CustomerLinkThrottled when one link is asked too often. Appends nothing: opening is recorded by POST /customer/:tenantId/:token/viewed.
Access
Public: a customer holds no account: the signed link token in the path is the credential, checked before anything is read
No token: the link, the claim or the first message is the credential, as the description says.
How scopes come from roles: Scopes and roles. Getting a token: Authentication and app tokens.
AI agent tool
No agent tool. what a customer's signed link opens, read by the hosted pages; staff and agents read the order itself with fulfillment_get_order
Connecting an agent: AI agents.
Example
curl -X GET 'https://fulfillment.getmanifold.io/customer/org_01a1586e-f9f6-7a8b-9c7d-6e5f4a3b2c1d/01a1565263f77a819b92d8e9f0a1b2c3.01a156531a2b7c3d8e4f5a6b7c8d9e0f.q0W8rTz3mPd5LkXv2NfYbA'const response = await fetch("https://fulfillment.getmanifold.io/customer/org_01a1586e-f9f6-7a8b-9c7d-6e5f4a3b2c1d/01a1565263f77a819b92d8e9f0a1b2c3.01a156531a2b7c3d8e4f5a6b7c8d9e0f.q0W8rTz3mPd5LkXv2NfYbA", {
method: "GET",
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);
const answer = await response.json();{
"tenantId": "org_01a1586e-f9f6-7a8b-9c7d-6e5f4a3b2c1d",
"linkId": "cpl_01a15653-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
"orderId": "ord_01a15652-63f7-7a81-9b92-d8e9f0a1b2c3",
"country": "AU",
"timeZone": "Australia/Sydney",
"actions": {
"accept": true,
"decline": true
},
"document": {
"kind": "quote",
"status": "open",
"number": "SO-01041",
"quote": {
"currency": "AUD",
"reference": "QUOTE-HARBOUR-OCT",
"issuedAt": "2026-10-19T22:44:30.812Z",
"validUntil": "2026-11-02T00:00:00.000Z",
"companyName": "Harbour Ceramics",
"lines": [
{
"sku": "MUG-SPECKLE",
"name": "Speckled stoneware mug",
"quantity": 48,
"unitPriceCents": 2100,
"pricesIncludeTax": false,
"discountCents": 0,
"totalCents": 100800,
"taxCents": 10080,
"taxClasses": [
"standard"
]
},
{
"sku": "BOWL-SALT-L",
"name": "Salt-glaze serving bowl, large",
"quantity": 6,
"unitPriceCents": 3800,
"pricesIncludeTax": false,
"discountCents": 0,
"totalCents": 22800,
"taxCents": 2280,
"taxClasses": [
"standard"
]
}
],
"totals": {
"presentation": "exclusive",
"linesCents": 123600,
"discountCents": 0,
"shippingCents": 2500,
"netCents": 126100,
"taxCents": 12610,
"totalCents": 138710,
"breakdown": []
}
}
}
}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.
404
| Refusal | What it means | What to do |
|---|---|---|
CustomerLinkNotFound | No such record in this organization. | Check the id in the path or the body. |
429
| Refusal | What it means | What to do |
|---|---|---|
CustomerLinkThrottled retryAfterSeconds | One link is asked too often. | Nothing changed. |
How refusals work everywhere: Errors.
Used in
- Share a quote your customer can accept, step 10: Your customer opens it