Skip to main content
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 buyer complete 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
  • completionDeadline is deliveredAt + 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 autoComplete flag — 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 Escrow 201 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

  1. POST /v1/escrows with completionPolicy.
  2. accept_pay → buyer pays.
  3. Your app delivers the digital good; seller (or your backend acting as seller) calls POST /deliver.
  4. Buyer complete when satisfied, or dispute if the code/account is bad.
  5. Listen for escrow.completed (or dispute webhooks). Poll Get Escrow if you need to confirm after redirect.
Do not send the buyer a complete session while status is paid — it returns DELIVERY_REQUIRED. Create that session after deliver.