Prysym (1.0)

Introduction

The Prysym APIs are designed to enable clients to make and receive payments globally by quickly and easily integrating into their native systems without knowing how arcane payment systems work globally or even having many details about the recipient. We’ve integrated a combination of more common methods, new services as well novel techniques pioneered by the company representing the most diverse and ever expanding final-mile payment options possible. This enables the client to make an instant payment to anyone, anywhere and enables the recipient to decide the best way to access their money. (The above is subject to sanctions and regulated entity approvals).

Authenticate

To make API calls, include the bearer token in the Authorization header with the Bearer authentication scheme.

The value is Bearer <Your-Secret-Key>.

The URL to the API service is either:

Errors

APIs use the Status-Line part of an HTTP response message to inform clients of their request’s overarching result.

HTTP defines over 40 standard status codes that can be used to convey the results of a client’s request. The status codes are divided into the five categories presented here:

  • 1xx: Informational - Communicates transfer protocol-level information
  • 2xx: Success - Indicates that the client’s request was accepted successfully.
  • 3xx: Redirection - Indicates that the client must take some additional action in order to complete their request.
  • 4xx: Client Error - This category of error status codes points the finger at clients.
  • 5xx: Server Error - The server takes responsibility for these error status codes.
Error Code Error Description
UNAUTHORIZED Missing or invalid API Key provided.
INVALID_REQUEST The request provided is invalid. Please check details field for more details.

Authentication

bearerAuth

Prysym-issued secret API key, sent as Authorization: Bearer <secret-key>.

Security Scheme Type HTTP
HTTP Authorization Scheme bearer

Payment Instruments

Payment Instruments

Create payment instrument

This optional API endpoint securely saves customer card details and returns a unique identifier (token) that can be used for subsequent transaction processing

Authorizations:
Request Body schema: application/json
One of
  • CardPaymentInstrumentRequest
  • CheckPaymentInstrumentRequest
type
required
string
Value: "CARD"
holder_name
required
string

Cardholder's full name.

number
required
string [ 13 .. 19 ] characters

Card number

expiration
required
object

Card expiration. For card payment instruments, year and month are required.

reference
string <= 70 characters

Merchant reference for the transaction

association_name
string
Enum: "Amex" "Diners" "Discover" "JCB" "MasterCard" "Visa"

Association name

billing
required
object

Billing information. For card payment instruments, address.line1 and address.postal_code are required.

Responses

200

OK

post /v1/payment_instruments/create
https://api.prysym.com/v1/payment_instruments/create
https://api.uat.prysym.com/v1/payment_instruments/create

Request samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "type": "CARD",
  • "holder_name": "John Doe",
  • "number": "4111111111111111",
  • "expiration":
    {
    },
  • "reference": "EXT-REF-0001",
  • "association_name": "Amex",
  • "billing":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS",
  • "data":
    {
    }
}

Update payment instrument

This optional API endpoint securely update customer card details and returns a unique identifier (token) that can be used for subsequent transaction processing

Authorizations:
Request Body schema: application/json
One of
  • PaymentInstrumentUpdateRequest
id
required
string <uuid>

Id

holder_name
string

Cardholder's full name.

number
string [ 13 .. 19 ] characters

Card number

expiration
object

Card expiration

billing
object

Billing information

reference
string <= 70 characters

Merchant reference for the transaction

association_name
string
Enum: "Amex" "Diners" "Discover" "JCB" "MasterCard" "Visa"

Association name

check_name
string

Check name

check_aba
string

Check aba

check_account
string

Check account

account_holder_type
string
Enum: "business" "personal"
account_type
string
Enum: "checking" "savings"
sec_code
string
Enum: "PPD" "WEB" "TEL" "CCD"

Responses

200

OK

post /v1/payment_instruments/update
https://api.prysym.com/v1/payment_instruments/update
https://api.uat.prysym.com/v1/payment_instruments/update

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "00000000-0000-0000-0000-000000000001",
  • "holder_name": "John Doe",
  • "number": "4111111111111111",
  • "expiration":
    {
    },
  • "billing":
    {
    },
  • "reference": "EXT-REF-0001",
  • "association_name": "Amex",
  • "check_name": "John Doe",
  • "check_aba": "021000021",
  • "check_account": "123456789",
  • "account_holder_type": "business",
  • "account_type": "checking",
  • "sec_code": "PPD"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS",
  • "data":
    {
    }
}

