Prove that the money returned to the payment card of the buyer. A PaymentRefund object does not prove that money moved. This level proves the COMPLETED state on the refund and an event that carries it.

Contract identity.
FactValue
Contract idsquare.refund.completed
Version1.0.0
Hash996beade3905b671
Completion levelrefunded
PublisherBuilt and signed by Provely.
CertificationProvisional
SkillSquare 0.1.0
Valid for provider API versions2026-08-19

What is the intent?

Return the amount of the payment to the buyer.

What is the subject and the action?

MemberValue
Subject typesquare.payment_refund
Subject identityrefund_id = $action.result.refund.id
Canonical effectpayments.card_refund
Provider operationPOST /v2/refunds
Idempotencyidempotency_key, retry is safe

How does the evidence correlate with this operation?

StrategyAssuranceKeysRequired
resource_idstrongrefund_id from $action.result.refund.idyes
idempotency_keystrongidempotency_key from $operation.idno
fingerprintweakpayment_id from $input.payment_id; amount from $input.amountno

Which evidence does the contract require?

Minimum evidence level E2. An independent channel is required. Minimum channels: 1.

ChannelLevelIndependenceVerifierDescription
refund_readbackE2provider readbackhttpRead the refund from the provider. A condition path is $observed.refund_readback.refund.status.
refund_completed_eventsE3provider eventwebhookThe refund events of this refund that carry the status COMPLETED. The webhook verifier returns {events, count, latest, earliest, types, duplicates_dropped}.
refund_created_eventsE3provider eventwebhookThe refund.created events for the payment since the operation started. The webhook verifier returns {events, count, latest, earliest, types, duplicates_dropped}. A count above one shows a second refund of the payment.

Which conditions must all hold for VERIFIED?

ConditionMeaningPathOperatorExpectedEvidence
refund_status_completedThe refund states the completed state. The money reached the payment card of the buyer.$observed.refund_readback.refund.statuseqCOMPLETEDrefund_readback
refund_amount_matchesThe amount of the refund equals the requested amount.$observed.refund_readback.refund.amount_money.amounteq$input.amountrefund_readback
refund_payment_matchesThe refund names the payment that the intent named.$observed.refund_readback.refund.payment_ideq$input.payment_idrefund_readback
refund_created_in_windowThe provider created the refund after the operation started.$observed.refund_readback.refund.created_attime_after$operation.created_atrefund_readback
refund_completed_eventAt least one refund event of this refund carries the status COMPLETED.$observed.refund_completed_events.countgte1refund_completed_events

Which conditions give CONTRADICTED?

ConditionClassReasonPathOperatorExpected
refund_on_wrong_paymentwrong subjectThe refund belongs to a different payment than the intent named.$observed.refund_readback.refund.payment_idne$input.payment_id
refund_amount_mismatchwrong amountThe provider refunded a different amount than the intent stated.$observed.refund_readback.refund.amount_money.amountne$input.amount
refund_predates_operationpre existing stateThe refund is older than the operation. It proves nothing.$observed.refund_readback.refund.created_attime_before$operation.created_at
duplicate_refund_presentduplicate side effectSquare created more than one refund for the payment since the operation started. Do not retry.$observed.refund_created_events.countgt1

Which observed states map to a verdict before completion?

RuleMatchVerdictReason
terminal_failure$observed.refund_readback.refund.status eq "FAILED"FAILEDAn error stopped the refund. Square reports the failed state.
rejected$observed.refund_readback.refund.status eq "REJECTED"CONTRADICTEDSquare rejected the refund. No money moved back to the buyer.
still_transitional$observed.refund_readback.refund.status eq "PENDING"PENDINGThe refund awaits approval. The runtime observes again later.

How long does the runtime observe?

Timing memberValue
Initial delay1000 ms
Poll interval5000 ms
Backoffexponential factor 2, max 60000 ms
Maximum attempts40
Timeout604800000 ms
Stale read window20000 ms
On timeoutUNVERIFIABLE (evidence_unavailable_before_timeout), escalated to a person

Where do these rules come from?

  • square.openapi#/paths/~1v2~1refunds/post: square.openapi, retrieved 2026-09-08
  • square.openapi#/components/schemas/PaymentRefund/properties/status: square.openapi, retrieved 2026-09-08
  • square.docs.refunds#refunds/p1: square.docs.refunds, retrieved 2026-09-08
  • square.docs.refunds#refunds/the-status-of-a-refund/p2: square.docs.refunds, retrieved 2026-09-08
  • square.docs.refunds#refunds/the-status-of-a-refund/p5: square.docs.refunds, retrieved 2026-09-08
  • square.openapi#/components/schemas/PaymentRefund/properties/amount_money: square.openapi, retrieved 2026-09-08
  • square.openapi#/components/schemas/Money/properties/amount: square.openapi, retrieved 2026-09-08
  • square.openapi#/components/schemas/PaymentRefund/properties/payment_id: square.openapi, retrieved 2026-09-08
  • square.docs.refunds#refunds/identifiers-and-times/p1: square.docs.refunds, retrieved 2026-09-08
  • square.openapi#/components/schemas/PaymentRefund/properties/created_at: square.openapi, retrieved 2026-09-08
  • square.events#/events/refund.updated: square.events, retrieved 2026-09-08
  • square.docs.webhooks#webhooks/the-event-types/p5: square.docs.webhooks, retrieved 2026-09-08

Can square.refund.completed return VERIFIED from the action response alone?

No. The minimum evidence level is E2. The action response is E1. The completion conditions read refund_readback and refund_completed_events.

What happens after the timeout?

The verdict is UNVERIFIABLE with the reason evidence_unavailable_before_timeout. The operation goes to a person for review.