Update a payment link
AI agents: read /llms.txt; add .md to any page URL. This page as Markdown: /reference/payment-links/v2-payment-link-update.md. Index of every page and the rules for every call: /llms.txt. Guides and concepts in one file: /llms-full.txt. OpenAPI: /openapi.json.
PUT/
A payment link records how payments already received on a sales order are split across its invoices (the web app calls this a payment allocation). It is not a URL or payment page your customer opens to pay, and it moves no money.
Changes the note and the allocations in one call: delete and update act on existing allocations (by allocation id), create adds new ones (a payment and an invoice of the same order). Allocations you leave out stay as they are. Returns the link as Show one payment link does.
Amounts in allocations must use exactly 3 decimal places (dp: 3):
- Correct:
{ "value": 12500, "dp": 3 }for 12.50. - Wrong:
{ "value": 1250, "dp": 2 }— the server always interpretsvalueas thousandths (scale 3), which would mean 1.250, and validation requiresdp: 3.
In answers, the link's own total uses 4 decimal places ({ "value": 175000, "dp": 4 } is 17.50): always read each pair's dp.
Amounts are capped, not refused: an allocation never exceeds what the invoice still owes or what the payment has left. A create row asking for more than the payment has left, or for an invoice with nothing left to pay, is skipped without an error. Read the response to see what was saved.
Business rules
- Payments and invoices must belong to the link's sales order; others are skipped.
- For
update,total.dpmust be 3 andtotal.value0 or more (422 otherwise). - Deletes run first, then updates, then creates, so you can move money from one invoice to another in one call.
Side effects
- Changes how much each invoice shows as paid.
- Updates the order's customer's balance totals in the background.
- No money moves and nothing is sent to the customer. Open Admin Portal pages refresh, and so do Customer Portal pages the customer has open.
Path parameters
Your team slug, shown as Team ID next to your API key in Profile.
- Example
your-team
- Example
The payment link's hash id. Hash ids only: a unique key or a document number gives 404.
- Example
IirNDCwiaCVSKx
- Example
Request body
application/json, required.
allocated_transactionsarray of objectsChanges to existing allocations.
Fields of each item (3)
- One of:
"update","delete"
- One of:
The allocation id from
allocated_transactions[].id.totaldecimal pairRequired for
update: the new allocated amount withdp: 3(for example{ "value": 12500, "dp": 3 }for 12.50).valueis always read as thousandths.- See Money and quantities.
notestringA note on the link.
unallocated_transactionsarray of objectsNew allocations.
Fields of each item (4)
- Always
"create"
- Always
The amount to allocate. Send it: the server doesn't require it, and a row without it adds a 0.000 allocation.
valueis always read as thousandths whateverdpsays (for example send{ "value": 12500, "dp": 3 }for 12.50).- See Money and quantities.
An invoice of the same sales order.
A payment on the same sales order.
Response
200Successful response.
Child fields (7)
One row per allocation.
Fields of each item (6)
statestring- Always
"existing"
- Always
idstringThe allocation. Send it in
allocated_transactions[].idto update or delete it.invoice_idstringThe invoice it pays.
totaldecimal pairThe allocated amount (usually 3 decimal places; a finer stored amount comes back with a larger
dp). A decimal pair: the amount isvalue÷ 10^dp({ "value": 1250, "dp": 2 }is 12.50). Readdpevery time: it can differ between fields and records.- See Money and quantities.
transaction_idstringThe payment.
unallocated_amountdecimal pairWhat the payment still has to allocate (usually 3 decimal places; a finer stored amount comes back with a larger
dp). A decimal pair: the amount isvalue÷ 10^dp({ "value": 1250, "dp": 2 }is 12.50). Readdpevery time: it can differ between fields and records.- See Money and quantities.
The payment link.
The sales order.
The sum of its allocations. A decimal pair: the amount is
value÷ 10^dp({ "value": 175000, "dp": 4 }is 17.50). Kept at 4 decimal places;{ "value": 0, "dp": 0 }when the link has no allocations. Readdpevery time.- See Money and quantities.
notestring | null
Errors
401The API key is missing or wrong (
unauthenticated).403You are not allowed to do this.
api_access_not_in_plan: your team's plan doesn't include API access (Pro and above, with an active subscription or trial), so every request answers this until the team upgrades. When your role lacks the permission the operation needs, the body is only{"message": "Insufficient Permission"}. Other refusals use the error envelope, withunauthorizedoruser_is_not_authorized.404Not found.
page_not_found: the team slug is unknown, you are not a member of the team, or an id in the path is not one of this team's.code: null, with a message that starts "No query results for": there is no record with that id.- When
- The link isn't your team's.
- Fix
- Check the id.
422The request was refused and changed nothing.
validation_failedlists what to fix inerror.fields; other codes name a business rule, explained inerror.message. A few checks answer with only{"message": "..."}. An operation that calls another service (a payment provider, a carrier, an accounting app) can answerconnect_timeout("Please retry again") when that service does not answer in time: the change may or may not have happened there, so read the record back before you retry.- When
- A row lacks
action, anid,invoice_idortransaction_id, or an updatetotalisn't 3 decimal places. - Fix
- Start from Get the starting point for editing a payment link and keep its shapes.
- When
- The order came from Shopify and was deleted there (
shopify_order_deleted_externally). - Fix
- Only local cleanup is allowed on that order.
Related
- GETGet the starting point for editing a payment link
/v2/ api/ store/ {team_slug}/ v2/ payment_link/ {hash_id}/ get_update_template - GETShow one payment link with allocations
/v2/ api/ store/ {team_slug}/ v2/ payment_link/ {hash_id} - POSTCreate a payment link for a sales order
/v2/ api/ store/ {team_slug}/ v2/ sales_order/ {hash_id}/ payment_link
