Prove that Square holds an authorisation of the card for this amount. The card issuer authorised the amount, and Square holds the authorisation. This level does not prove a capture. The money did not move.

Contract identity.
FactValue
Contract idsquare.payment.approved
Version1.0.0
Hashc09b723501777746
Completion levelapproved
PublisherBuilt and signed by Provely.
CertificationProvisional
SkillSquare 0.1.0
Valid for provider API versions2026-08-19

What is the intent?

Get an authorisation of the card for the amount.

What is the subject and the action?

MemberValue
Subject typesquare.payment
Subject identitypayment_id = $action.result.payment.id
Canonical effectpayments.card_charge
Provider operationPOST /v2/payments
Idempotencyidempotency_key, retry is safe

How does the evidence correlate with this operation?

StrategyAssuranceKeysRequired
resource_idstrongpayment_id from $action.result.payment.idyes
idempotency_keystrongidempotency_key from $operation.idno
fingerprintweakreference_id from $input.reference_id; amount from $input.amountno

Which evidence does the contract require?

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

ChannelLevelIndependenceVerifierDescription
payment_readbackE2provider readbackhttpRead the payment from the provider. The http verifier returns the parsed object, so a condition path is $observed.payment_readback.payment.status. The card state sits at $observed.payment_readback.payment.card_details.status.
payment_created_eventsE3provider eventwebhookThe payment.created events for the reference since the operation started. The webhook verifier returns {events, count, latest, earliest, types, duplicates_dropped}. A count above one shows a second charge of the card.

Which conditions must all hold for VERIFIED?

ConditionMeaningPathOperatorExpectedEvidence
payment_presentThe provider holds the payment with the returned identifier.$observed.payment_readback.payment.ideq$action.result.payment.idpayment_readback
payment_authorisedThe payment holds an authorisation. A captured payment was authorised first, so both values satisfy this level.$observed.payment_readback.payment.statusin["APPROVED","COMPLETED"]payment_readback
payment_amount_matchesThe amount of the payment equals the requested amount. The member holds the amount without the tip.$observed.payment_readback.payment.amount_money.amounteq$input.amountpayment_readback
payment_currency_matchesThe currency of the payment equals the requested currency.$observed.payment_readback.payment.amount_money.currencyeq$input.currencypayment_readback
payment_created_in_windowThe provider created the payment after the operation started.$observed.payment_readback.payment.created_attime_after$operation.created_atpayment_readback
payment_created_eventAt least one payment.created event names the reference of this payment. The duplicate guard reads the same channel, so a workspace with no event endpoint cannot verify and cannot miss a second charge either.$observed.payment_created_events.countgte1payment_created_events

Which conditions give CONTRADICTED?

ConditionClassReasonPathOperatorExpected
payment_on_wrong_referencewrong subjectThe payment carries a different reference than the intent named.$observed.payment_readback.payment.reference_idne$input.reference_id
payment_amount_mismatchwrong amountThe provider charged a different amount than the intent stated.$observed.payment_readback.payment.amount_money.amountne$input.amount
payment_predates_operationpre existing stateThe payment is older than the operation. It proves nothing.$observed.payment_readback.payment.created_attime_before$operation.created_at
duplicate_payment_presentduplicate side effectSquare created more than one payment for the reference since the operation started. Do not retry.$observed.payment_created_events.countgt1

Which observed states map to a verdict before completion?

RuleMatchVerdictReason
terminal_failure$observed.payment_readback.payment.status eq "FAILED"FAILEDSquare reports a failed payment. The response carries an error code.
canceled$observed.payment_readback.payment.status eq "CANCELED"CONTRADICTEDSquare voided the payment. No money moved, and no retry can change that.
state_not_published$observed.payment_readback.payment.status eq "PENDING"UNVERIFIABLESquare states no meaning for this state. The runtime cannot decide. Ask a person.

How long does the runtime observe?

Timing memberValue
Initial delay1000 ms
Poll interval5000 ms
Backoffexponential factor 2, max 60000 ms
Maximum attempts40
Timeout900000 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~1payments/post: square.openapi, retrieved 2026-09-08
  • square.openapi#/paths/~1v2~1payments/post/responses/200: square.openapi, retrieved 2026-09-08
  • square.docs.payments#payments/autocomplete-and-the-approved-state/p3: square.docs.payments, retrieved 2026-09-08
  • square.docs.payments#payments/the-status-of-a-payment/p2: square.docs.payments, retrieved 2026-09-08
  • square.openapi#/components/schemas/Payment/properties/id: square.openapi, retrieved 2026-09-08
  • square.openapi#/paths/~1v2~1payments~1{payment_id}/get/responses/200: square.openapi, retrieved 2026-09-08
  • square.openapi#/components/schemas/Payment/properties/status: square.openapi, retrieved 2026-09-08
  • square.docs.payments#payments/the-status-of-a-payment/p3: square.docs.payments, retrieved 2026-09-08
  • square.openapi#/components/schemas/Payment/properties/amount_money: square.openapi, retrieved 2026-09-08
  • square.openapi#/components/schemas/Money/properties/amount: square.openapi, retrieved 2026-09-08
  • square.docs.payments#payments/amounts/p1: square.docs.payments, retrieved 2026-09-08
  • square.openapi#/components/schemas/Money/properties/currency: square.openapi, retrieved 2026-09-08
  • square.docs.payments#payments/amounts/p2: square.docs.payments, retrieved 2026-09-08
  • square.openapi#/components/schemas/Payment/properties/created_at: square.openapi, retrieved 2026-09-08
  • square.docs.payments#payments/identifiers/p2: square.docs.payments, retrieved 2026-09-08
  • square.events#/events/payment.created: square.events, retrieved 2026-09-08
  • square.docs.webhooks#webhooks/the-event-types/p2: square.docs.webhooks, retrieved 2026-09-08
  • square.docs.webhooks#webhooks/the-event-types/p7: square.docs.webhooks, retrieved 2026-09-08

Can square.payment.approved return VERIFIED from the action response alone?

No. The minimum evidence level is E2. The action response is E1. The completion conditions read payment_readback and payment_created_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.