completionPolicy is post-delivery buyer protection for marketplace digital goods (codes, game currency, licenses, accounts). It is distinct from fulfillmentPolicy (pre-delivery purchase proof) and from progressiveRelease (hourly slice payouts).
Send it on Create Escrow instead of completionDeadlineDays when the seller must mark delivered before the buyer can release funds.
How it differs from a normal escrow
A normal quick/standard escrow lets the buyercomplete from paid without a deliver step (buyer_early_release). With completionPolicy.type: "delivery_confirmation":
- the buyer cannot release from
paid(DELIVERY_REQUIRED) - the seller calls Deliver Escrow
completionDeadlineisdeliveredAt + buyerReviewDeadlineHours × 3600000(exact hours, not calendar days)- the buyer may accept immediately or open a dispute before that deadline
- if they stay silent, DHMAD auto-completes and releases funds
- there is no
autoCompleteflag — silence always releases
Attributes (POST /v1/escrows)
Works with
mode: "quick" or mode: "standard". Can be combined with fulfillmentPolicy.type: "purchase_proof_required" (proof first, then deliver, then this window). buyerReviewDeadlineHours on completionPolicy is the post-delivery protection window. The same field name on fulfillmentPolicy remains the pre-delivery proof-review timeout.
In the API Explorer, expand POST /v1/escrows and select the Quick mode with delivery confirmation request example.
Create example
Never expose your API key in the browser. From your backend:Fields echoed on GET
Create Escrow201 and Get Escrow return:
Hosted checkout shows the frozen hours to the buyer before funding.
Lifecycle
1
Create
Freeze hours on Create Escrow. Do not send
completionDeadlineDays.2
Fund
Send the buyer to an
accept_pay checkout session. Status becomes paid.3
Deliver
Seller calls POST /escrows/:id/deliver. Sets
deliveredAt and completionDeadline. If you also use purchase proof, deliver stays blocked until proof is accepted (409 PROOF_NOT_ACCEPTED).4
Release or dispute
Buyer
complete checkout session, or dispute before completionDeadline.5
Silence
Hourly job auto-completes at the stored deadline. The deadline itself is authoritative: a late dispute is rejected even if cron has not run yet.
Error codes
A dispute opened before the deadline still pauses auto-complete.
Typical marketplace pattern
POST /v1/escrowswithcompletionPolicy.accept_pay→ buyer pays.- Your app delivers the digital good; seller (or your backend acting as seller) calls
POST /deliver. - Buyer
completewhen satisfied, ordisputeif the code/account is bad. - Listen for
escrow.completed(or dispute webhooks). Poll Get Escrow if you need to confirm after redirect.

