1. Transactions Status Notification
PayPaga V2 API
  • API Overview
    • Introduction
    • API Reference
    • Environments
    • Payment methods
    • Errors
    • Standard Codes and Values
    • Transaction Status Definitions and Lifecycle
    • Assets
    • Authorization
    • Changelog
      • Format
    • Transactions Status Notification
      • Transactions Status Notification
      • How to verify callback signature
      • Signing public keys
        GET
  • OAuth2 Service
    • authenticate
    • Schemas
      • AuthRequest
      • AuthResponse
      • AuthFailed
  • PayPaga Integration API
    • Transactions Configuration
      • List available pay-in configurations.
      • List available pay-out configurations.
    • Pay-in Transactions
      • Search pay-in transactions
      • Create a pay-in transaction.
      • Retrieve a pay-in transaction.
    • Development Utilities
      • Override a pay-in transaction status
      • Override a pay-out transaction status
    • Pay-out Transactions
      • Search pay-out transactions
      • Create a pay-out transaction.
      • Retrieve a pay-out transaction.
    • Pay URLs
      • Create a hosted PayURL checkout
    • Balances
      • Retrieve merchant balance summary.
    • Catalog
      • List supported countries
      • List supported payment methods
    • Settlements
      • Search settlements
      • Retrieve settlement transactions
      • Retrieve settlement options
    • Reference Data
      • Retrieve exchange rates
      • Retrieve tax rates
    • Notifications
      • List notification subscriptions
      • Create a notification subscription
      • Retrieve a notification subscription
      • Delete a notification subscription
    • Schemas
      • MoneyAmount
      • Currency
      • Country
      • PayOutTransaction
      • CreatePayURLRequest
      • PredefinedFields
      • PayOutTransactionStatusOverrideRequest
      • CreatePayOutResponse
      • ReturnUrls
      • CreatePayOutRequest
      • TaxRate
      • PaymentInstructions
      • PayInTransactionStatusOverrideRequest
      • CreatePayInRequest
      • CreatePayInResponse
      • CreatePayURLResponse
      • BalanceTotal
      • BalanceCountry
      • BalanceSummaryResponse
      • TransactionCallbackPayload
      • PaymentMethodCatalogEntry
      • Settlement
      • NotificationSubscriptionRequest
      • SettlementWindow
      • SettlementOptionsResponse
      • SettlementTransaction
      • ListNotificationSubscriptionsResponse
      • NotificationSubscriptionResponse
      • ExchangeRatesResponse
      • PayInTransaction
      • ValidationErrorDetail
      • ValidationErrorItem
      • PaymentOption
      • PaymentMethod
      • OptionField
      • Product
      • PayInTransactionStatus
      • PayOutTransactionStatus
      • NotificationType
      • PaginationMeta
      • MerchantOrderReference
      • MerchantTransactionReference
      • FeeMode
      • Code
      • Message
      • ErrorDetail
      • PayInTransactionListResponse
      • Money
      • PayOutTransactionListResponse
      • CountryCatalogEntry
      • SettlementsResponse
      • SettlementTransactionsResponse
      • ExchangeRateQuote
      • ChannelType
  • Examples
    • Pay In Examples
      • Argentina
        • Argentina Instant Transfer
      • Bolivia
        • Bolivia Qr Interoperable
      • Brazil
        • Brazil PIX
      • Chile
        • Chile Bank Transfer
        • Chile Khipu
      • Colombia
        • Colombia Dale
        • Colombia Daviplata
        • Colombia Efecty
        • Colombia Gana
        • Colombia Movii
        • Colombia Nequi
        • Colombia PSE
        • Colombia RappiPay
        • Colombia ReFacil
        • Colombia Susuerte
        • Colombia Western Union
      • Ecuador
        • Ecuador Banco Guayaquil
        • Ecuador Bank Transfer
        • Ecuador Bemovil
        • Ecuador Deuna
        • Ecuador Mi Negocio Efectivo
        • Ecuador Omniswitch
        • Ecuador RapiActivo
        • Ecuador Western Union
      • Guatemala
        • Guatemala Akisi Pronet
        • Guatemala BAM Efectivo
        • Guatemala BAM Transferencia
        • Guatemala Banco Industrial
      • Honduras
        • Honduras Cash Voucher
        • Honduras Digital Voucher
      • Mexico
        • Mexico Pay With Cash
        • Mexico SPEI
      • Peru
        • Peru BBVA
        • Peru BCP
        • Peru BCP Efectivo
        • Peru Cell Power
        • Peru KasNet
        • Peru Plin
        • Peru QR Interoperable
        • Peru Yape
    • Pay Out Examples
      • Argentina
        • Argentina Instant Transfer
      • Bolivia
        • Bolivia Bank Transfer
      • Brazil
        • Brazil PIX
      • Chile
        • Chile Bank Transfer
      • Colombia
        • Colombia Bank Transfer
      • Ecuador
        • Ecuador Bank Transfer
      • Guatemala
        • Guatemala Bank Transfer
      • Mexico
        • Mexico SPEI
      • Peru
        • Peru Bank Transfer
    • Schemas
      • Pay In
        • Country
        • Currency
        • PaymentMethod
        • MerchantOrderReference
        • MerchantTransactionReference
        • ReturnUrls
        • CreatePayInRequest
        • PaymentInstructions
        • CreatePayInResponse
      • Country
      • Code
      • CreatePayInRequest
      • Currency
      • CreatePayInResponse
      • CreatePayOutRequest
      • CreatePayOutResponse
      • MerchantTransactionReference
      • MerchantOrderReference
      • ErrorDetail
      • PaymentInstructions
      • PaymentMethod
      • ReturnUrls
      • Message
      • ValidationErrorDetail
      • ValidationErrorItem
  1. Transactions Status Notification