Retrieve payment instrument

This API endpoint retrieves the details of previously saved card information associated with a unique identifier (token).

Authorizations:
Request Body schema: application/json
id
required
string

ID of the object

Responses

200

OK

post /v1/payment_instruments/get
https://api.prysym.com/v1/payment_instruments/get
https://api.uat.prysym.com/v1/payment_instruments/get

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "00000000-0000-0000-0000-000000000001"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS",
  • "data":
    {
    }
}

Acquiring

Prysym's Acquiring functionality

Process transaction

This API endpoint processes both Authorization and Purchase. Purchase - a transaction that is used to authorize and capture the amount in one transaction. Authorization – a transaction that is used to transmit an authorization request where it is not captured for settlement processing. A subsequent Capture transaction is then submitted to be captured for settlement processing.

Authorizations:
Request Body schema: application/json
One of
  • CardRequest
  • ACHRequest
program_id
required
string <uuid>

Program ID provided by Prysym

merchant_id
required
string <uuid>

Merchant ID

terminal_id
string <uuid>

Terminal ID

type
required
string
Enum: "AUTHORIZATION" "PURCHASE" "VERIFICATION"

Type of transaction

currency_code
string
Default: "USD"

ISO 4217 currency code. Defaults to USD if omitted.

amount
required
number <double>

Transaction amount

pos_cond_code
string
Default: "59"
Enum: "00" "01" "02" "03" "04" "05" "06" "08" "59" "71"

POS Condition Code. Defaults to 59 (E-commerce) if omitted.

reference
string [ 1 .. 70 ] characters

Merchant reference for the transaction

card_holder_ip
string

Card holder ip

stored_payment_instrument
object

Either stored_payment_instrument or payment_instrument details are required

payment_instrument
object

Either stored_payment_instrument or payment_instrument details are required

Responses

200

OK

post /v1/acquiring/process
https://api.prysym.com/v1/acquiring/process
https://api.uat.prysym.com/v1/acquiring/process

Request samples

Content type
application/json
Example
Copy
Expand all Collapse all
{
  • "program_id": "00000000-0000-0000-0000-000000000100",
  • "merchant_id": "00000000-0000-0000-0000-000000000200",
  • "terminal_id": "00000000-0000-0000-0000-000000000300",
  • "type": "AUTHORIZATION",
  • "currency_code": "USD",
  • "amount": "12.00",
  • "pos_cond_code": "00",
  • "reference": "EXT-REF-0001",
  • "card_holder_ip": "203.0.113.10",
  • "stored_payment_instrument":
    {
    },
  • "payment_instrument":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS",
  • "data":
    {
    }
}

Incremental Authorization

Incremental Authorization – a transaction that is used to increase the amount of a previously approved Authorization.

Authorizations:
Request Body schema: application/json
originaltransaction_id
required
string <uuid>

ID of the original transaction

amount
required
number <double>

Amount by which to increase the authorization

reference
string <= 70 characters

Merchant reference for the transaction

card_holder_ip
string <= 40 characters

Card holder ip

Responses

200

OK

post /v1/acquiring/authorizations/increment
https://api.prysym.com/v1/acquiring/authorizations/increment
https://api.uat.prysym.com/v1/acquiring/authorizations/increment

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "originaltransaction_id": "00000000-0000-0000-0000-000000000002",
  • "amount": "12.00",
  • "reference": "EXT-REF-0001",
  • "card_holder_ip": "203.0.113.10"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS",
  • "data":
    {
    }
}

Authorization partial reversal

Partial Reversal – a transaction that is used to partially reverse a previously approved Authorization.

Authorizations:
Request Body schema: application/json
originaltransaction_id
required
string <uuid>

ID of the original transaction

amount
required
number <double>

Amount to hold or release, depending on reversal_type

reversal_type
string
Default: "AMOUNT_TO_HOLD"
Enum: "AMOUNT_TO_HOLD" "AMOUNT_TO_RELEASE"

Indicates whether the amount represents the amount to hold or the amount to release

reference
string <= 70 characters

Merchant reference for the transaction

card_holder_ip
string <= 40 characters

Card holder ip

Responses

200

OK

