Verify.et API
This portable skill applies to backend integrations in Node.js, Python, PHP, Go, Java, Ruby, .NET, Rust, and mobile apps that proxy through a trusted backend.
Core Workflow
- Identify the integration surface: backend REST adapter, checkout/payment verification, webhook receiver, polling/SSE status UI, dashboard/reporting usage, or framework-specific wrapper.
- Load only the references needed:
references/api-endpoints.mdfor auth, endpoints, payloads, responses, permissions, and status flow.references/bank-specs.mdfor explicit bank payloads and universal-router disambiguators.references/error-codes.mdfor HTTP failures, verification error codes, retry decisions, credits, quotas, and idempotency conflicts.patterns/integration-methods.mdfor choosing sync, queued, webhook, polling, or SSE flows.patterns/webhooks.mdfor receiver security, signatures, retries, payloads, and test-webhook debugging.debugging/common-mistakes.mdfor production anti-patterns.debugging/production-checklist.mdfor pre-launch validation.
- Inspect the user's code before changing it. Find where API keys are stored, where
POST /api/verifyis called, how202is handled, whether duplicate submissions are possible, and whether Verify.et calls run server-side. - Keep Verify.et API keys server-side. Browser and mobile clients should call the user's backend, not Verify.et directly.
- Prefer one small server-side Verify.et client/adapter over scattered raw
fetchcalls. - Send an
Idempotency-Keyfor payment and checkout attempts, and persist the returned Verify.etrequestId. - Treat
200as an inline terminal response and202as queued work. For202, storerequestId, then pollGET /api/verify/:requestId, open SSE for interactive UIs, or rely on webhooks for server-to-server fulfillment. - Treat
confirmationHistory.confirmedBefore === trueas a repeat-confirmation signal. Do not fulfill blindly without applying the product's duplicate-payment policy. - Add focused tests at the user's boundary: request builder tests, webhook signature tests, polling tests, idempotency conflict tests, and error mapping tests.
Integration Decisions
- Use
POST /api/verify?waitMs=...only as a best-effort convenience. Production workflows must still work when Verify.et returns202. - Use webhooks when the backend must learn the result even if the browser or mobile app closes.
- Use polling when the client needs a simple pending-status screen.
- Use SSE when an authenticated web UI needs lower-latency updates without frequent polling.
- Use both webhooks and polling/SSE for robust checkout UX: webhook updates server truth; polling/SSE updates the visible user flow.
- Use explicit
bankpayloads when the product already knows the provider. Use universalreferencepayloads when the UI accepts mixed receipts or links. - Put irreversible fulfillment behind terminal state checks and duplicate-confirmation policy checks.
Debugging Baseline
Before diagnosing, capture:
- Request method, URL, body shape, headers used, and whether the API key was server-side.
- HTTP status, response body,
x-request-id,Retry-After, andX-Verify-Cache. - Verify.et
requestId,processingStatus,status,error.code, anderror.retryable. - Bank/provider, raw receipt/reference, suffix/phone disambiguators, and webhook URL.
- Whether the same checkout attempt reused the same
Idempotency-Key.
Security Rules
- Do not place
x-api-keyvalues in frontend, mobile app, logs, screenshots, or committed files. - Do not trust webhook payloads before validating the signature when a signature is present.
- Verify webhook signatures against the raw body, not parsed JSON.
- Make webhook processing idempotent by
requestIdand/or delivery ID. - Honor
Retry-Afterfor rate limits and temporary unavailability. - Keep logs useful but redacted: include
requestId, bank, status, and error code; omit API keys, cookies, and full authorization headers.
Sources
Use the current public docs when internet access is available:
https://verify.et/docs/get-startedhttps://verify.et/docs/apihttps://verify.et/docs/sdk
If working inside the Verify.et repository, prefer implementation source over stale docs. Relevant source paths are listed in references/api-endpoints.md.