How to verify callback signature

All callback requests sent by our system are cryptographically signed using RSA-SHA256. This allows you to verify that each callback was sent by us and has not been tampered with in transit.

Algorithm#

PropertyValue
AlgorithmRSA-SHA256
Signature EncodingBase64

Headers#

Every callback request includes the following signature headers:
HeaderDescriptionExample
X-Signature-TimestampUnix timestamp (10 digits, seconds since epoch)1713982800
X-SignatureBase64-encoded RSA signature of the signed payloaddGhpcyBpcyBhbiBleGFtcGxlIHNpZ25hdHVyZSE...
X-Signed-ByPublic key identifier (used to fetch the correct certificate from /certificates)5ac5ae43-01d2-4c70-8a5b-b69a34d11c62

Signed Payload Construction#

To verify the signature, you must reconstruct the exact signed payload that was used during signing:
signed_payload = timestamp + "." + raw_body_bytes
Where:
timestamp is the value from X-Signature-Timestamp header (as a string)
. is a literal period character (ASCII 46)
raw_body_bytes is the raw, unmodified HTTP request body (as bytes, not parsed JSON)

Example#

Given:
X-Signature-Timestamp: 1785430667
Body: { "approved_on": "2026-07-30T14:53:34.964208905Z", "country": "SV", "created_on": "2026-07-30T14:53:27.210213Z", "currency": "USD", "fee": 0, "merchant_transaction_reference": "34ac9a13-b435-41f4-9d71-0db142b712c6", "payment_method": "cuscatlan", "status": "approved", "tax": 0, "transaction_amount": 1000, "transaction_id": "20260730-1453-4015-a22f-b18176861ca3", "transaction_type": "pay_in" }
The signed payload is:
1785430667.{ "approved_on": "2026-07-30T14:53:34.964208905Z", "country": "SV", "created_on": "2026-07-30T14:53:27.210213Z", "currency": "USD", "fee": 0, "merchant_transaction_reference": "34ac9a13-b435-41f4-9d71-0db142b712c6", "payment_method": "cuscatlan", "status": "approved", "tax": 0, "transaction_amount": 1000, "transaction_id": "20260730-1453-4015-a22f-b18176861ca3", "transaction_type": "pay_in" }
Important: Do not parse, format, or modify the JSON body before verification. Use the raw bytes exactly as received.

Verification Steps#

1.
Extract X-Signature-Timestamp, X-Signature, and X-Signed-By from the request headers
2.
Verify the timestamp is within your tolerance window (recommended: 300 seconds / 5 minutes)
3.
Fetch the public keys from Signing public keys and choose the correct one based on X-Signed-By header value (please refer Public Key Caching section).
4.
Reconstruct the signed payload: timestamp + "." + raw_body
5.
Compute SHA-256 hash of the signed payload
6.
Base64-decode the X-Signature header
7.
Verify the RSA signature using the public key

Public Key Caching#

We recommend caching the certificates response locally to avoid fetching it on every callback notification, we rotate the certificates every month, but we preserve the previous one to ensure all signatures can be verified.
You could use the expires_at field of the latest certificate as TTL.

Implementation Note#

Since only 2 certificates exist at any time, storing the full response is the recommended approach.

Code Examples#

Go#


JavaScript (Node.js)#


C##


Java#


Python#


PHP#


Important Notes#

Always verify before parsing. Do not parse the JSON body until the signature has been verified.
Use raw bytes. Do not convert the body to string, format, or re-serialize the JSON before verification.
Timestamp tolerance. We recommend rejecting callbacks with timestamps older than 5 minutes (300 seconds) to prevent replay attacks.
Key rotation. When we rotate signing keys (every month), a new X-Signed-By identifier will be used.
Modified at 2026-09-08 09:45:37
Previous
Transactions Status Notification
Next
Signing public keys
Built with