post /v1/acquiring/authorizations/partial-reverse
https://api.prysym.com/v1/acquiring/authorizations/partial-reverse
https://api.uat.prysym.com/v1/acquiring/authorizations/partial-reverse

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "originaltransaction_id": "00000000-0000-0000-0000-000000000002",
  • "amount": "12.00",
  • "reversal_type": "AMOUNT_TO_HOLD",
  • "reference": "EXT-REF-0001",
  • "card_holder_ip": "203.0.113.10"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS",
  • "data":
    {
    }
}

Capture transaction

Capture – a transaction that is used to submit for settlement a previously approved Authorization.

Authorizations:
Request Body schema: application/json
originaltransaction_id
required
string <uuid>

ID of the original transaction

type
required
string
Value: "CAPTURE"
amount
number <double>

Amount to capture. If omitted, the full authorized amount is captured.

reference
string <= 70 characters

Merchant reference for the transaction

card_holder_ip
string <= 40 characters

Card holder ip

Responses

200

OK

post /v1/acquiring/capture
https://api.prysym.com/v1/acquiring/capture
https://api.uat.prysym.com/v1/acquiring/capture

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "originaltransaction_id": "00000000-0000-0000-0000-000000000002",
  • "type": "CAPTURE",
  • "amount": "12.00",
  • "reference": "EXT-REF-0001",
  • "card_holder_ip": "203.0.113.10"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS",
  • "data":
    {
    }
}

Refund transaction

Refund – a transaction that is used to credit funds to the account holder.

Authorizations:
Request Body schema: application/json
originaltransaction_id
required
string

ID of the original transaction

type
required
string
Value: "REFUND"
amount
number <double>

Amount to refund. If omitted, the full transaction amount is refunded.

reference
string <= 70 characters

Merchant reference for the transaction

card_holder_ip
string <= 40 characters

Card holder ip

Responses

200

OK

post /v1/acquiring/refund
https://api.prysym.com/v1/acquiring/refund
https://api.uat.prysym.com/v1/acquiring/refund

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "originaltransaction_id": "00000000-0000-0000-0000-000000000002",
  • "type": "REFUND",
  • "amount": "12.00",
  • "reference": "EXT-REF-0001",
  • "card_holder_ip": "203.0.113.10"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS",
  • "data":
    {
    }
}

Void transaction

Void cancels a transaction that has not yet settled. A transaction can be voided while its status is APPROVED, PENDING, or COMPLETED.

Authorizations:
Request Body schema: application/json
originaltransaction_id
required
string

ID of the original transaction

type
required
string
Value: "VOID"
reference
string <= 70 characters

Merchant reference for the transaction

Responses

200

OK

post /v1/acquiring/void
https://api.prysym.com/v1/acquiring/void
https://api.uat.prysym.com/v1/acquiring/void

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "originaltransaction_id": "00000000-0000-0000-0000-000000000002",
  • "type": "VOID",
  • "reference": "EXT-REF-0001"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS",
  • "data":
    {
    }
}

Response codes

List the status codes and status Code Description

Authorizations:
Request Body schema: application/json
program_id
required
string <uuid>

Program ID provided by Prysym

codes
Array of strings

List of codes

Responses

200

OK

post /v1/acquiring/response-codes
https://api.prysym.com/v1/acquiring/response-codes
https://api.uat.prysym.com/v1/acquiring/response-codes

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "program_id": "00000000-0000-0000-0000-000000000100",
  • "codes":
    [
    ]
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS",
  • "data":
    [
    ]
}

Last call

Response of last api call

Authorizations:
Request Body schema: application/json
program_id
required
string <uuid>

Program ID provided by Prysym

reference
required
string <= 70 characters

Merchant reference for the transaction

Responses

200

OK

post /v1/acquiring/last-call
https://api.prysym.com/v1/acquiring/last-call
https://api.uat.prysym.com/v1/acquiring/last-call

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "program_id": "00000000-0000-0000-0000-000000000100",
  • "reference": "EXT-REF-0001"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS",
  • "data":
    [
    ]
}

Transactions

Prysym's Transactions functionality allows you to manage transactions.

Retrieve transaction

This API endpoint allows to retrieve transaction details using a unique transaction identifier (ID)

Authorizations:
Request Body schema: application/json
id
required
string

ID of the object

Responses

200

OK

