Prove that the money of this capture moved from the payer to the payee. The captured payment reached the status COMPLETED. A 201 Created answer with the status PENDING is an object that exists and not money that moved.

Contract identity.
FactValue
Contract idpaypal.capture.completed
Version1.0.0
Hasha90c595b2f9203ed
Completion levelcapture_completed
PublisherBuilt and signed by Provely.
CertificationProvisional
SkillPayPal REST API 0.1.0
Valid for provider API versionsv2

What is the intent?

Capture the payment of the approved order and let the money move.

What is the subject and the action?

MemberValue
Subject typepaypal.capture
Subject identitycapture_id = $action.result.purchase_units[0].payments.captures[0].id
Canonical effectmoney.capture
Provider operationPOST /v2/checkout/orders/{id}/capture
Idempotencyidempotency_key through PayPal-Request-Id, retry is safe

How does the evidence correlate with this operation?

StrategyAssuranceKeysRequired
resource_idstrongcapture_id from $action.result.purchase_units[0].payments.captures[0].idyes
fingerprintweakorder_id from $input.order_id; amount from $input.amountno

Which evidence does the contract require?

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

ChannelLevelIndependenceVerifierDescription
capture_readbackE2provider readbackhttpRead the captured payment from the Payments API. A condition path is $observed.capture_readback.status, and the amount sits at $observed.capture_readback.amount.value as a string.
capture_completed_eventsE3provider eventwebhookThe PAYMENT.CAPTURE.COMPLETED events of the intended order since the operation started. The webhook verifier returns {events, count, latest, earliest, types, duplicates_dropped}. PayPal sends one for each capture that completes, so a count above one is a second movement of money.

Which conditions must all hold for VERIFIED?

ConditionMeaningPathOperatorExpectedEvidence
capture_presentThe Payments API holds the captured payment that the capture response named.$observed.capture_readback.ideq$action.result.purchase_units[0].payments.captures[0].idcapture_readback
capture_on_intended_orderThe captured payment belongs to the order that the intent named.$observed.capture_readback.supplementary_data.related_ids.order_ideq$input.order_idcapture_readback
capture_amount_matchesThe captured amount equals the requested amount. PayPal states the value as a string, so this is a string comparison and it normalizes nothing.$observed.capture_readback.amount.valueeq$input.amountcapture_readback
capture_currency_matchesThe currency of the captured amount equals the requested currency.$observed.capture_readback.amount.currency_codeeq$input.currency_codecapture_readback
capture_created_in_windowPayPal made the captured payment after the operation started.$observed.capture_readback.create_timetime_after$operation.created_atcapture_readback
capture_status_completedThe captured payment states the status COMPLETED. That is the only status that proves that the money moved.$observed.capture_readback.statuseqCOMPLETEDcapture_readback
capture_completed_eventAt least one PAYMENT.CAPTURE.COMPLETED event of this captured payment reached the workspace.$observed.capture_completed_events.countgte1capture_completed_events

Which conditions give CONTRADICTED?

ConditionClassReasonPathOperatorExpected
capture_on_wrong_orderwrong subjectThe captured payment belongs to a different order than the intent named.$observed.capture_readback.supplementary_data.related_ids.order_idne$input.order_id
capture_amount_mismatchwrong amountPayPal captured a different amount than the intent stated.$observed.capture_readback.amount.valuene$input.amount
capture_currency_mismatchwrong amountPayPal captured a different currency than the intent stated.$observed.capture_readback.amount.currency_codene$input.currency_code
capture_predates_operationpre existing stateThe captured payment is older than the operation. It proves nothing.$observed.capture_readback.create_timetime_before$operation.created_at
duplicate_capture_presentduplicate side effectPayPal completed more than one capture of the order. Do not retry.$observed.capture_completed_events.countgt1

Which observed states map to a verdict before completion?

RuleMatchVerdictReason
capture_declined$observed.capture_readback.status eq "DECLINED"FAILEDPayPal declined the capture. No money moved. Retry with the first request id.
capture_still_pending$observed.capture_readback.status eq "PENDING"PENDINGThe capture is pending. The money did not move. The runtime observes again.
capture_refunded_before_verification$observed.capture_readback.status in ["REFUNDED","PARTIALLY_REFUNDED"]CONTRADICTEDA refund reversed the capture before the verification. Ask a person.

How long does the runtime observe?

Timing memberValue
Initial delay2000 ms
Poll interval5000 ms
Backoffexponential factor 2, max 300000 ms
Maximum attempts900
Timeout259200000 ms
Stale read window20000 ms
On timeoutUNVERIFIABLE (evidence_unavailable_before_timeout), escalated to a person

Where do these rules come from?

  • paypal.payments.openapi#/components/schemas/capture_status/properties/status: paypal.payments.openapi, retrieved 2026-09-08
  • paypal.docs.captures#captured-payments/the-status-of-a-captured-payment: paypal.docs.captures, retrieved 2026-09-08
  • paypal.events#/events/PAYMENT.CAPTURE.COMPLETED: paypal.events, retrieved 2026-09-08
  • paypal.docs.captures#captured-payments/capture-a-payment: paypal.docs.captures, retrieved 2026-09-08
  • paypal.payments.openapi#/components/schemas/capture: paypal.payments.openapi, retrieved 2026-09-08
  • paypal.payments.openapi#/paths/~1v2~1payments~1captures~1{capture_id}/get/responses/200: paypal.payments.openapi, retrieved 2026-09-08
  • paypal.orders.openapi#/components/schemas/payment_collection/properties/captures: paypal.orders.openapi, retrieved 2026-09-08
  • paypal.payments.openapi#/components/schemas/related_ids/properties/order_id: paypal.payments.openapi, retrieved 2026-09-08
  • paypal.payments.openapi#/components/schemas/capture-2: paypal.payments.openapi, retrieved 2026-09-08
  • paypal.payments.openapi#/components/schemas/money/properties/value: paypal.payments.openapi, retrieved 2026-09-08
  • paypal.payments.openapi#/components/schemas/money/properties/currency_code: paypal.payments.openapi, retrieved 2026-09-08
  • paypal.payments.openapi#/components/schemas/activity_timestamps/properties/create_time: paypal.payments.openapi, retrieved 2026-09-08
  • paypal.docs.captures#captured-payments/events: paypal.docs.captures, retrieved 2026-09-08

Can paypal.capture.completed return VERIFIED from the action response alone?

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