Fulfillment Manager API · customer
Record that the customer opened the link
POST /customer/{tenantId}/{token}/viewed
Record that the customer opened the link: appends fulfillment.customer-link-viewed, naming the notification when the token carries one, which is how the notifications service learns its message was opened.
404 CustomerLinkNotFound for a token that opens nothing. Idempotent by state: a link is recorded opened once, and once for each message that carried it, so a reopened page appends nothing.
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.
Retries
Idempotent by state: a link is recorded opened once, and once for each message that carried it, so a reopened page appends nothing.
Why every write carries a key: Idempotency and retries.
Facts appended
fulfillment.customer-link-viewed
What a fact is: Facts and the journal.
AI agent tool
No agent tool. recorded by the hosted page when the customer opens their link; no person or agent opens a customer's link for them
Connecting an agent: AI agents.
Example
From Share a quote your customer can accept, step 11: The page records it opened.
curl -X POST 'https://fulfillment.getmanifold.io/customer/org_01a15a10-2b3c-7d4e-8f50-61728394a5b6/01a15a103c4d7e5f8a61728394a5b6c7.01a15a104d5e7f608b72839405b6c7d8.Kd3mT8qWz1pLx5vBn2RyGA/viewed'const response = await fetch("https://fulfillment.getmanifold.io/customer/org_01a15a10-2b3c-7d4e-8f50-61728394a5b6/01a15a103c4d7e5f8a61728394a5b6c7.01a15a104d5e7f608b72839405b6c7d8.Kd3mT8qWz1pLx5vBn2RyGA/viewed", {
method: "POST",
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);Answers 204 with no body.
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 | The request was refused, and nothing changed. | Nothing changed. |
How refusals work everywhere: Errors.
Used in
- Share a quote your customer can accept, step 11: The page records it opened