post /v2/transactions/get
https://api.prysym.com/v2/transactions/get
https://api.uat.prysym.com/v2/transactions/get

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "00000000-0000-0000-0000-000000000001"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "id": "00000000-0000-0000-0000-000000000001",
  • "payment_instrument_id": "00000000-0000-0000-0000-000000000400",
  • "merchant_id": "00000000-0000-0000-0000-000000000200",
  • "program_id": "00000000-0000-0000-0000-000000000100",
  • "amount": "12.00",
  • "currency_code": "USD",
  • "status": "COMPLETED",
  • "created_at": "2024-01-15T10:30:00",
  • "terminal_id": "00000000-0000-0000-0000-000000000300",
  • "reference": "EXT-REF-0001",
  • "type": "PURCHASE",
  • "originaltransaction_id": "00000000-0000-0000-0000-000000000002",
  • "status_code": "000",
  • "status_desc": "Approved",
  • "bank_net_data": "BankNetData",
  • "auth_id": "ABC123",
  • "ccv_result_code": "M",
  • "avs_response": "Y",
  • "response_group":
    {
    },
  • "refunded_amount": "0.00"
}

List transactions

This API endpoint retrieves a list of transactions associated with a specified merchant, allowing for various filters to be applied

Authorizations:
Request Body schema: application/json
offset
number <integer>
Default: 0

The number of records to skip before starting to return results

limit
number <integer>
Default: 20

The maximum number of records to return in the response

filters
required
object

Filters query results based on specified key-value pairs

sort
object

Define the sorting order of results by specifying a column and direction

Responses

200

OK

post /v1/transactions/list
https://api.prysym.com/v1/transactions/list
https://api.uat.prysym.com/v1/transactions/list

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "offset": 0,
  • "limit": 20,
  • "filters":
    {
    },
  • "sort":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "data":
    [
    ],
  • "paging":
    {
    }
}

Webhooks

Overview

Prysym sends webhooks to notify your systems of events as they happen — card transactions, settlements, chargebacks and merchant onboarding updates. Each event is delivered as an HTTP POST with a JSON body to the URL registered on your subscription. The destination must be an https URL on a publicly resolvable host; plain http, private ranges and loopback addresses are rejected when the subscription is created or updated.

Delivery is at-least-once: the same event may arrive more than once, so treat event_id as an idempotency key. Respond with any 2xx status to acknowledge receipt. A timeout, a 5xx, a 408 or a 429 is retried; any other 4xx is treated as a permanent rejection and the delivery is dead-lettered without a second attempt. The event id is also sent in a Webhook-Id header, so you can discard a redelivery without parsing the body.

Event Envelope
Field
Description
event_id
A unique identifier for this event. Use it to de-duplicate redelivered events.
event_type
The category of event that occurred.
event_body
The event payload; its shape depends on event_type.
Available Event Types
Event Type
Description
ACQUIRING
Card transaction activity: authorizations, sales, captures, refunds and voids.
SETTLEMENT
Daily settlement batch outcomes.
CHARGEBACK
Daily chargeback batch outcomes.
ONBOARDING
Merchant onboarding status changes.
How to Setup

Create a subscription with the Create Webhook Subscription endpoint, supplying the destination url, a secret_key used to sign deliveries, and optionally the event_types you want (omit to receive all). Events begin flowing immediately; no further setup is required.

Signature Verification

Every delivery is signed so you can confirm it came from Prysym and was not altered in transit. The signature is sent in the x-webhook-signature header and is computed with HMAC-SHA256 over the timestamp and the raw request body, keyed with your subscription secret.

Header Format
x-webhook-signature: t={unix_timestamp},v1={base64_signature}

The value that is signed is "{t}.{raw_body}". The leading timestamp binds the signature to a point in time so you can reject stale or replayed requests. During a secret rotation the header carries more than one v1= signature (one per active secret); accept the delivery if any of them matches.

How to Validate
1. Read the x-webhook-signature header from the request.
2. Parse the timestamp (t) and one or more signatures (v1).
3. Reject the request if t is outside your tolerance window (for example, 5 minutes).
4. Recompute HMAC-SHA256 over "{t}.{raw_body}" with your secret and compare it, in constant time, against each v1 value. Accept the delivery if any signature matches.
Computing the Signature

Step 4 is the only part that has to be exact, so it is the only part shown here. Each snippet takes four values and produces the same Base64 signature; how you parse the header, apply your tolerance window and reject a bad delivery is up to you.

