Provider Coverage
ReplaySafe verifies UNKNOWN side effects by querying provider APIs directly. Each provider verifier classifies failures as either TRANSIENT (safe to retry) or SEMANTIC (needs human review).
Built-in Providers
Stripe
Payments
Verify Method
GET /v1/charges/:idTRANSIENT (safe to retry)
SEMANTIC (needs review)
SendGrid
Verify Method
GET /v3/messages/:idTRANSIENT (safe to retry)
SEMANTIC (needs review)
Postmark
Verify Method
GET /messages/outbound/:id/detailsTRANSIENT (safe to retry)
SEMANTIC (needs review)
AWS SES
Verify Method
Check receipt.status fieldTRANSIENT (safe to retry)
SEMANTIC (needs review)
GitHub
Dev Tools
Verify Method
GET /repos/:owner/:repo/issues/:idTRANSIENT (safe to retry)
SEMANTIC (needs review)
Slack
Messaging
Verify Method
GET /conversations.infoTRANSIENT (safe to retry)
SEMANTIC (needs review)
Twilio
SMS / Voice
Verify Method
GET /2010-04-01/Accounts/:sid/Messages/:sid.jsonTRANSIENT (safe to retry)
SEMANTIC (needs review)
AWS S3
Storage
Verify Method
HEAD /:bucket/:keyTRANSIENT (safe to retry)
SEMANTIC (needs review)
Failure Classification
Every provider verifier classifies failures into two categories. This classification drives the Recovery Engine's decisions.
TRANSIENT
Temporary failures that are safe to retry automatically. The operation may or may not have succeeded.
SEMANTIC
The operation completed but returned a wrong or stale result. Retrying blindly will produce the same outcome.
Custom Verifiers
Need to verify against a provider not listed above? Register a custom verifier.
import { verifierRegistry } from '@replaysafe/guard-sdk'
class MyCustomVerifier {
provider = 'my-provider'
async verify(entry) {
const response = await fetch(`https://api.my-provider.com/status/${entry.receipt.id}`)
const data = await response.json()
if (data.status === 'delivered') {
return { status: 'VERIFIED' }
}
if (data.status === 'bounced') {
return { status: 'FAILED', failureType: 'SEMANTIC' }
}
return { status: 'UNKNOWN' }
}
}
verifierRegistry.register(new MyCustomVerifier())Adding New Providers
To add a new built-in provider verifier, implement the Verifier interface and register it in the VerificationService. See the existing verifiers in apps/api/src/services/verifiers/ for reference.