/v1 runtime supports, the ones it does not, and how the evidence is kept apart so that one kind of proof is never mistaken for another.
Certification status
Do not treat a sandbox as certified until the deployed run is recorded on your connection. A passing local run proves the code, not a deployment, a provider account or a Client’s decision.
Capabilities
Supported forcredit_union.v1 and property_management.v1, with the same shared /v1 core:
- Customer and Receivable intake, one record per request or as bounded asynchronous batches.
- Transaction and snapshot-only feed modes. Snapshot-only connections send ordered balance snapshots; their event balance writes (payments, refunds, reversals, credit notes, adjustments and write-offs) return
409 financial_operation_required. - Payments with partial allocation, refunds and reversals, and non-cash corrections.
- Complete books, source freshness and explicit recovery instructions.
- Hosted payment requests up to the payment link, which the payer opens; PayPathIQ never takes card data.
- Payment reconciliation against accounting receipt lines, and partner-owned delivery records.
- Collection summaries, the change feed and signed webhooks.
- PayPathIQ-owned receipt delivery. Every route is disabled and
PUT .../receipt-deliveryreturns409 receipt_delivery_route_unsupportedbecause no Blockman receipt-posting endpoint, no Blockman transaction CSV format and no Xero write contract is verified. Keep the connection’s receipt delivery owner aspartner. With the owner set topaypathiq, partner delivery and reconciliation operations return409 receipt_delivery_owner_mismatch. - Confirming a payment from the API. Only a verified provider event confirms a hosted payment.
- Production ingestion, recovery or payment-provider activation as part of certification.
The worked synthetic journey
The loan and the service-charge journey are identical except for the Receivable type: a loan sendsfinancialType: "loan_balance" with a creditUnion object, a service charge sends financialType: "service_charge_demand" with a propertyManagement object. Each run uses its own identifiers, so it can be repeated.
- Read the contract, then confirm that a missing key and an unknown key return
401 invalid_api_keyand that another Client’s code returns403 client_scope_denied. Take a change-feed cursor withfrom=latest. - Create a Customer with a Contact, replay it (
200), patch it withapplication/merge-patch+json, and confirm that another media type returns415. - Create two Receivables (EUR 1,000.00 and EUR 400.00). Replaying the identical request returns
200; a different balance at the same revision returns409; a descriptive patch needs a newersourceRevision. - Authorize recovery for the first Receivable with a revision 1 instruction. The response reports
recoveryHeld: truewhile the connection is not activated for collection. Withdraw it with revision 2. - In transaction mode, record a EUR 300.00 payment allocating EUR 250.00 (EUR 50.00 stays unapplied), a partial refund, a full reversal and the three non-cash corrections, checking each resulting balance. An allocation above the balance returns
409 allocation_exceeds_balance; a refund above what the payment allocated returns409 payment_observation_conflict. In snapshot-only mode the same event writes return409 financial_operation_requiredand a newer ordered snapshot sets the balance instead. - Submit an ordered balance snapshot, replay it, and confirm a position that is not higher returns
409 source_position_conflict. - Create a hosted payment request for the second Receivable’s exact balance. A changed body returns
409 payment_request_conflictand a stale amount409 payment_request_stale. The response carries the payment link; a later read returnspaymentUrl: null. - After a verified provider event confirms the payment, acknowledge it with two payment reconciliations (a partial receipt line, then the remainder). Read the delivery and see
accountingAcceptance: "acknowledged"; a delivery attempt on its own never changes it. - Submit a batch of a Customer and a Receivable, wait for
succeeded, and replay it. Submit a batch with a missing dependency and seefailedanddependency_failedper record, then resubmit the corrected records under a new batch. - Declare a complete book from the two successful batches. A wrong
expectedReceivableCountreturns409 book_completion_unverified. Receivables outside the book are held asmissing_from_complete_book, never deleted or settled, and the collection summary shows it. - Configure a webhook endpoint, read the change feed from the cursor of step 1 page by page, resume from the same cursor and see the same events, and verify each webhook signature with the one-time signing secret.
Run the harness
The harness ispnpm certify:inbound-api in apps/paypathiq. It sends only synthetic records, paces itself under the 60 requests per minute limit, refuses production hosts, and writes a redacted summary with no keys, secrets or payload bodies. Use --dry-run to check the contract digest without sending anything. Your own integration tests can follow the steps above with the OpenAPI document and the examples it carries; every example is validated against the strict schemas in PayPathIQ’s own tests.