Input
Value
timestamp
the t value from the header
signature
one v1 value from the header
rawBody
the request body exactly as received, as bytes
secret
the subscription secret you registered
const crypto = require('crypto'); const expected = crypto.createHmac('sha256', secret) .update(timestamp + '.') .update(rawBody) .digest('base64'); const matches = signature.length === expected.length && crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
import base64, hashlib, hmac signed = timestamp.encode() + b"." + raw_body digest = hmac.new(secret.encode(), signed, hashlib.sha256).digest() expected = base64.b64encode(digest).decode() matches = hmac.compare_digest(signature, expected)
$signed = $timestamp . '.' . $rawBody; $expected = base64_encode(hash_hmac('sha256', $signed, $secret, true)); $matches = hash_equals($expected, $signature);
Mac mac = Mac.getInstance("HmacSHA256"); mac.init(new SecretKeySpec(secret.getBytes(UTF_8), "HmacSHA256")); mac.update((timestamp + ".").getBytes(UTF_8)); String expected = Base64.getEncoder().encodeToString(mac.doFinal(rawBody)); boolean matches = MessageDigest.isEqual(signature.getBytes(UTF_8), expected.getBytes(UTF_8));
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret)); var signed = Encoding.UTF8.GetBytes(timestamp + ".").Concat(rawBody).ToArray(); var expected = Convert.ToBase64String(hmac.ComputeHash(signed)); var matches = CryptographicOperations.FixedTimeEquals( Encoding.UTF8.GetBytes(signature), Encoding.UTF8.GetBytes(expected));
mac := hmac.New(sha256.New, []byte(secret)) mac.Write([]byte(timestamp + ".")) mac.Write(rawBody) expected := base64.StdEncoding.EncodeToString(mac.Sum(nil)) matches := hmac.Equal([]byte(signature), []byte(expected))
Whatever the language: join the timestamp, a dot and the raw body; HMAC-SHA256 that with your secret; Base64-encode the result; compare it to each v1= value in constant time.
What Usually Goes Wrong
Pitfall
What to do instead
Signing the parsed body
Most frameworks parse JSON before your handler runs, and re-serialising changes bytes (key order, spacing, unicode escapes). Keep the raw body and verify before parsing.
Comparing with ==
Use the constant-time comparison shown above, so that how long the check takes cannot reveal the expected signature.
Stopping at the first v1
A rotation window sends more than one. Accept the delivery if any of them matches.
Trusting an old timestamp
A valid signature stays valid forever. Reject anything outside your tolerance window so a captured delivery cannot be replayed.

Secret Rotation

To change a subscription's secret without missing deliveries, call Rotate Secret with the new value. Prysym then signs each delivery with both the old and new secrets (two v1= signatures), so consumers on either side of your deployment can verify. Once every consumer has the new secret, call Complete Rotation to drop the old one.

Delivery and Retries

A retryable failure (a timeout, a 5xx, a 408 or a 429) is retried automatically with exponential backoff and jitter: up to 12 attempts, starting at 30 seconds and doubling to a 6 hour ceiling, each delay varied by up to 20%. Any other 4xx is permanent and is dead-lettered on the first attempt, because a rejected payload will be rejected again. After the maximum number of attempts the delivery is moved to a dead-letter state and is no longer retried automatically. Pausing a subscription (active false) stops new events being queued for it, but deliveries already queued are still attempted; deleting the subscription stops those too.

Delivery Lifecycle
Status
Description
PENDING
Awaiting its first delivery attempt.
RETRYING
A previous attempt failed retryably; scheduled for a future attempt.
DELIVERED
A 2xx response was received. Terminal.
DEAD
Permanent failure, or the retry budget was exhausted. Terminal (dead-letter).

Inspect deliveries — including the dead-letter queue — with the List Deliveries endpoint, filtering on status (for example, ["DEAD"]). Re-queue an individual delivery with Retry Delivery. Delivered records are kept for 365 days and then purged; dead-lettered ones are kept until you act on them.

Event Samples

Each sample below is the full delivered body: the envelope wrapping a type-specific event_body.

