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
curl -X GET 'https://fulfillment.getmanifold.io/customer/org_01a1586e-f9f6-7a8b-9c7d-6e5f4a3b2c1d/01a1565263f77a819b92d8e9f0a1b2c3.01a156531a2b7c3d8e4f5a6b7c8d9e0f.q0W8rTz3mPd5LkXv2NfYbA'
JavaScript (fetch)
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();
Response · 200 · application/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

RefusalWhat it meansWhat to do
CustomerLinkNotFound No such record in this organization.Check the id in the path or the body.

429

RefusalWhat it meansWhat to do
CustomerLinkThrottled retryAfterSeconds One link is asked too often.Nothing changed.

How refusals work everywhere: Errors.

Used in