Acquiring
{ "event_id": "00000000-0000-0000-0000-000000000500", "event_type": "ACQUIRING", "event_body": { "id": "00000000-0000-0000-0000-000000001001", "program_id": "00000000-0000-0000-0000-000000000100", "merchant_id": "00000000-0000-0000-0000-000000001002", "terminal_id": "00000001", "currency_code": "USD", "amount": 42.00, "type": "PURCHASE", "status": "APPROVED", "reference": "EXT-REF-ID1", "payment_instrument_id": "00000000-0000-0000-0000-000000001001", "originaltransaction_id": null, "auth_id": "ABC123", "fd_merchant_id": "RCTST1000084652", "created_at": "2024-11-06T11:51:15Z", "status_code": "000", "status_desc": "Approve", "merchant_category_code": "5965", "card_brand": "VISA", "customer_info": { "postal_code": "11747", "billing_address": "1307 Broad Hollow Road" }, "issuing_system_data": { "card_brand": "VISA" } } }
Settlement
{ "event_id": "00000000-0000-0000-0000-000000000500", "event_type": "SETTLEMENT", "event_body": { "id": "8835b670-a1a6-4b3d-9003-fa5b6692bbe3", "merchant_id": "00000000-0000-0000-0000-000000001002", "currency_code": "USD", "amount": 100.00, "type": "PURCHASE", "status": "SETTLED", "reference": "EXT-REF-ID1", "sttlm_date": "2025-01-01T01:01:00" } }
Chargeback
{ "event_id": "00000000-0000-0000-0000-000000000500", "event_type": "CHARGEBACK", "event_body": { "id": "00000000-0000-0000-0000-000000002001", "card_type": "VISA", "card_number": "************1234", "authorization_code": "ABC123", "adjustment_date": "2025-01-03", "transaction_date": "2024-12-28", "due_date": "2025-01-17", "dispute_amount": 42.00, "chargeback_currency_code": "USD", "current_status": "OPEN", "invoice_number": "INV-000123", "merchant_id": "00000000-0000-0000-0000-000000001002", "fd_merchant_id": "RCTST1000084652" } }
Onboarding
{ "event_id": "00000000-0000-0000-0000-000000000500", "event_type": "ONBOARDING", "event_body": { "merchant_id": "00000000-0000-0000-0000-000000001002", "merchant_name": "ABCDEF", "status": "APPROVED", "reason": "some reason" } }

Create Webhook Subscription

Registers a subscription that will start receiving events at the given URL. The destination must be https on a publicly resolvable host; plain http, private ranges and loopback are rejected with WEBHOOK_URL_NOT_ALLOWED. A merchant may hold several subscriptions and duplicate URLs are not rejected.

Authorizations:
Request Body schema: application/json
merchant_id
required
string <uuid>

Merchant the subscription belongs to

url
required
string <uri>

HTTPS endpoint that will receive events

secret_key
required
string [ 20 .. 100 ] characters

Signing secret (HMAC-SHA256) used to sign deliveries. Must be sent as a JSON string: a numeric value is rejected, because a long number loses digits in some JSON serialisers and the stored key would no longer match yours.

event_types
Array of strings (WebhookEventType)
Items Enum: "ACQUIRING" "SETTLEMENT" "CHARGEBACK" "ONBOARDING"

Event categories to receive; omit to receive all

Responses

200

OK

post /v2/webhooks/subscriptions
https://api.prysym.com/v2/webhooks/subscriptions
https://api.uat.prysym.com/v2/webhooks/subscriptions

Request samples

Content type
application/json
Copy
Expand all Collapse all
{}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS",
  • "data":
    {
    }
}

List Webhook Subscriptions

Returns the calling client's webhook subscriptions, newest first unless sort is given. Filter by id to read a single subscription back, by url to check whether a destination is already subscribed, or by merchant_id, active, event_type and created_at. Soft-deleted subscriptions are excluded; paused ones are included.

Authorizations:
Request Body schema: application/json
offset
number <integer>
Default: 0

The number of records to skip before starting to return results

limit
number <integer>
Default: 20

The maximum number of records to return in the response; capped at 200

filters
object

Filter request query

sort
object

Orders the results. Omit for newest subscription first.

Responses

200

OK

post /v2/webhooks/subscriptions/list
https://api.prysym.com/v2/webhooks/subscriptions/list
https://api.uat.prysym.com/v2/webhooks/subscriptions/list

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "offset": 0,
  • "limit": 20,
  • "filters":
    {
    },
  • "sort":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS",
  • "data":
    [
    ],
  • "paging":
    {
    }
}

Update Webhook Subscription

Updates the URL, secret, event types, or active flag of a subscription.

Authorizations:
path Parameters
id
required
string <uuid>

Subscription ID

Request Body schema: application/json
url
string <uri>

HTTPS endpoint that will receive events

secret_key
string [ 20 .. 100 ] characters

Signing secret (HMAC-SHA256). Must be sent as a JSON string.

event_types
Array of strings (WebhookEventType)
Items Enum: "ACQUIRING" "SETTLEMENT" "CHARGEBACK" "ONBOARDING"

Event categories to receive

active
boolean

Enable or disable delivery for this subscription. Setting it to false stops new events being queued, but deliveries already queued are still attempted; delete the subscription instead to stop those too.

Responses

200

OK

patch /v2/webhooks/subscriptions/{id}
https://api.prysym.com/v2/webhooks/subscriptions/{id}
https://api.uat.prysym.com/v2/webhooks/subscriptions/{id}

Request samples

Content type
application/json
Copy
Expand all Collapse all
{}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS",
  • "data":
    {
    }
}

Delete Webhook Subscription

Permanently removes a subscription. No further events are delivered to it.

Authorizations:
path Parameters
id
required
string <uuid>

Subscription ID

Responses

200

OK

delete /v2/webhooks/subscriptions/{id}
https://api.prysym.com/v2/webhooks/subscriptions/{id}
https://api.uat.prysym.com/v2/webhooks/subscriptions/{id}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS"
}

Rotate Secret

Starts a dual-secret window: deliveries are signed with both the old and new secret until rotation is completed.

Authorizations:
path Parameters
id
required
string <uuid>

Subscription ID

Request Body schema: application/json
secret_key
required
string [ 20 .. 100 ] characters

New signing secret, sent as a JSON string. Both the old and new secrets are honoured until rotation is completed.

Responses

200

OK

post /v2/webhooks/subscriptions/{id}/rotate-secret
https://api.prysym.com/v2/webhooks/subscriptions/{id}/rotate-secret
https://api.uat.prysym.com/v2/webhooks/subscriptions/{id}/rotate-secret

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "secret_key": "whsec_9876543210zyxwvutsrq"
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS"
}

Complete Rotation

Ends the rotation window and drops the previous secret. Only the new secret is used afterwards.

Authorizations:
path Parameters
id
required
string <uuid>

Subscription ID

Responses

200

OK

post /v2/webhooks/subscriptions/{id}/rotation/complete
https://api.prysym.com/v2/webhooks/subscriptions/{id}/rotation/complete
https://api.uat.prysym.com/v2/webhooks/subscriptions/{id}/rotation/complete

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS"
}

List Deliveries

Returns a paginated list of deliveries, newest event first unless sort is given. One event produces one delivery per matching subscription. Filter on event_id to find every delivery of an event you received, on status (for example ["DEAD"]) for the dead-letter view, or on event_type and created_at.

Authorizations:
Request Body schema: application/json
offset
number <integer>
Default: 0

The number of records to skip before starting to return results

limit
number <integer>
Default: 20

The maximum number of records to return in the response; capped at 200

filters
object

Filter request query

sort
object

Orders the results. Omit for newest event first.

Responses

200

OK

post /v2/webhooks/deliveries
https://api.prysym.com/v2/webhooks/deliveries
https://api.uat.prysym.com/v2/webhooks/deliveries

Request samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "offset": 0,
  • "limit": 20,
  • "filters":
    {
    },
  • "sort":
    {
    }
}

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS",
  • "data":
    [
    ],
  • "paging":
    {
    }
}

Retry Delivery

Re-queues a single delivery for the relay. Resets it to PENDING with a full retry budget; works on dead-lettered deliveries too. The id is a delivery_id from the list response, not the event_id delivered in the payload: an event id returns 404, and its deliveries are found by filtering on event_id.

Authorizations:
path Parameters
id
required
string <uuid>

Delivery ID — the delivery_id from List Deliveries, NOT the event_id sent in the webhook payload.

Responses

200

OK

post /v2/webhooks/deliveries/{id}/retry
https://api.prysym.com/v2/webhooks/deliveries/{id}/retry
https://api.uat.prysym.com/v2/webhooks/deliveries/{id}/retry

Response samples

Content type
application/json
Copy
Expand all Collapse all
{
  • "status": "SUCCESS"
}