HOPPA Developer guideAPI reference
Implementation guide · v2.0

From first user
to first transaction.

A practical, copy-ready path through onboarding, bank accounts, cards, funding and IBAN payments—whether you use one, two or all three providers.

7 bank combinations5 code languages15 guided workflows
Hoppa API account and card connected to three banking providers
Staging API · updated 22 Jul 2026

Tell us how you are set up.

Select the banks enabled for this customer or programme. All seven combinations are supported: three single-bank setups, three two-bank setups—including Equals Money + Interlace without BPay—and all three together.

1 bank selected. At least one bank must remain selected.

InterlaceCrypto-first cards and wallets
  1. 1Create the user; the Interlace account is provisioned when Interlace is the company default.
  2. 2Complete SumSub KYC and wait for the bank status to become approved.
  3. 3Choose an Interlace card product (BankProviderType 1) from the user’s tier.
  4. 4Fund the Quantum wallet, then order and top up the card.
Do not miss: The public DELETE card operation is Interlace-only.
Your backendx-api-key
Hoppa APIone contract
InterlaceBankProviderType 1
BPayUnifiedSwitch · type 3
Equals MoneyBankProviderType 2
Capability map
CapabilityInterlaceBPayEquals Money
Personal userSumSub + accountProgramme KYCSumSub + application
Business public KYBProgramme-specificProgramme-specificFull application API
Card fundingQuantum walletFiat account / BoomFi loadBudget
IBAN payoutsNot the primary railUnified banking APIUnified banking API + OTP
Public cancel cardYesNo—freezeNo—freeze

Make one safe request.

All public v2 calls are made from your backend with your company API key. Never ship the key in a browser or mobile app.

1Save the secret

Store it as HOPPA_API_KEY in your server’s secret manager.

2Use staging first

Base URL: https://staging.hoppa.global

3Send the header

x-api-key: YOUR_API_KEY on every request.

Copy-ready request

Verify credentials by listing tiers

curl --request GET 'https://staging.hoppa.global/api/v2/tiers' \
  -H 'x-api-key: YOUR_API_KEY'
Example 200 responseJSON · collapse
{
  "Tiers": [
    {
      "Id": 12,
      "Name": "Personal Plus",
      "Description": "Personal accounts with cards and payments",
      "TierLevel": 2,
      "AccountType": "personal",
      "MonthlyFee": 9.99,
      "YearlyFee": 99,
      "Features": [
        "CARDS",
        "PAYMENTS"
      ],
      "IsDefault": false,
      "IsActive": true,
      "IncludesEqualsCards": true,
      "IncludesEqualsIban": true,
      "CreatedAt": "2026-07-01T08:00:00Z",
      "UpdatedAt": "2026-08-01T08:00:00Z"
    }
  ]
}
200Credentials work
401Missing or invalid key
403Key lacks company access
429Back off and retry later

Create, verify, then provision.

Create the Hoppa user once, then choose exactly one of four KYC input methods: hosted SumSub, mobile SDK, reusable SumSub sharing, or a complete manual payload. Each selected bank still has an independent approval state.

01Create userSave Id
02Provide KYCChoose one input method
03Poll statusWait for approval
04Bank onboardingRun needed branches
05List providersStore account IDs

Step 1 — create the customer

POST/api/v2/users
  • ExternalUserId must be your stable customer ID, not an email address that may change.
  • Phone should be E.164, for example +447700900123.
  • Send AccountType: personal explicitly.
  • Keep the returned Hoppa Id; every following call uses it.
Copy-ready request

Create a personal user

curl --request POST 'https://staging.hoppa.global/api/v2/users' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Email": "jane.doe@example.com",
  "FirstName": "Jane",
  "LastName": "Doe",
  "Phone": "+447700900123",
  "ExternalUserId": "customer_1042",
  "AccountType": "personal",
  "DateOfBirth": "1990-01-15",
  "Address": "10 Market Street",
  "City": "London",
  "Country": "GB",
  "ZipCode": "SW1A 1AA"
}'
Example 201 responseJSON · collapse
{
  "Id": 123,
  "ExternalUserId": "customer_1042",
  "Email": "jane.doe@example.com",
  "FirstName": "Jane",
  "LastName": "Doe",
  "Status": "ACTIVE",
  "KycStatus": "NOT_STARTED",
  "AccountType": "personal",
  "CompanyId": 42,
  "CreatedAt": "2026-08-05T09:30:00Z"
}

Step 2 — choose how to provide KYC

Selected KYC route
POST/api/v2/users/{userId}/sumsub/kyc-url

Use the returned short-lived AccessToken and Configuration to launch the SumSub WebSDK. Your backend still owns status polling and provider provisioning.

Copy-ready request

Create a hosted SumSub KYC link

curl --request POST 'https://staging.hoppa.global/api/v2/users/123/sumsub/kyc-url' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Occupation": "STUDENT",
  "AnnualSalary": "0-10000",
  "AccountPurpose": "PERSONAL_USE",
  "ExpectedMonthlyVolume": "0-1000",
  "DocumentIssueDate": "2022-01-01",
  "IpAddress": "203.0.113.10"
}'
Example 200 responseJSON · collapse
{
  "Success": true,
  "AccessToken": "SUMSUB_WEBSDK_ACCESS_TOKEN",
  "ApplicantId": "sumsub_applicant_abc123",
  "ExternalUserId": "123",
  "KycSubmissionId": 9081,
  "Status": "PENDING",
  "ExistingStatus": "NOT_STARTED",
  "ExpiresAt": "2026-08-05T10:30:00Z",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "IsNewApplicant": true,
  "Message": "KYC session created",
  "Configuration": {
    "levelName": "HOPPA_PRODUCTION"
  }
}

Step 3 — wait for the right approval

GET/api/v2/users/{userId}/kyc/detailed-status
Interlace

Base KYC approved → ensure Interlace account exists.

Required for selected setup
BPay

Base/programme KYC approved → BPay link is created with the first eligible card.

Not selected
Equals Money

Base KYC approved → submit Equals Money application and any requested documents.

Not selected

Step 4 — run provider onboarding

Interlace

When Interlace is the company default, user creation provisions the account. Treat /users/create-interlace-account/{userId} as an idempotent repair path.

BPay

The UnifiedSwitch/BPay link is provisioned lazily when the first BPay card is ordered. The chosen tier and card product must support provider type 3.

Equals Money

Submit the multipart application below after SumSub is approved. The proof of address must be JPG, JPEG, PNG or PDF and not older than three months.

Copy-ready request

Submit Equals Money personal onboarding

curl --request POST 'https://staging.hoppa.global/api/v2/banking/equalsmoney-onboarding?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -F 'RequestedFeatures=PAYMENTS' \
  -F 'RequestedFeatures=CARDS' \
  -F 'MainPurpose=PERSONAL_TRANSFERS_OR_LIVING_EXPENSES' \
  -F 'SourceOfFunds=RECEIVING_SALARY_PENSION_OR_DIVIDENDS' \
  -F 'DestinationOfFunds=GB' \
  -F 'CurrenciesRequired=GBP' \
  -F 'AnnualVolume=10000-50000' \
  -F 'NumberOfPayments=5-10' \
  -F 'CardPurposes=TRAVEL' \
  -F 'AtmWithdrawalsRequired=false' \
  -F 'NumberOfCardsRequired=1' \
  -F 'CardAnnualSpend=10000-50000' \
  -F 'ProofOfAddress=@/absolute/path/proof-of-address.pdf'
Example 202 responseJSON · collapse
{
  "Success": true,
  "Message": "Application accepted for review",
  "CorrelationId": "eq_onboarding_551",
  "AccountId": "eq_account_771"
}

Keep company KYB separate from personal KYC.

Create the Hoppa user with AccountType: business. The public full KYB application shown here is the Equals Money path; Interlace and BPay business availability is programme-specific.

1Get optionsGET /business/onboarding/options
2Create peopleDirectors, UBOs, applicant
3Create applicationCompany details and activity
4Upload documentsCompany + each person
5SubmitWait for provider review
POST/api/v2/business/onboarding/associated-people?userId=321
POST/api/v2/business/onboarding/application?userId=321
POST/api/v2/business/onboarding/application/documents?userId=321
POST/api/v2/business/onboarding/associated-people/{personId}/documents?userId=321
POST/api/v2/business/onboarding/application/submit?userId=321
Copy-ready request

Create an Equals Money business application

curl --request POST 'https://staging.hoppa.global/api/v2/business/onboarding/application?userId=321' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Market": "UK",
  "BusinessType": "PRIVATE_COMPANY",
  "CountryOfIncorporation": "GB",
  "RegisteredName": "Example Trading Ltd",
  "RegistrationNumber": "12345678",
  "BusinessOverview": "Online retail of consumer electronics",
  "IndustryMain": "RETAIL",
  "IndustrySub": "E_COMMERCE",
  "EmployeeCount": 12,
  "IncorporationDate": "2020-03-12",
  "Website": "https://example.com"
}'
Example 200 responseJSON · collapse
{
  "id": "application_eq_90210",
  "status": "draft",
  "accountId": null,
  "market": "UK",
  "type": "PRIVATE_COMPANY",
  "registeredName": "Example Trading Ltd",
  "registrationNumber": "12345678",
  "createdAt": "2026-08-05T09:35:00Z"
}

Discover resources; never manufacture IDs.

After onboarding, ask the API what this customer has. When two or three banks are selected, each returned resource identifies the provider that owns the operation.

The ID rule

Display friendly provider and currency labels in your UI, but pass the exact returned accountId, balanceId, budgetId, payeeId or local cardId back to the API.

Resolve the product before ordering.

1List tiersGET /tiers
2Assign tierPOST /users/{id}/tier
3List card productsGET /tiers/card-tier/{tierId}
4Order cardPOST /cards
Copy-ready request

Order a virtual card

curl --request POST 'https://staging.hoppa.global/api/v2/cards' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: card-order-customer-1042-v1' \
  --data '{
  "UserId": 123,
  "CardTypeId": 456,
  "Phone": "+447700900123",
  "Currency": "GBP",
  "CardName": "Jane main card",
  "BudgetId": "budget_only_for_equals_money",
  "AutoLockEnabled": false
}'
Example 201 responseJSON · collapse
{
  "Id": 789,
  "UserId": 123,
  "ExternalCardId": "provider_card_771",
  "Nickname": "Jane main card",
  "CardType": "VIRTUAL",
  "Status": "PENDING",
  "Currency": "GBP",
  "CardTypeId": 456,
  "TierId": 12,
  "AutoLockEnabled": false,
  "CreatedAt": "2026-08-05T09:40:00Z"
}

Remove BudgetId for Interlace and BPay. For Equals Money it is required. For a physical card also send complete DeliveryAddress and, where configured, a design ID.

Physical Interlace cards

  1. Quote production and mailing fees with GET /api/v2/cards/physical-card-fees?userId=123&country=GB&cardTypeId=456.
  2. Show both fee rows and the total to the customer.
  3. Order the card. For an existing pending card, quote GET /cards/{cardId}/bulk-ship/quote and execute POST /cards/{cardId}/bulk-ship.

Manage an issued card

GET/api/v2/cards?userId=123

List local cards. Use the returned local Id for all card actions.

GET/api/v2/cards/789?userId=123

Fetch status and safe details.

POST/api/v2/cards/789/activate?userId=123

Physical card after delivery.

POST/api/v2/cards/789/freeze?userId=123

Temporary stop; supported across providers.

POST/api/v2/cards/789/enable?userId=123

Re-enable unless system-blocked.

PUT/api/v2/cards/789/pin?userId=123

PIN must satisfy documented six-digit rules.

GET/api/v2/cards/789/widget?userId=123

Short-lived secure iframe URL. Never persist card data.

DELETE/api/v2/cards/789?userId=123

Interlace only. Permanent cancellation.

Move money using the card’s provider.

The public card endpoints look the same, but the source and destination are provider-specific.

Interlace

Quantum USD → card. Unload returns card funds to the Quantum wallet.

BPay

Linked fiat account → card. Crypto funding uses BoomFi via /card-loads/crypto.

Equals Money

Budget → card balance. Ensure the budget has enough USD-equivalent funds.

Copy-ready request

Top up a card

curl --request POST 'https://staging.hoppa.global/api/v2/cards/topup' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: topup-card-789-20260805-001' \
  --data '{
  "CardId": 789,
  "Token": "USD",
  "Value": 100
}'
Example 200 responseJSON · collapse
{
  "Success": true,
  "OrderId": "topup_5501",
  "Token": "USD",
  "Value": 100,
  "Fee": 2,
  "Message": "Card top-up completed",
  "CreatedAt": "2026-08-05T09:42:00Z"
}
Copy-ready request

Unload a card

curl --request POST 'https://staging.hoppa.global/api/v2/cards/unload-card' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: unload-card-789-20260805-001' \
  --data '{
  "CardId": 789,
  "Currency": "USD",
  "Value": 25
}'
Example 200 responseJSON · collapse
{
  "Success": true,
  "CardId": 789,
  "RequestedAmount": 25,
  "ActualAmount": 25,
  "Fee": 0,
  "NetAmount": 25,
  "Currency": "USD",
  "Status": "COMPLETED",
  "TransactionId": "txn_unload_4401",
  "CompletedAt": "2026-08-05T09:43:00Z"
}
INVALID_AMOUNT Check limits and decimalsINSUFFICIENT_BALANCE Fund the source firstNO_ACCOUNT Provider onboarding incompleteFEE_CHARGE_FAILED Do not retry blindly

Use the four-step payout state machine.

First create and, when required, verify a payee. Then quote, check, initiate and finally create the payout.

1Required fieldsCountry, currency, method
2Create payeeValidation + OTP challenge
3Confirm payeeVerificationToken
4QuoteSave Id + QuoteRequestId
5Check payoutSave CheckId
6InitiateSend OTP
7Verify OTPGet token
8Create payoutSave local Id

A. Create the IBAN payee

GET/api/v2/banking/payees/required-fields?userId=123&paymentType=COMPANY&paymentMethod=SEPA.CREDITTRANSFER&currency=EUR

Build the form from this response. For SEPA, send the IBAN in Iban and the BIC in Bic when requested.

Copy-ready request

Validate and create a payee

curl --request POST 'https://staging.hoppa.global/api/v2/banking/payees?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: payee-acme-eur-v1' \
  --data '{
  "Name": "Acme Supplies Ltd",
  "PaymentType": "COMPANY",
  "PaymentMethod": "SEPA.CREDITTRANSFER",
  "Currency": "EUR",
  "Iban": "DE89370400440532013000",
  "Bic": "COBADEFFXXX",
  "BankName": "Example Bank",
  "Comments": "Approved supplier"
}'
Example 202 responseJSON · collapse
{
  "Success": true,
  "VerificationToken": "verification_abc123",
  "Message": "OTP sent",
  "ExpiresAt": "2026-08-05T09:50:00Z",
  "RecipientName": "Acme Supplies Ltd",
  "AccountNumberLast4": "3000"
}

B. Quote and pay

Copy-ready request

Quote a payout

curl --request POST 'https://staging.hoppa.global/api/v2/banking/quotations?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: payout-invoice-2026-018-quote' \
  --data '{
  "PayeeId": 902,
  "FromCurrency": "EUR",
  "Amount": 125.5,
  "FeeMethod": "INCLUDED",
  "BalanceId": "provider_balance_or_budget_id"
}'
Example 200 responseJSON · collapse
{
  "IsAvailable": true,
  "Id": "quote_eq_771",
  "QuoteRequestId": "quote_request_990",
  "Rate": "1.0000",
  "Fees": [
    {
      "Amount": "1.50",
      "Currency": "EUR"
    }
  ],
  "ExpirationTime": "2026-08-05T09:48:00Z"
}
2 Check the payout
POST /api/v2/banking/payouts/check?userId=123
{
  "PayeeId": 902,
  "QuotationId": "id-from-quotation",
  "Amount": "125.50",
  "Currency": "EUR",
  "BalanceId": "provider_balance_or_budget_id",
  "Memo": "Invoice 2026-018"
}
3 Initiate and send OTP
POST /api/v2/banking/payouts/initiate?userId=123
{
  "CheckId": "check-id",
  "QuoteRequestId": "quote-request-id",
  "PayeeId": 902,
  "Amount": "125.50",
  "Currency": "EUR",
  "FromCurrency": "EUR",
  "BalanceId": "provider_balance_or_budget_id"
}
4 Verify OTP
POST /api/v2/banking/otp/verify?userId=123
{
  "verificationId": "id-from-initiate",
  "code": "123456"
}
5 Create the payout
POST /api/v2/banking/payouts?userId=123
{
  "VerificationToken": "verified-token",
  "CheckId": "check-id",
  "QuoteRequestId": "quote-request-id",
  "PayeeId": 902,
  "Amount": "125.50",
  "Currency": "EUR",
  "FromCurrency": "EUR",
  "BalanceId": "provider_balance_or_budget_id"
}

Treat API responses as acceptance, not settlement.

Store the local Hoppa ID immediately, then update your state from webhooks and scheduled reconciliation.

Copy-ready request

List unified banking transactions

curl --request GET 'https://staging.hoppa.global/api/v2/banking/transactions?userId=123&page=1&pageSize=50' \
  -H 'x-api-key: YOUR_API_KEY'
Example 200 responseJSON · collapse
{
  "Transactions": [
    {
      "Id": "txn_1001",
      "Provider": "EqualsMoney",
      "Amount": "125.50",
      "Currency": "EUR",
      "Status": "COMPLETED",
      "CreatedAt": "2026-08-05T08:00:00Z"
    }
  ],
  "Total": 1,
  "Page": 1,
  "PageSize": 50
}
Account activity
GET/api/v2/banking/transactions

Unified view across provider accounts.

Platform ledger
GET/api/v2/transactions

Fees, card links and metadata.

Card activity
GET/api/v2/cards/{cardId}/transactions

Authorisations and card movements.

Payout status
GET/api/v2/banking/payouts/{payoutId}

Provider-refreshed payout state.

Webhook receiver rules

user.registeredcardholder.createdcardholder.approvedcard.createdcard.updatedcard.deletedcard.3ds.otp

Move money only between discovered balances.

Use account and budget IDs returned for this user. The banking layer can create and maintain Equals Money budgets, move funds internally, and quote then execute foreign-exchange trades.

1DiscoverAccounts, balances and budgets
2PrepareCreate or update the destination budget
3QuoteLock currency and amount
4ExecuteTransfer or trade once
5ReconcileStore IDs and final status
Copy-ready request

Create an Equals Money budget

curl --request POST 'https://staging.hoppa.global/api/v2/banking/users/123/budgets' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Name": "Operations GBP",
  "Currencies": [
    "GBP",
    "EUR"
  ],
  "Type": "individual",
  "Features": [
    "peopleCards"
  ],
  "AllowCurrencyAlignment": true
}'
Example 201 responseJSON · collapse
{
  "BudgetId": "budget_gbp_cards",
  "AccountId": "account_eq_123",
  "Name": "Operations GBP",
  "Type": "individual",
  "Status": "active",
  "AllowCurrencyAlignment": true,
  "Currencies": [
    "GBP",
    "EUR"
  ],
  "Balances": [
    {
      "Currency": "GBP",
      "Available": "0.00"
    }
  ],
  "CreatedAt": "2026-08-05T09:45:00Z"
}
Copy-ready request

Transfer between a user’s balances

curl --request POST 'https://staging.hoppa.global/api/v2/banking/transfers/internal' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "SourceBalanceId": "balance_gbp_primary",
  "DestinationBalanceId": "budget_gbp_cards",
  "Amount": 250,
  "Currency": "GBP",
  "Reference": "Fund card budget"
}'
Example 201 responseJSON · collapse
{
  "Success": true,
  "TransferId": "transfer_eq_771",
  "Status": "PENDING",
  "Amount": 250,
  "Currency": "GBP",
  "Provider": "EqualsMoney",
  "CreatedAt": "2026-08-05T09:46:00Z",
  "ErrorMessage": null
}
Copy-ready request

Quote a foreign-exchange trade

curl --request POST 'https://staging.hoppa.global/api/v2/banking/trades/quote?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "AccountId": "account_from_banking_accounts",
  "BaseCurrency": "GBP",
  "QuoteCurrency": "EUR",
  "Amount": 500,
  "Side": "sell"
}'
Example 200 responseJSON · collapse
{
  "QuoteId": "fx_quote_991",
  "BaseCurrency": "GBP",
  "QuoteCurrency": "EUR",
  "Amount": 500,
  "QuoteAmount": 585.25,
  "ExchangeRate": 1.1705,
  "Provider": "EqualsMoney",
  "ExpiresAt": "2026-08-05T09:52:00Z"
}
PUT/api/v2/banking/users/{userId}/budgets/{budgetId}
POST/api/v2/banking/users/{userId}/budgets/{budgetId}/transfer
POST/api/v2/banking/trades/execute
POST/api/v2/banking/orders/quote
POST/api/v2/banking/orders/trade

Choose the route from the source and destination.

“Transfer” is not one operation. First identify who owns the source balance and where money must finish. The selected bank combination below marks which routes are available for the current setup.

User → company masterAvailable

User crypto walletCompany treasury

POST /transfers/user-to-master
Company master → userAvailable

Company treasuryUser crypto wallet

POST /transfers/master-to-user
Crypto → QuantumAvailable

USDC / USDTInterlace Quantum USD

POST /transfers/crypto-to-quantum-transfer
Quantum → cryptoAvailable

Interlace Quantum USDUSDC / USDT

POST /transfers/quantum-usd-to-crypto-exchange
Budget → budgetNeeds Equals Money

Equals Money budgetAnother budget on same account

POST /banking/users/{userId}/budgets/{budgetId}/transfer
Equals → InterlaceNeeds Equals Money + Interlace

Equals Money budgetUser Interlace USDC address

POST /crypto-virtual-accounts/equals-to-interlace
Equals → external walletNeeds Equals Money

Equals Money budgetUSDC / USDT address + chain

POST /crypto-virtual-accounts/equals-to-wallet/*
Crypto → BPay cardNeeds BPay

BoomFi crypto depositBPay card in USD / EUR

POST /card-loads/crypto
Account → payeeNeeds BPay + Equals Money

BPay account or Equals budgetIBAN / bank payee

POST /banking/payouts
Crypto → external addressAvailable

User crypto balanceBlockchain wallet

POST /transfers/withdrawals/crypto

Company treasury transfers

Use these only for movement between the authenticated company master wallet and one of its users. UserId is always the customer side of the transfer.

Copy-ready request

Sweep a user balance to the master wallet

curl --request POST 'https://staging.hoppa.global/api/v2/transfers/user-to-master' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "Amount": "100.00",
  "Currency": "USDC",
  "Description": "Move user funds to company treasury",
  "ExternalReferenceId": "treasury_sweep_1042_001",
  "Metadata": {
    "customerId": "customer_1042"
  }
}'
Example 201 responseJSON · collapse
{
  "Id": "transfer_10001",
  "Status": "PENDING",
  "UserId": 123,
  "Amount": "100.00",
  "Currency": "USDC",
  "TransferType": "user_to_master_transfer",
  "ExternalReferenceId": "treasury_sweep_1042_001",
  "CreatedAt": "2026-08-05T09:47:00Z"
}
Copy-ready request

Fund a user from the master wallet

curl --request POST 'https://staging.hoppa.global/api/v2/transfers/master-to-user' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "Amount": "75.00",
  "Currency": "USDC",
  "Description": "Fund customer wallet",
  "ExternalReferenceId": "customer_funding_1042_001",
  "Metadata": {
    "approvedBy": "treasury-system"
  }
}'
Example 201 responseJSON · collapse
{
  "Id": "transfer_10002",
  "Status": "PENDING",
  "UserId": 123,
  "Amount": "75.00",
  "Currency": "USDC",
  "TransferType": "master_to_user_transfer",
  "ExternalReferenceId": "customer_funding_1042_001",
  "CreatedAt": "2026-08-05T09:48:00Z"
}

Interlace Quantum conversions

The destination of crypto-to-Quantum is always USD. The reverse path accepts only the supported target crypto currencies. Each operation currently has its own one-request-per-15-seconds limit; respect Retry-After after a 429.

Copy-ready request

Convert crypto to Quantum USD

curl --request POST 'https://staging.hoppa.global/api/v2/transfers/crypto-to-quantum-transfer?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "SourceCurrency": "USDC",
  "DestinationCurrency": "USD",
  "Amount": 125
}'
Example 200 responseJSON · collapse
{
  "Success": true,
  "TransferId": "crypto_quantum_201",
  "Message": "Transfer submitted",
  "CreatedAt": "2026-08-05T09:49:00Z",
  "Details": {
    "SourceAmount": "125.00",
    "SourceCurrency": "USDC",
    "DestinationCurrency": "USD",
    "Status": "PROCESSING"
  }
}
Copy-ready request

Convert Quantum USD to crypto

curl --request POST 'https://staging.hoppa.global/api/v2/transfers/quantum-usd-to-crypto-exchange?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Currency": "USDC",
  "Amount": 100
}'
Example 200 responseJSON · collapse
{
  "Success": true,
  "Message": "Exchange submitted",
  "SourceAmount": 100,
  "TargetCurrency": "USDC",
  "CryptoAmountReceived": 99.25,
  "Rate": 1,
  "Fee": 0.75,
  "TradeId": "quantum_crypto_202",
  "Status": "PROCESSING",
  "InitiatedAt": "2026-08-05T09:50:00Z",
  "Details": {
    "SourceCurrency": "USD"
  }
}

Equals Money cross-provider transfers

Copy-ready request

Transfer an Equals budget to Interlace

curl --request POST 'https://staging.hoppa.global/api/v2/crypto-virtual-accounts/equals-to-interlace' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "FiatCurrency": "GBP",
  "Amount": 250,
  "BudgetId": "equals_budget_from_banking_api"
}'
Example 201 responseJSON · collapse
{
  "Success": true,
  "Message": "Transfer initiated",
  "Reference": "eq_interlace_301",
  "UserId": 123,
  "BudgetId": "equals_budget_from_banking_api",
  "FiatCurrency": "GBP",
  "FiatAmount": "250.00",
  "CryptoCurrency": "USDC",
  "EstimatedCryptoAmount": "330.00",
  "EstimatedFeeAmount": "2.50",
  "Rate": "0.75",
  "ChainId": 1,
  "Chain": "ethereum",
  "DepositAddress": "interlace_address_from_user_wallet",
  "BoomFiPayout": {
    "Status": "PENDING"
  }
}
Copy-ready request

Initiate an Equals budget transfer to a wallet

curl --request POST 'https://staging.hoppa.global/api/v2/crypto-virtual-accounts/equals-to-wallet/initiate' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "FiatCurrency": "EUR",
  "Amount": 150,
  "BudgetId": "equals_budget_from_banking_api",
  "CryptoCurrency": "USDC",
  "Chain": "ethereum",
  "Address": "0x1111111111111111111111111111111111111111"
}'
Example 200 responseJSON · collapse
{
  "Success": true,
  "VerificationToken": "eq_wallet_verify_401",
  "Message": "OTP sent",
  "ExpiresAt": "2026-08-05T09:55:00Z",
  "Reference": "eq_wallet_401",
  "UserId": 123,
  "BudgetId": "equals_budget_from_banking_api",
  "FiatCurrency": "EUR",
  "FiatAmount": "150.00",
  "CryptoCurrency": "USDC",
  "EstimatedCryptoAmount": "168.18",
  "EstimatedFeeAmount": "1.50",
  "Rate": "0.88",
  "ChainId": 1,
  "Chain": "ethereum",
  "DestinationAddress": "0x1111111111111111111111111111111111111111",
  "DestinationAddressMasked": "0x1111…1111"
}

For an external wallet, display the quote and send the OTP, then finish with POST /api/v2/crypto-virtual-accounts/equals-to-wallet/confirm using UserId, VerificationToken and OtpCode.

Complete transfer endpoint inventory

History
GET/api/v2/transfers
GET/api/v2/transfers/{transferId}
Wallet funding
POST/api/v2/transfers/wallet-topup
POST/api/v2/transactions/top-up
Withdrawal checks
GET/api/v2/transfers/withdrawals/fee-and-quota
GET/api/v2/transfers/withdrawals/available-balance
GET/api/v2/transfers/withdrawals/validate
Withdrawal submit
POST/api/v2/transfers/withdrawals/crypto
POST/api/v2/transfers/withdrawals/crypto/confirm
Crypto activity
GET/api/v2/transfers/crypto-transactions
GET/api/v2/transfers/crypto-refunds
Crypto refund
POST/api/v2/transfers/crypto-refunds/gas-fee
POST/api/v2/transfers/crypto-refunds

Separate deposits, conversions and withdrawals.

A wallet address, crypto virtual account, Quantum balance and BPay card are different resources. Show the network and currency together, and never infer a chain from the token symbol.

Wallet funding

Use /transfers/wallet-topup for the hosted Transak route, or a returned deposit address for a direct on-chain deposit.

Quantum conversion

Use /crypto-to-quantum-transfer and /quantum-usd-to-crypto-exchange for Interlace wallet conversions.

Virtual accounts

Open a BoomFi crypto account, request pay-in addresses, settlement accounts, ramp quotes and supported swap targets.

Cross-provider movement

Use the dedicated Equals-to-Interlace or Equals-to-wallet initiate/confirm operations. Do not imitate them with a generic transfer.

BPay card load from crypto

Copy-ready request

Create a BPay crypto card load

curl --request POST 'https://staging.hoppa.global/api/v2/card-loads/crypto' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: bpay-crypto-load-789-001' \
  --data '{
  "UserId": 123,
  "CardId": 789,
  "CryptoCurrency": "USDC",
  "CryptoAmount": "100.00",
  "ChainId": 1,
  "FiatCurrency": "USD"
}'
Example 202 responseJSON · collapse
{
  "Id": 5501,
  "Status": "AWAITING_DEPOSIT",
  "UserId": 123,
  "CardId": 789,
  "CryptoCurrency": "USDC",
  "CryptoAmount": "100.00",
  "ChainId": 1,
  "FiatCurrency": "USD",
  "EstimatedFiatAmount": "99.00",
  "DepositInstruction": {
    "Address": "0xdepositaddress",
    "Network": "ethereum"
  },
  "CreatedAt": "2026-08-05T09:50:00Z"
}

Crypto virtual account

Copy-ready request

Open a crypto virtual account

curl --request POST 'https://staging.hoppa.global/api/v2/crypto-virtual-accounts' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "Name": "Customer settlement",
  "Providers": [
    "boomfi"
  ],
  "Chains": [
    {
      "ChainId": 1,
      "Currencies": [
        "USDC",
        "USDT"
      ]
    }
  ]
}'
Example 201 responseJSON · collapse
{
  "Success": true,
  "Message": "Crypto virtual account created",
  "Results": [
    {
      "Provider": "boomfi",
      "AccountId": "boomfi_account_771",
      "Status": "ACTIVE",
      "Chains": [
        {
          "ChainId": 1,
          "Currencies": [
            "USDC",
            "USDT"
          ]
        }
      ]
    }
  ]
}
GET/api/v2/crypto-virtual-accounts/trading-overview
GET/api/v2/crypto-virtual-accounts/swap-targets
POST/api/v2/crypto-virtual-accounts/payin-address
POST/api/v2/crypto-virtual-accounts/settlement-accounts
POST/api/v2/crypto-virtual-accounts/equals-to-wallet/initiate
POST/api/v2/crypto-virtual-accounts/equals-to-wallet/confirm

External withdrawal

  1. Show fee, quota and spendable balance from GET /transfers/withdrawals/fee-and-quota and GET /transfers/withdrawals/available-balance.
  2. Validate currency, chain, amount and destination with GET /transfers/withdrawals/validate.
  3. Create the withdrawal, then show the OTP input only when the response requires confirmation.
  4. Confirm through POST /transfers/withdrawals/crypto/confirm and reconcile using the transfer ID.
Copy-ready request

Create an external crypto withdrawal

curl --request POST 'https://staging.hoppa.global/api/v2/transfers/withdrawals/crypto' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "Currency": "USDC",
  "Chain": "ethereum",
  "Amount": "50.00",
  "DestinationAddress": "0x1111111111111111111111111111111111111111",
  "ConfirmExchangeRate": true,
  "Description": "Customer withdrawal",
  "Metadata": {
    "externalReferenceId": "withdrawal_9081"
  }
}'
Example 201 responseJSON · collapse
{
  "Success": true,
  "TransactionId": "withdrawal_tx_771",
  "WithdrawalRequestId": 9081,
  "Status": "OTP_REQUIRED",
  "ActualAmount": 50,
  "Currency": "USDC",
  "Fees": [
    {
      "Type": "NETWORK",
      "Amount": "2.00",
      "Currency": "USDC"
    }
  ],
  "OtpRequired": true,
  "OtpExpiresAt": "2026-08-05T10:00:00Z",
  "Message": "OTP sent"
}

Token swap

Copy-ready request

Swap supported tokens

curl --request POST 'https://staging.hoppa.global/api/v2/swaptokens/swap' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "TokenIn": "USDC",
  "TokenOut": "USDT",
  "AmountIn": "100.00",
  "Slippage": 0.5,
  "ChainIdIn": 1,
  "ChainIdOut": 1,
  "FromAddress": "wallet_address_from_api",
  "ToAddress": "wallet_address_from_api"
}'
Example 200 responseJSON · collapse
{
  "TransactionId": 701,
  "Transaction": {
    "Status": "PENDING",
    "Hash": null
  },
  "Route": {
    "TokenIn": "USDC",
    "TokenOut": "USDT",
    "AmountIn": "100.00",
    "EstimatedAmountOut": "99.70"
  }
}

List previous swaps with GET /api/v2/swaptokens/history. The slippage value is a percentage; show it to the customer before submitting.

Add product modules without changing the core customer ID.

These modules reuse your company-scoped API key and Hoppa resources, but they have separate lifecycles. Enable only the modules included in your commercial programme.

PaymentsRequests, mandates, payouts

Create hosted payment requests, recurring mandates, payouts and withdrawals. Persist the returned ID and status.

/api/v2/payments/*
Merchant of RecordPrepaid card batches

Complete merchant KYB, create the company cardholder, add lightweight users, order 1–20 cards, assign, load and unload.

/api/v2/mor/public/*
VouchersIssue, assign, redeem

Manage groups and codes, assignments, verification, reversals, imports, liability and reports. Redemption is idempotent.

/api/v2/vouchers/*
LoyaltyRules, points, analytics

Configure programmes, merchants and MIDs, auto-assign points, import transactions, show dashboards and redemption options.

/api/v2/loyalty/*
DiscountsCompany admin feature

Admins can manage discount codes and associate a discount with a card. Do not expose company-admin credentials to end users.

/api/v2/admin/discount-codes/*
Copy-ready request

Create a hosted payment request

curl --request POST 'https://staging.hoppa.global/api/v2/payments/requests' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "Amount": "49.99",
  "Currency": "GBP",
  "Description": "Invoice 2026-042",
  "ExternalReferenceId": "invoice_2026_042",
  "CallbackUrl": "https://api.example.com/webhooks/hoppa/payments",
  "SuccessUrl": "https://app.example.com/payment/success",
  "FailureUrl": "https://app.example.com/payment/failed",
  "Metadata": {
    "orderId": "order_5531"
  }
}'
Example 201 responseJSON · collapse
{
  "Id": 8042,
  "UserId": 123,
  "CompanyId": 42,
  "Amount": "49.99",
  "Currency": "GBP",
  "Status": "PENDING",
  "ExternalReferenceId": "invoice_2026_042",
  "PaymentUrl": "https://pay.hoppa.global/r/request_8042",
  "CreatedAt": "2026-08-05T09:55:00Z"
}
Copy-ready request

Order a MOR prepaid-card batch

curl --request POST 'https://staging.hoppa.global/api/v2/mor/public/cards/batch' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "CardTypeId": 456,
  "Quantity": 10,
  "AutoLockEnabled": true,
  "LabelPrefix": "EVENT-2026"
}'
Example 200 responseJSON · collapse
{
  "Success": true,
  "Ordered": 10,
  "Cards": [
    {
      "Id": 9101,
      "Label": "EVENT-2026-01",
      "Status": "PENDING",
      "AutoLockEnabled": true
    }
  ],
  "Message": "Card batch accepted"
}
POST/api/v2/mor/public/kyb
GET/api/v2/mor/public/onboarding-status
POST/api/v2/mor/public/cardholder
POST/api/v2/mor/public/users
POST/api/v2/mor/public/cards/{cardId}/assign
POST/api/v2/mor/public/cards/{cardId}/load
POST/api/v2/mor/public/cards/{cardId}/unload
GET/api/v2/mor/public/cards/{cardId}/secure-widget
Copy-ready request

Redeem a voucher for a user

curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/redemptions' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: voucher-welcome-25-customer-1042' \
  --data '{
  "UserId": 123,
  "Code": "WELCOME-25-ABCD"
}'
Example 200 responseJSON · collapse
{
  "Id": "52fe70de-7bb8-4f1b-b874-fb8123b2ae11",
  "VoucherId": "41c5f18f-3bd1-4206-8ac7-94fc53867d2a",
  "VoucherName": "Welcome 25",
  "Amount": 25,
  "Currency": "GBP",
  "Status": "COMPLETED",
  "TransactionReference": "voucher_tx_772",
  "CreatedAt": "2026-08-05T09:56:00Z",
  "CompletedAt": "2026-08-05T09:56:01Z"
}

Design the back office before go-live.

Support teams need the same IDs and states as your code. Cover user maintenance, onboarding gates, transaction exports, card controls and reconciliation—not only the happy path.

User profile and compliance

List and update users, collect occupation/referral data, inspect detailed KYC state, verify users, upload requested Equals Money documents, and retrieve wallets, assets, crypto addresses and tier.

GET/PUT /api/v2/users/{userId}
Config-driven onboarding

Load the gate configuration, check out the required gate, create KYC1/KYC2 sessions, poll onboarding status and assign the approved tier.

GET /api/v2/onboarding/config
Card controls and activity

Fetch holders and limits, update limits and auto-lock, list card transactions, estimate Quantum top-up costs, and handle physical-card shipping.

GET /api/v2/cards/{cardId}/limits
Transactions and exports

List, inspect, sync, aggregate and export platform transactions; retrieve Equals Money payment confirmations; repeat the equivalent workflow for whitelabel accounts.

GET /api/v2/transactions/export
Dual-balance card funding

Load the dashboard view, preview the conversion and fees, submit funding once, then poll the request ID to a terminal state.

POST /api/v2/dashboard/dual-balance/card-funding/preview
Support escalation

Send the local user and transaction identifiers, a clear customer-visible problem description and your external reference through the transaction-reporting endpoint.

POST /api/v2/admin/support/messages/report-transaction

Webhook contract families

Scalar contains receiver contracts for authentication, customer, cardholder, card, transfer, transaction, payment and 3DS event families. Implement one hardened receiver, dispatch by event type, and keep unknown events for later replay instead of dropping them.

Find every documented operation.

This searchable snapshot covers all 330 intentionally exposed operations in the current staging OpenAPI document. Use the guided sections above to choose the correct workflow, then open Scalar for the exact live request and response schema.

Integration normal server-to-server workAdmin company-operator privilegesLegacy compatibility onlyTest only sandbox utilities
330 matching operations in 21 product families · click any endpoint for its request and responses
Authentication3 operations
POST/Users/AuthenticateRetired legacy authentication endpointlegacyRequest & responses +
Request examplePOST /Users/Authenticate
No request body
curl --request POST 'https://staging.hoppa.global/Users/Authenticate' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples1 documented status
410GoneProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/Users/RefreshTokenRetired legacy refresh endpointlegacyRequest & responses +
Request examplePOST /Users/RefreshToken
No request body
curl --request POST 'https://staging.hoppa.global/Users/RefreshToken' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples1 documented status
410GoneProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/Users/MeGet current user informationRequest & responses +

Retrieves information about the currently authenticated user

Request exampleGET /Users/Me
No request body
curl --request GET 'https://staging.hoppa.global/Users/Me' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples2 documented statuses
200OKAuthenticateResponse
{
  "Id": 123,
  "Username": "string",
  "Email": "user@example.com",
  "Firstname": "Jane",
  "Lastname": "Doe",
  "AccessToken": "USDC",
  "RefreshToken": "USDC"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

Banking32 operations
GET/api/v2/banking/accountsGet all accounts across all banking providersRequest & responses +
Request exampleGET /api/v2/banking/accounts
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/banking/accounts?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
Response examples5 documented statuses
200OKUnifiedAccountsResponse
{
  "Accounts": [
    {
      "AccountId": "string",
      "ParentAccountId": "string",
      "BudgetId": "string",
      "DisplayName": "string",
      "AccountType": "string",
      "Status": "PENDING",
      "Provider": "EqualsMoney",
      "SupportedCurrencies": [
        "string"
      ],
      "CreatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "TotalCount": 1
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/accounts/fund-testFund an Equals Money account with a sandbox test credit.testRequest & responses +

Staging only. This endpoint uses the Equals Money sandbox budget-credit simulator and will not work in production. Use AccountId from GET /api/v2/banking/accounts. Amount defaults to 100.00 when omitted.

Request examplePOST /api/v2/banking/accounts/fund-test
application/jsonSchema: FundAccountRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/accounts/fund-test?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "AccountId": "string",
  "BalanceId": "100.00",
  "Currency": "USD",
  "Amount": {}
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "AccountId": "string",
  "BalanceId": "100.00",
  "Currency": "USD",
  "Amount": {}
}
Response examples5 documented statuses
200OKFundAccountResponse
{
  "Success": true,
  "Message": "string",
  "AccountId": "string",
  "BudgetId": "string",
  "Currency": "USD",
  "Amount": "100.00"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/equalsmoney-onboardingCreate an EqualsMoney personal onboarding applicationRequest & responses +

Personal onboarding only. Creates an EqualsMoney payments/cards application for the authenticated API user. Contact and account details are populated from the user profile; the client provides only the personal KYC fields and documents.

Request examplePOST /api/v2/banking/equalsmoney-onboarding
multipart/form-data
curl --request POST 'https://staging.hoppa.global/api/v2/banking/equalsmoney-onboarding?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -F 'RequestedFeatures=CARDS' \
  -F 'MainPurpose=SALARY_OR_INCOME' \
  -F 'SourceOfFunds=RECEIVING_FUNDS_FROM_OWN_ACCOUNTS' \
  -F 'DestinationOfFunds=AD' \
  -F 'CurrenciesRequired=AED' \
  -F 'AnnualVolume=0-10000' \
  -F 'NumberOfPayments=FEWER-THAN-5' \
  -F 'CardPurposes=SALARY_OR_INCOME' \
  -F 'CardAnnualSpend=0-10000' \
  -F 'NumberOfCardsRequired=0-10' \
  -F 'AtmWithdrawalsRequired=true' \
  -F 'ProofOfAddress=@/absolute/path/document.pdf'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "RequestedFeatures": [
    "CARDS"
  ],
  "MainPurpose": [
    "SALARY_OR_INCOME"
  ],
  "SourceOfFunds": [
    "RECEIVING_FUNDS_FROM_OWN_ACCOUNTS"
  ],
  "DestinationOfFunds": [
    "AD"
  ],
  "CurrenciesRequired": [
    "AED"
  ],
  "AnnualVolume": "0-10000",
  "NumberOfPayments": "FEWER-THAN-5",
  "CardPurposes": [
    "SALARY_OR_INCOME"
  ],
  "CardAnnualSpend": "0-10000",
  "NumberOfCardsRequired": "0-10",
  "AtmWithdrawalsRequired": true,
  "ProofOfAddress": "<binary file>"
}
Response examples5 documented statuses
202AcceptedEqualsMoneyOnboardingDashboardResponse
{
  "Success": true,
  "Message": "string",
  "CorrelationId": "string",
  "AccountId": "string"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/banking/users/{userId}/equals-banking-infoGet Equals banking information for a specific user in the authenticated company.Request & responses +
Request exampleGET /api/v2/banking/users/{userId}/equals-banking-info
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/banking/users/123/equals-banking-info?currency=USD' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdpathintegerrequiredExample: 123
currencyquerystringoptionalExample: USD
Response examples5 documented statuses
200OKapplication/json
[
  {
    "UserId": 123,
    "FirstName": "Jane",
    "LastName": "Doe",
    "UserName": "string",
    "MaskedEmail": "user@example.com",
    "MaskedPhone": "+447700900123",
    "PaymentType": "string",
    "PaymentMethod": "string",
    "Currency": "USD",
    "Country": "GB",
    "AccountNumber": "string",
    "BankName": "string",
    "RoutingCodes": [
      {
        "RoutingCodeType": "string",
        "RoutingCodeValue": "string"
      }
    ],
    "BankAddress": {
      "Country": "GB",
      "City": "London",
      "State": "string",
      "PostalCode": "SW1A 1AA",
      "AddressLine1": "string",
      "AddressLine2": "string"
    },
    "PayeeAddress": {
      "Country": "GB",
      "City": "London",
      "State": "string",
      "PostalCode": "SW1A 1AA",
      "AddressLine1": "string",
      "AddressLine2": "string"
    }
  }
]
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/banking/balanceGet aggregated balance across all banking providersRequest & responses +
Request exampleGET /api/v2/banking/balance
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/banking/balance?userId=123&currency=USD' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
currencyquerystringoptionalExample: USD
Response examples5 documented statuses
200OKUnifiedBalanceResponse
{
  "Balances": [
    {
      "AccountId": "string",
      "Currency": "USD",
      "Available": 100,
      "Current": 100,
      "Provider": "EqualsMoney",
      "UpdatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "TotalAvailableUsd": 100
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/banking/transactionsGet transactions across all banking providersRequest & responses +
Request exampleGET /api/v2/banking/transactions
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/banking/transactions?Currency=USD&From=2026-08-05T09%3A30%3A00Z&To=2026-08-05T09%3A30%3A00Z&Page=1&PageSize=1&Provider=EqualsMoney' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
CurrencyquerystringoptionalExample: USD
FromquerystringoptionalExample: 2026-08-05T09:30:00Z
ToquerystringoptionalExample: 2026-08-05T09:30:00Z
PagequeryintegeroptionalExample: 1
PageSizequeryintegeroptionalExample: 1
ProviderquerystringoptionalExample: EqualsMoney
userIdqueryintegeroptionalExample: 123
Response examples5 documented statuses
200OKUnifiedTransactionsResponse
{
  "Transactions": [
    {
      "TransactionId": "string",
      "AccountId": "string",
      "Type": "string",
      "Amount": 100,
      "Currency": "USD",
      "Description": "Example description",
      "Status": "PENDING",
      "Provider": "EqualsMoney",
      "CreatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "Total": 1,
  "Page": 1,
  "PageSize": 1
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/banking/users/{userId}/budgetsOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/banking/users/{userId}/budgets
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/banking/users/123/budgets' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdpathintegerrequiredExample: 123
Response examples4 documented statuses
200OKUserBudgetListResponse
{
  "UserId": 123,
  "Total": 1,
  "Budgets": [
    {
      "BudgetId": "string",
      "AccountId": "string",
      "Name": "string",
      "Type": "string",
      "ParentId": "string",
      "Status": "PENDING",
      "AllowCurrencyAlignment": true,
      "Currencies": [
        "string"
      ],
      "Balances": [
        {
          "Currency": "USD",
          "AvailableBalance": 100,
          "LedgerBalance": 100,
          "PendingBalance": 100
        }
      ],
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z"
    }
  ]
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/users/{userId}/budgetsOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/banking/users/{userId}/budgets
application/jsonSchema: UserBudgetCreateRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/users/123/budgets' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Name": "string",
  "Currencies": [
    "string"
  ],
  "Type": "string",
  "Features": [
    "string"
  ],
  "AllowCurrencyAlignment": true
}'
Parameters
userIdpathintegerrequiredExample: 123
Example request body
{
  "Name": "string",
  "Currencies": [
    "string"
  ],
  "Type": "string",
  "Features": [
    "string"
  ],
  "AllowCurrencyAlignment": true
}
Response examples5 documented statuses
201CreatedUserBudgetResponse
{
  "BudgetId": "string",
  "AccountId": "string",
  "Name": "string",
  "Type": "string",
  "ParentId": "string",
  "Status": "PENDING",
  "AllowCurrencyAlignment": true,
  "Currencies": [
    "string"
  ],
  "Balances": [
    {
      "Currency": "USD",
      "AvailableBalance": 100,
      "LedgerBalance": 100,
      "PendingBalance": 100
    }
  ],
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/banking/users/{userId}/budgets/{budgetId}Open request and response documentationRequest & responses +
Request exampleGET /api/v2/banking/users/{userId}/budgets/{budgetId}
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/banking/users/123/budgets/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdpathintegerrequiredExample: 123
budgetIdpathstringrequiredExample: 123
Response examples5 documented statuses
200OKUserBudgetResponse
{
  "BudgetId": "string",
  "AccountId": "string",
  "Name": "string",
  "Type": "string",
  "ParentId": "string",
  "Status": "PENDING",
  "AllowCurrencyAlignment": true,
  "Currencies": [
    "string"
  ],
  "Balances": [
    {
      "Currency": "USD",
      "AvailableBalance": 100,
      "LedgerBalance": 100,
      "PendingBalance": 100
    }
  ],
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/banking/users/{userId}/budgets/{budgetId}Updates user-editable budget details. Budget status is managed by Equals Money and is read-only.Request & responses +
Request examplePUT /api/v2/banking/users/{userId}/budgets/{budgetId}
application/jsonSchema: UserBudgetUpdateRequest
curl --request PUT 'https://staging.hoppa.global/api/v2/banking/users/123/budgets/123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Name": "string",
  "AllowCurrencyAlignment": true
}'
Parameters
userIdpathintegerrequiredExample: 123
budgetIdpathstringrequiredExample: 123
Example request body
{
  "Name": "string",
  "AllowCurrencyAlignment": true
}
Response examples5 documented statuses
200OKUserBudgetResponse
{
  "BudgetId": "string",
  "AccountId": "string",
  "Name": "string",
  "Type": "string",
  "ParentId": "string",
  "Status": "PENDING",
  "AllowCurrencyAlignment": true,
  "Currencies": [
    "string"
  ],
  "Balances": [
    {
      "Currency": "USD",
      "AvailableBalance": 100,
      "LedgerBalance": 100,
      "PendingBalance": 100
    }
  ],
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/users/{userId}/budgets/{budgetId}/transferOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/banking/users/{userId}/budgets/{budgetId}/transfer
application/jsonSchema: UserBudgetTransferRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/users/123/budgets/123/transfer' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "DestinationBudgetId": "string",
  "Amount": 100,
  "Currency": "USD",
  "Reference": "external_reference_123"
}'
Parameters
userIdpathintegerrequiredExample: 123
budgetIdpathstringrequiredExample: 123
Example request body
{
  "DestinationBudgetId": "string",
  "Amount": 100,
  "Currency": "USD",
  "Reference": "external_reference_123"
}
Response examples5 documented statuses
200OKUserBudgetTransferResponse
{
  "Success": true,
  "TransferId": "string",
  "SourceBudgetId": "string",
  "DestinationBudgetId": "string",
  "Currency": "USD",
  "Amount": "100.00",
  "Reference": "external_reference_123"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/banking/payeesList payees across all banking providersRequest & responses +
Request exampleGET /api/v2/banking/payees
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/banking/payees?Limit=1&Page=1&Currency=USD&SearchName=example&userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
LimitqueryintegeroptionalExample: 1
PagequeryintegeroptionalExample: 1
CurrencyquerystringoptionalExample: USD
SearchNamequerystringoptionalExample: example
userIdqueryintegeroptionalExample: 123
Response examples3 documented statuses
200OKUnifiedPayeesResponse
{
  "Payees": [
    {
      "PayeeId": 123,
      "Name": "string",
      "BankName": "string",
      "Currency": "USD",
      "AccountNumber": "string",
      "Iban": "string",
      "Status": "PENDING",
      "Providers": [
        "EqualsMoney"
      ],
      "ProviderRecords": [
        {
          "Provider": "EqualsMoney",
          "ExternalPayeeId": "external_reference_123",
          "LocalPayeeId": 123
        }
      ],
      "CreatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "Total": 1,
  "Page": 1,
  "Limit": 1
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/payeesPayee Step 1: validate a new payee and send the OTP required by Equals Money.Request & responses +

This endpoint does not create the payee immediately. Equals Money requires recipient OTP approval before creation.

Request examplePOST /api/v2/banking/payees
application/jsonSchema: CreatePayeeRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/payees?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "PaymentType": "COMPANY",
  "Currency": "USD",
  "Name": "string",
  "AccountNumber": "string",
  "Iban": "string",
  "Bic": "string",
  "BankCode": "string",
  "BankName": "string",
  "FirstName": "Jane",
  "LastName": "Doe",
  "RoutingCodeList": [
    {
      "RoutingCodeType": "string",
      "RoutingCodeValue": "string"
    }
  ],
  "routingCodes": [
    {
      "RoutingCodeType": "string",
      "RoutingCodeValue": "string"
    }
  ],
  "BankAddress": {
    "Country": "GB",
    "City": "London",
    "State": "string",
    "PostalCode": "SW1A 1AA",
    "AddressLine1": "string",
    "AddressLine2": "string"
  },
  "PayeeAddress": {
    "Country": "GB",
    "City": "London",
    "State": "string",
    "PostalCode": "SW1A 1AA",
    "AddressLine1": "string",
    "AddressLine2": "string"
  },
  "Comments": "string",
  "PaymentMethod": "SWIFT",
  "VerificationMethod": "string"
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "PaymentType": "COMPANY",
  "Currency": "USD",
  "Name": "string",
  "AccountNumber": "string",
  "Iban": "string",
  "Bic": "string",
  "BankCode": "string",
  "BankName": "string",
  "FirstName": "Jane",
  "LastName": "Doe",
  "RoutingCodeList": [
    {
      "RoutingCodeType": "string",
      "RoutingCodeValue": "string"
    }
  ],
  "routingCodes": [
    {
      "RoutingCodeType": "string",
      "RoutingCodeValue": "string"
    }
  ],
  "BankAddress": {
    "Country": "GB",
    "City": "London",
    "State": "string",
    "PostalCode": "SW1A 1AA",
    "AddressLine1": "string",
    "AddressLine2": "string"
  },
  "PayeeAddress": {
    "Country": "GB",
    "City": "London",
    "State": "string",
    "PostalCode": "SW1A 1AA",
    "AddressLine1": "string",
    "AddressLine2": "string"
  },
  "Comments": "string",
  "PaymentMethod": "SWIFT",
  "VerificationMethod": "string"
}
Response examples4 documented statuses
202AcceptedPayeeInitiateResponse
{
  "Success": true,
  "VerificationToken": "USDC",
  "Message": "string",
  "ExpiresAt": "2026-08-05T09:30:00Z",
  "RecipientName": "string",
  "AccountNumberLast4": "string",
  "VerificationResult": {
    "Status": "PENDING",
    "Title": "string",
    "Message": "string",
    "ReasonCode": "string",
    "NameMatch": true,
    "CanProceed": true
  }
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/payees/confirmPayee Step 2: create and confirm the payee after OTP verification.Request & responses +

Use the VerificationToken returned from POST /api/v2/banking/payees after it has been verified through POST /api/v2/banking/otp/verify.

Request examplePOST /api/v2/banking/payees/confirm
application/jsonSchema: PayeeConfirmRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/payees/confirm?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "VerificationToken": "USDC"
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "VerificationToken": "USDC"
}
Response examples5 documented statuses
201CreatedPayeeResponse
{
  "Id": 123,
  "ExternalId": "external_reference_123",
  "FirstName": "Jane",
  "LastName": "Doe",
  "UserName": "string",
  "PaymentType": "string",
  "PaymentMethod": "string",
  "Currency": "USD",
  "AccountNumber": "string",
  "BankName": "string",
  "RoutingCodeList": [
    {
      "RoutingCodeType": "string",
      "RoutingCodeValue": "string"
    }
  ],
  "routingCodes": [
    {
      "RoutingCodeType": "string",
      "RoutingCodeValue": "string"
    }
  ],
  "BankAddress": {
    "Country": "GB",
    "City": "London",
    "State": "string",
    "PostalCode": "SW1A 1AA",
    "AddressLine1": "string",
    "AddressLine2": "string"
  },
  "PayeeAddress": {
    "Country": "GB",
    "City": "London",
    "State": "string",
    "PostalCode": "SW1A 1AA",
    "AddressLine1": "string",
    "AddressLine2": "string"
  },
  "Comments": "string",
  "Provider": "string",
  "RequiresConfirmation": true,
  "Status": "PENDING",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/banking/payees/required-fieldsGet required fields for payee creationRequest & responses +
Request exampleGET /api/v2/banking/payees/required-fields
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/banking/payees/required-fields?PaymentType=example&Currency=USD&Country=GB' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
PaymentTypequerystringoptionalExample: example
CurrencyquerystringoptionalExample: USD
CountryquerystringoptionalExample: GB
Response examples2 documented statuses
200OKPayeeRequiredFieldsResponse
{
  "Data": [
    {
      "PaymentMethod": "SWIFT",
      "Fields": [
        {
          "FieldName": "string",
          "ValidationRules": [
            {}
          ]
        }
      ]
    }
  ]
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

DELETE/api/v2/banking/payees/{payeeId}Delete a payee from ALL banking providers where user has accountsRequest & responses +
Request exampleDELETE /api/v2/banking/payees/{payeeId}
No request body
curl --request DELETE 'https://staging.hoppa.global/api/v2/banking/payees/123?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
payeeIdpathintegerrequiredExample: 123
userIdqueryintegeroptionalExample: 123
Response examples5 documented statuses
200OKUnifiedPayeeDeleteResponse
{
  "Success": true,
  "Results": [
    {
      "Provider": "EqualsMoney",
      "Success": true,
      "ExternalPayeeId": "external_reference_123",
      "ErrorMessage": "string"
    }
  ]
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/quotationsPayout Step 1: create a quote for an existing payee.Request & responses +

Use this before external payouts. The returned Id is used as QuotationId in POST /api/v2/banking/payouts/check, and QuoteRequestId must be preserved for later payout steps when returned.

Request examplePOST /api/v2/banking/quotations
application/jsonSchema: DashboardQuotationRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/quotations?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "PayeeId": 123,
  "FromCurrency": "USD",
  "Amount": 100,
  "FeeMethod": "100.00",
  "BalanceId": "100.00"
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "PayeeId": 123,
  "FromCurrency": "USD",
  "Amount": 100,
  "FeeMethod": "100.00",
  "BalanceId": "100.00"
}
Response examples5 documented statuses
200OKQuotationResponse
{
  "IsAvailable": true,
  "UnavailableReason": "string",
  "RetryAfterSeconds": 1,
  "Id": "string",
  "QuoteRequestId": "string",
  "Rate": "string",
  "Fees": [
    {
      "Currency": "USD",
      "Amount": "100.00",
      "FeeType": 1
    }
  ],
  "ExpirationTime": "string",
  "CreateTime": "string"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/payouts/checkPayout Step 2: check the quoted payout before OTP approval.Request & responses +

Send the quote Id from POST /api/v2/banking/quotations as QuotationId. The returned CheckId is used in POST /api/v2/banking/payouts/initiate.

Request examplePOST /api/v2/banking/payouts/check
application/jsonSchema: CheckPayoutRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/payouts/check?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "PayeeId": 123,
  "QuotationId": "string",
  "Amount": "100.00",
  "Currency": "USD",
  "BalanceId": "100.00",
  "Memo": "Example description",
  "Reason": "string"
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "PayeeId": 123,
  "QuotationId": "string",
  "Amount": "100.00",
  "Currency": "USD",
  "BalanceId": "100.00",
  "Memo": "Example description",
  "Reason": "string"
}
Response examples5 documented statuses
200OKCheckPayoutResponse
{
  "CheckId": "string",
  "Pass": true,
  "DetailMessage": "string"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/payouts/initiatePayout Step 3: send the OTP for a checked payout.Request & responses +

Send the CheckId from POST /api/v2/banking/payouts/check. The VerificationToken returned here must be verified through POST /api/v2/banking/otp/verify before calling POST /api/v2/banking/payouts.

Request examplePOST /api/v2/banking/payouts/initiate
application/jsonSchema: InitiatePayoutRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/payouts/initiate?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "CheckId": "string",
  "PayeeId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "QuoteRequestId": "string",
  "FromCurrency": "USD",
  "BalanceId": "100.00"
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "CheckId": "string",
  "PayeeId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "QuoteRequestId": "string",
  "FromCurrency": "USD",
  "BalanceId": "100.00"
}
Response examples5 documented statuses
200OKPayoutInitiateResponse
{
  "Success": true,
  "VerificationToken": "USDC",
  "Message": "string",
  "ExpiresAt": "2026-08-05T09:30:00Z",
  "RecipientName": "string",
  "Amount": 100,
  "Currency": "USD"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/banking/payoutsList payout transactions for the authenticated user or API-key selected user.Request & responses +
Request exampleGET /api/v2/banking/payouts
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/banking/payouts?limit=10&page=1&currency=USD&clientTransactionId=123&userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
limitqueryintegeroptionalExample: 10
pagequeryintegeroptionalExample: 1
currencyquerystringoptionalExample: USD
clientTransactionIdquerystringoptionalExample: 123
userIdqueryintegeroptionalExample: 123
Response examples4 documented statuses
200OKPayoutListResponse
{
  "Total": 1,
  "List": [
    {
      "Id": 123,
      "ExternalId": "external_reference_123",
      "ClientTransactionId": "string",
      "BusinessId": "string",
      "BusinessTypeCode": 1,
      "BalanceId": "100.00",
      "PayeeId": 123,
      "FromAmount": "100.00",
      "FromCurrency": "USD",
      "ToAmount": "100.00",
      "ToCurrency": "USD",
      "Status": "PENDING",
      "Message": "string",
      "Refund": {
        "Amount": "100.00",
        "Currency": "USD"
      },
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z",
      "Fees": [
        {
          "Currency": "USD",
          "Amount": "100.00",
          "FeeType": 1
        }
      ]
    }
  ]
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/payoutsPayout Step 4: create the payout after OTP verification.Request & responses +

Use the VerificationToken returned from POST /api/v2/banking/payouts/initiate after it has been verified by POST /api/v2/banking/otp/verify. If the quote was refreshed while the OTP screen was open, pass the latest CheckId and QuoteRequestId.

Request examplePOST /api/v2/banking/payouts
application/jsonSchema: CreatePayoutRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/payouts?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "CheckId": "string",
  "PayeeId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "VerificationToken": "USDC",
  "QuoteRequestId": "string",
  "FromCurrency": "USD",
  "BalanceId": "100.00"
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "CheckId": "string",
  "PayeeId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "VerificationToken": "USDC",
  "QuoteRequestId": "string",
  "FromCurrency": "USD",
  "BalanceId": "100.00"
}
Response examples5 documented statuses
201CreatedCreatePayoutResponse
{
  "Id": 123,
  "ExternalId": "external_reference_123",
  "ClientTransactionId": "string",
  "Status": "PENDING",
  "Message": "string",
  "FromAmount": "100.00",
  "FromCurrency": "USD",
  "ToAmount": "100.00",
  "ToCurrency": "USD",
  "Fees": [
    {
      "Currency": "USD",
      "Amount": "100.00",
      "FeeType": 1
    }
  ],
  "CreatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/banking/payouts/{payoutId}Get a payout transaction by ID for the authenticated user or API-key selected user.Request & responses +
Request exampleGET /api/v2/banking/payouts/{payoutId}
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/banking/payouts/123?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
payoutIdpathintegerrequiredExample: 123
userIdqueryintegeroptionalExample: 123
Response examples5 documented statuses
200OKPayoutResponse
{
  "Id": 123,
  "ExternalId": "external_reference_123",
  "ClientTransactionId": "string",
  "BusinessId": "string",
  "BusinessTypeCode": 1,
  "BalanceId": "100.00",
  "PayeeId": 123,
  "FromAmount": "100.00",
  "FromCurrency": "USD",
  "ToAmount": "100.00",
  "ToCurrency": "USD",
  "Status": "PENDING",
  "Message": "string",
  "Refund": {
    "Amount": "100.00",
    "Currency": "USD"
  },
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "Fees": [
    {
      "Currency": "USD",
      "Amount": "100.00",
      "FeeType": 1
    }
  ]
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/otp/verifyVerify an OTP code for a pending banking operation such as payout creation.Request & responses +
Request examplePOST /api/v2/banking/otp/verify
application/jsonSchema: OtpVerifyRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/otp/verify?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "VerificationToken": "USDC",
  "OtpCode": "string"
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "VerificationToken": "USDC",
  "OtpCode": "string"
}
Response examples5 documented statuses
200OKOtpVerifyResponse
{
  "Success": true,
  "Message": "string",
  "ErrorCode": "string",
  "VerificationToken": "USDC",
  "RemainingAttempts": 1,
  "IsExpired": true,
  "IsLocked": true
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/otp/resendResend the OTP code for a pending banking operation.Request & responses +
Request examplePOST /api/v2/banking/otp/resend
application/jsonSchema: OtpResendRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/otp/resend?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "VerificationToken": "USDC"
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "VerificationToken": "USDC"
}
Response examples5 documented statuses
200OKOtpResendResponse
{
  "Success": true,
  "Message": "string",
  "ExpiresAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/transfers/internalExecute an internal transfer between balances for a specific user within the authenticated company.Request & responses +
Request examplePOST /api/v2/banking/transfers/internal
application/jsonSchema: UserInternalTransferRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/transfers/internal' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "SourceBalanceId": "100.00",
  "DestinationBalanceId": "100.00",
  "Amount": 100,
  "Currency": "USD",
  "Reference": "external_reference_123"
}'
Example request body
{
  "UserId": 123,
  "SourceBalanceId": "100.00",
  "DestinationBalanceId": "100.00",
  "Amount": 100,
  "Currency": "USD",
  "Reference": "external_reference_123"
}
Response examples5 documented statuses
201CreatedUnifiedTransferResponse
{
  "Success": true,
  "TransferId": "string",
  "Status": "PENDING",
  "Amount": 100,
  "Currency": "USD",
  "Provider": "EqualsMoney",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "ErrorMessage": "string"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/quotesGet a quote for a transferRequest & responses +
Request examplePOST /api/v2/banking/quotes
application/jsonSchema: UnifiedQuoteRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/quotes?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "SourceAccountId": "string",
  "PayeeId": 123,
  "Amount": 100,
  "SourceCurrency": "USD",
  "TargetCurrency": "USD"
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "SourceAccountId": "string",
  "PayeeId": 123,
  "Amount": 100,
  "SourceCurrency": "USD",
  "TargetCurrency": "USD"
}
Response examples3 documented statuses
200OKUnifiedQuoteResponse
{
  "QuoteId": "string",
  "SourceAmount": 100,
  "SourceCurrency": "USD",
  "TargetAmount": 100,
  "TargetCurrency": "USD",
  "ExchangeRate": 100,
  "Fee": 100,
  "Provider": "EqualsMoney",
  "ExpiresAt": "2026-08-05T09:30:00Z"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/orders/quoteOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/banking/orders/quote
application/jsonSchema: EqualsMoneyQuoteRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/orders/quote?accountId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "sourceCurrency": {
    "amount": 100,
    "currency": {
      "budgetId": "string",
      "currencyCode": "USD"
    }
  },
  "targetCurrency": {
    "amount": 100,
    "currency": {
      "budgetId": "string",
      "currencyCode": "USD"
    }
  },
  "settlementDate": "20260505",
  "type": {
    "from": "balance",
    "to": "payment",
    "recipientId": "string"
  }
}'
Parameters
accountIdquerystringoptionalExample: 123
Example request body
{
  "sourceCurrency": {
    "amount": 100,
    "currency": {
      "budgetId": "string",
      "currencyCode": "USD"
    }
  },
  "targetCurrency": {
    "amount": 100,
    "currency": {
      "budgetId": "string",
      "currencyCode": "USD"
    }
  },
  "settlementDate": "20260505",
  "type": {
    "from": "balance",
    "to": "payment",
    "recipientId": "string"
  }
}
Response examples5 documented statuses
200OKEqualsMoneyQuoteResponse
{
  "orderId": "string",
  "quoteRequestId": "string",
  "settlement": {
    "date": "2026-08-05",
    "price": {
      "amount": 100,
      "currency": "USD"
    },
    "charges": {
      "fee": 100,
      "margin": 100,
      "other": 100
    }
  },
  "quote": {
    "rate": 100,
    "inverseRate": 100,
    "fromGbpAmount": 100,
    "from": {
      "amount": 100,
      "currency": "USD"
    },
    "to": {
      "amount": 100,
      "currency": "USD"
    },
    "direction": 1
  }
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/orders/tradeOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/banking/orders/trade
application/jsonSchema: EqualsMoneyTradeRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/orders/trade?accountId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "orderId": "string",
  "quoteRequestId": "string",
  "moveMoneyRequestId": "string",
  "payments": {
    "amount": 100,
    "currency": {
      "budgetId": "string",
      "currencyCode": "USD"
    },
    "recipientId": "string",
    "internalReference": "external_reference_123",
    "externalReference": "external_reference_123"
  }
}'
Parameters
accountIdquerystringoptionalExample: 123
Example request body
{
  "orderId": "string",
  "quoteRequestId": "string",
  "moveMoneyRequestId": "string",
  "payments": {
    "amount": 100,
    "currency": {
      "budgetId": "string",
      "currencyCode": "USD"
    },
    "recipientId": "string",
    "internalReference": "external_reference_123",
    "externalReference": "external_reference_123"
  }
}
Response examples5 documented statuses
200OKEqualsMoneyTradeResponse
{
  "orderId": "string",
  "bank": "string",
  "settlement": {
    "date": "2026-08-05",
    "price": {
      "amount": 100,
      "currency": "USD"
    },
    "charges": {
      "fee": 100,
      "margin": 100,
      "other": 100
    }
  },
  "trade": {
    "rate": 100,
    "inverseRate": 100,
    "from": {
      "amount": 100,
      "currency": "USD"
    },
    "to": {
      "amount": 100,
      "currency": "USD"
    }
  }
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/budgets/{budgetId}/transferOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/banking/budgets/{budgetId}/transfer
application/jsonSchema: EqualsMoneyBudgetTransferRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/budgets/123/transfer?accountId=123&userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "destinationBudgetId": "string",
  "currency": "USD",
  "amount": "100.00",
  "reference": "external_reference_123"
}'
Parameters
budgetIdpathstringrequiredExample: 123
accountIdquerystringoptionalExample: 123
userIdqueryintegeroptionalExample: 123
Example request body
{
  "destinationBudgetId": "string",
  "currency": "USD",
  "amount": "100.00",
  "reference": "external_reference_123"
}
Response examples5 documented statuses
200OKEqualsMoneyTransferResponse
{
  "success": true,
  "debitBoxTransactionId": {},
  "creditBoxTransactionId": {}
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/trades/quoteGet FX trade quoteRequest & responses +
Request examplePOST /api/v2/banking/trades/quote
application/jsonSchema: UnifiedTradeQuoteRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/trades/quote?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "AccountId": "string",
  "BaseCurrency": "USD",
  "QuoteCurrency": "USD",
  "Amount": 100,
  "Side": "buy"
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "AccountId": "string",
  "BaseCurrency": "USD",
  "QuoteCurrency": "USD",
  "Amount": 100,
  "Side": "buy"
}
Response examples3 documented statuses
200OKUnifiedTradeQuoteResponse
{
  "QuoteId": "string",
  "BaseCurrency": "USD",
  "QuoteCurrency": "USD",
  "Amount": 100,
  "QuoteAmount": 100,
  "ExchangeRate": 100,
  "Provider": "EqualsMoney",
  "ExpiresAt": "2026-08-05T09:30:00Z"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/banking/trades/executeExecute FX tradeRequest & responses +
Request examplePOST /api/v2/banking/trades/execute
application/jsonSchema: UnifiedTradeExecuteRequest
curl --request POST 'https://staging.hoppa.global/api/v2/banking/trades/execute?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "QuoteId": "string",
  "AccountId": "string"
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "QuoteId": "string",
  "AccountId": "string"
}
Response examples4 documented statuses
201CreatedUnifiedTradeResponse
{
  "Success": true,
  "TradeId": "string",
  "Status": "PENDING",
  "Amount": 100,
  "ReceivedAmount": 100,
  "ExchangeRate": 100,
  "Provider": "EqualsMoney",
  "ExecutedAt": "2026-08-05T09:30:00Z",
  "ErrorMessage": "string"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/banking/providersGet list of banking providers the current user has accounts withRequest & responses +
Request exampleGET /api/v2/banking/providers
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/banking/providers?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
Response examples5 documented statuses
200OKapplication/json
[
  "string"
]
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

BusinessOnboarding8 operations
GET/api/v2/business/onboarding/optionsGet canonical EqualsMoney KYB onboarding option values for client select fields.Request & responses +
Request exampleGET /api/v2/business/onboarding/options
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/business/onboarding/options' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples2 documented statuses
200OKKybOnboardingOptionsResponse
{
  "Markets": [
    {
      "Key": "string",
      "Value": "string"
    }
  ],
  "BusinessTypes": [
    {
      "Key": "string",
      "Value": "string"
    }
  ],
  "EmployeeCounts": [
    {
      "Key": "string",
      "Value": "string"
    }
  ],
  "AssociationTypes": [
    {
      "Key": "string",
      "Value": "string"
    }
  ],
  "Industries": [
    {
      "SubIndustries": [
        {
          "Key": "string",
          "Value": "string"
        }
      ],
      "Key": "string",
      "Value": "string"
    }
  ],
  "RequestedFeatures": [
    {
      "Key": "string",
      "Value": "string"
    }
  ],
  "CardPurposes": [
    {
      "Key": "string",
      "Value": "string"
    }
  ],
  "CardEstimatedAnnualSpendRanges": [
    {
      "Key": "string",
      "Value": "string"
    }
  ],
  "CardCountRanges": [
    {
      "Key": "string",
      "Value": "string"
    }
  ]
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/business/onboarding/applicationGet the current application statusRequest & responses +
Request exampleGET /api/v2/business/onboarding/application
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/business/onboarding/application?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
Response examples4 documented statuses
200OKEqualsMoneyApplicationResponse
{
  "id": "string",
  "status": "PENDING",
  "accountId": "string",
  "market": "string",
  "type": "string",
  "createdAt": "2026-08-05T09:30:00Z",
  "updatedAt": "2026-08-05T09:30:00Z",
  "firstName": "Jane",
  "lastName": "Doe",
  "dob": "2026-08-05",
  "email": "user@example.com",
  "phoneNumber": "+447700900123",
  "nationalities": [
    "string"
  ],
  "identityDocumentNumber": "string",
  "taxId": "string",
  "countryOfIncorporation": "GB",
  "regionOfIncorporation": "string",
  "registeredName": "string",
  "registrationNumber": "string",
  "tradingNames": [
    "string"
  ],
  "businessOverview": "string",
  "industry": {
    "main": "string",
    "sub": "string"
  },
  "employeeCount": "string",
  "incorporationDate": "2026-08-05",
  "website": "string",
  "businessPromotionDescription": "Example description",
  "featureInformation": {
    "requestedFeatures": [
      "CARDS"
    ],
    "cardsInformation": {
      "purposes": [
        "SALARY_OR_INCOME"
      ],
      "estimatedAnnualSpend": "0-10000",
      "atmWithdrawalsRequired": true,
      "businessDisplayName": "string",
      "numberOfCardsRequired": "0-10",
      "cardsAreForEmployees": true
    },
    "paymentsInformation": {
      "purposes": [
        "SALARY_OR_INCOME"
      ],
      "estimatedPaymentCount": "FEWER-THAN-5",
      "estimatedPaymentVolume": "0-10000",
      "inboundCurrencies": [
        "AED"
      ],
      "outboundCurrencies": [
        "AED"
      ],
      "receivingCountries": [
        "AD"
      ],
      "sendingCountries": [
        "AD"
      ],
      "accountFundingSource": [
        "RECEIVING_FUNDS_FROM_OWN_ACCOUNTS"
      ]
    }
  },
  "addresses": [
    {
      "addressType": "REGISTERED",
      "streetName": "string",
      "postcode": "SW1A 1AA",
      "city": "London",
      "countryCode": "AD",
      "buildingNumber": "string",
      "buildingName": "string",
      "region": "string"
    }
  ],
  "associatedPeople": [
    {
      "associatedPersonId": "string",
      "associationType": "string",
      "jobTitle": "string",
      "ownershipPercentage": 1
    }
  ]
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/business/onboarding/applicationCreate a business application for KYBRequest & responses +
Request examplePOST /api/v2/business/onboarding/application
application/jsonSchema: CreateBusinessApplicationRequest
curl --request POST 'https://staging.hoppa.global/api/v2/business/onboarding/application?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "BusinessType": "PRIVATE_COMPANY",
  "CountryOfIncorporation": "AD",
  "RegisteredName": "string",
  "BusinessOverview": "string",
  "IndustryMain": "ACCOMMODATION_FOOD",
  "IndustrySub": "ACCOMMODATION",
  "EmployeeCount": "ONE_TO_TEN",
  "IncorporationDate": "2026-08-05",
  "Market": "UK",
  "RegionOfIncorporation": "string",
  "RegistrationNumber": "string",
  "TradingNames": [
    "string"
  ],
  "PhoneNumber": "+447700900123",
  "TaxId": "string",
  "Website": "string",
  "BusinessPromotionDescription": "Example description",
  "RequestedFeatures": [
    "CARDS"
  ],
  "CardsInformation": {
    "BusinessDisplayName": "string",
    "Purposes": [
      "ADVERTISING_AND_MARKETING"
    ],
    "EstimatedAnnualSpend": "0-10000",
    "NumberOfCardsRequired": "0-10",
    "CardsAreForEmployees": true,
    "AtmWithdrawalsRequired": true
  },
  "PaymentsInformation": {
    "Purposes": [
      "PAYING_SUPPLIERS"
    ],
    "AccountFundingSource": [
      "RECEIVING_FUNDS_FROM_OWN_ACCOUNTS"
    ],
    "EstimatedPaymentCount": "FEWER-THAN-5-PAYMENTS",
    "EstimatedPaymentVolume": "0-10000",
    "InboundCurrencies": [
      "AED"
    ],
    "OutboundCurrencies": [
      "AED"
    ],
    "ReceivingCountries": [
      "AD"
    ],
    "SendingCountries": [
      "AD"
    ]
  },
  "Addresses": [
    {
      "AddressType": "REGISTERED",
      "StreetName": "string",
      "Postcode": "SW1A 1AA",
      "City": "London",
      "CountryCode": "AD",
      "BuildingNumber": "string",
      "BuildingName": "string",
      "Region": "string"
    }
  ],
  "AssociatedPeople": [
    {
      "AssociatedPersonId": "string",
      "AssociationType": "APPLICANT",
      "JobTitle": "string",
      "OwnershipPercentage": 1
    }
  ]
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "BusinessType": "PRIVATE_COMPANY",
  "CountryOfIncorporation": "AD",
  "RegisteredName": "string",
  "BusinessOverview": "string",
  "IndustryMain": "ACCOMMODATION_FOOD",
  "IndustrySub": "ACCOMMODATION",
  "EmployeeCount": "ONE_TO_TEN",
  "IncorporationDate": "2026-08-05",
  "Market": "UK",
  "RegionOfIncorporation": "string",
  "RegistrationNumber": "string",
  "TradingNames": [
    "string"
  ],
  "PhoneNumber": "+447700900123",
  "TaxId": "string",
  "Website": "string",
  "BusinessPromotionDescription": "Example description",
  "RequestedFeatures": [
    "CARDS"
  ],
  "CardsInformation": {
    "BusinessDisplayName": "string",
    "Purposes": [
      "ADVERTISING_AND_MARKETING"
    ],
    "EstimatedAnnualSpend": "0-10000",
    "NumberOfCardsRequired": "0-10",
    "CardsAreForEmployees": true,
    "AtmWithdrawalsRequired": true
  },
  "PaymentsInformation": {
    "Purposes": [
      "PAYING_SUPPLIERS"
    ],
    "AccountFundingSource": [
      "RECEIVING_FUNDS_FROM_OWN_ACCOUNTS"
    ],
    "EstimatedPaymentCount": "FEWER-THAN-5-PAYMENTS",
    "EstimatedPaymentVolume": "0-10000",
    "InboundCurrencies": [
      "AED"
    ],
    "OutboundCurrencies": [
      "AED"
    ],
    "ReceivingCountries": [
      "AD"
    ],
    "SendingCountries": [
      "AD"
    ]
  },
  "Addresses": [
    {
      "AddressType": "REGISTERED",
      "StreetName": "string",
      "Postcode": "SW1A 1AA",
      "City": "London",
      "CountryCode": "AD",
      "BuildingNumber": "string",
      "BuildingName": "string",
      "Region": "string"
    }
  ],
  "AssociatedPeople": [
    {
      "AssociatedPersonId": "string",
      "AssociationType": "APPLICANT",
      "JobTitle": "string",
      "OwnershipPercentage": 1
    }
  ]
}
Response examples5 documented statuses
200OKEqualsMoneyApplicationResponse
{
  "id": "string",
  "status": "PENDING",
  "accountId": "string",
  "market": "string",
  "type": "string",
  "createdAt": "2026-08-05T09:30:00Z",
  "updatedAt": "2026-08-05T09:30:00Z",
  "firstName": "Jane",
  "lastName": "Doe",
  "dob": "2026-08-05",
  "email": "user@example.com",
  "phoneNumber": "+447700900123",
  "nationalities": [
    "string"
  ],
  "identityDocumentNumber": "string",
  "taxId": "string",
  "countryOfIncorporation": "GB",
  "regionOfIncorporation": "string",
  "registeredName": "string",
  "registrationNumber": "string",
  "tradingNames": [
    "string"
  ],
  "businessOverview": "string",
  "industry": {
    "main": "string",
    "sub": "string"
  },
  "employeeCount": "string",
  "incorporationDate": "2026-08-05",
  "website": "string",
  "businessPromotionDescription": "Example description",
  "featureInformation": {
    "requestedFeatures": [
      "CARDS"
    ],
    "cardsInformation": {
      "purposes": [
        "SALARY_OR_INCOME"
      ],
      "estimatedAnnualSpend": "0-10000",
      "atmWithdrawalsRequired": true,
      "businessDisplayName": "string",
      "numberOfCardsRequired": "0-10",
      "cardsAreForEmployees": true
    },
    "paymentsInformation": {
      "purposes": [
        "SALARY_OR_INCOME"
      ],
      "estimatedPaymentCount": "FEWER-THAN-5",
      "estimatedPaymentVolume": "0-10000",
      "inboundCurrencies": [
        "AED"
      ],
      "outboundCurrencies": [
        "AED"
      ],
      "receivingCountries": [
        "AD"
      ],
      "sendingCountries": [
        "AD"
      ],
      "accountFundingSource": [
        "RECEIVING_FUNDS_FROM_OWN_ACCOUNTS"
      ]
    }
  },
  "addresses": [
    {
      "addressType": "REGISTERED",
      "streetName": "string",
      "postcode": "SW1A 1AA",
      "city": "London",
      "countryCode": "AD",
      "buildingNumber": "string",
      "buildingName": "string",
      "region": "string"
    }
  ],
  "associatedPeople": [
    {
      "associatedPersonId": "string",
      "associationType": "string",
      "jobTitle": "string",
      "ownershipPercentage": 1
    }
  ]
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/business/onboarding/application/submitSubmit the application for reviewRequest & responses +
Request examplePOST /api/v2/business/onboarding/application/submit
No request body
curl --request POST 'https://staging.hoppa.global/api/v2/business/onboarding/application/submit?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
Response examples4 documented statuses
200OKEqualsMoneyApplicationResponse
{
  "id": "string",
  "status": "PENDING",
  "accountId": "string",
  "market": "string",
  "type": "string",
  "createdAt": "2026-08-05T09:30:00Z",
  "updatedAt": "2026-08-05T09:30:00Z",
  "firstName": "Jane",
  "lastName": "Doe",
  "dob": "2026-08-05",
  "email": "user@example.com",
  "phoneNumber": "+447700900123",
  "nationalities": [
    "string"
  ],
  "identityDocumentNumber": "string",
  "taxId": "string",
  "countryOfIncorporation": "GB",
  "regionOfIncorporation": "string",
  "registeredName": "string",
  "registrationNumber": "string",
  "tradingNames": [
    "string"
  ],
  "businessOverview": "string",
  "industry": {
    "main": "string",
    "sub": "string"
  },
  "employeeCount": "string",
  "incorporationDate": "2026-08-05",
  "website": "string",
  "businessPromotionDescription": "Example description",
  "featureInformation": {
    "requestedFeatures": [
      "CARDS"
    ],
    "cardsInformation": {
      "purposes": [
        "SALARY_OR_INCOME"
      ],
      "estimatedAnnualSpend": "0-10000",
      "atmWithdrawalsRequired": true,
      "businessDisplayName": "string",
      "numberOfCardsRequired": "0-10",
      "cardsAreForEmployees": true
    },
    "paymentsInformation": {
      "purposes": [
        "SALARY_OR_INCOME"
      ],
      "estimatedPaymentCount": "FEWER-THAN-5",
      "estimatedPaymentVolume": "0-10000",
      "inboundCurrencies": [
        "AED"
      ],
      "outboundCurrencies": [
        "AED"
      ],
      "receivingCountries": [
        "AD"
      ],
      "sendingCountries": [
        "AD"
      ],
      "accountFundingSource": [
        "RECEIVING_FUNDS_FROM_OWN_ACCOUNTS"
      ]
    }
  },
  "addresses": [
    {
      "addressType": "REGISTERED",
      "streetName": "string",
      "postcode": "SW1A 1AA",
      "city": "London",
      "countryCode": "AD",
      "buildingNumber": "string",
      "buildingName": "string",
      "region": "string"
    }
  ],
  "associatedPeople": [
    {
      "associatedPersonId": "string",
      "associationType": "string",
      "jobTitle": "string",
      "ownershipPercentage": 1
    }
  ]
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/business/onboarding/application/documentsUpload an EqualsMoney business onboarding documentRequest & responses +

Uploads one document for the authenticated user's active EqualsMoney business onboarding application. Standard business documents normally cover formation, ownership/control, registration, finances/funds, identity, address, and liveness where applicable. EqualsMoney may request further Enhanced Due Diligence (EDD) documents as onboarding progresses. Use `Purpose` to classify the file. Use `OTHER` for industry-specific EDD documents where no more specific proof category fits. ## Standard EDD documents that may be requested | Requirement area | Examples | | --- | --- | | Customer base | Overview of customer count, type, industries, and jurisdictions. | | Third-party funds | Names of third-party payers and the purpose of those payments. | | Beneficiaries | Key beneficiaries/payees and geographic locations. | | Source of funds | Latest audited financial statements, or 3 months corporate bank statements with 3 customer invoices, or eligible unaudited financial statements. | ## Industry-specific additional document requirements | Industry | Additional documents/evidence commonly required | | --- | --- | | Regulated financial services | FinCrime/AML policy, fraud policy, enterprise-wide risk assessment for MSBs, client risk assessment methodology, external AML audit, AML questionnaire for crypto/gaming/MSB/CFD, top clients list, regulatory licences. | | Investment funds | Funds questionnaire, PPM/OM or other offering documents, investor report where applicable, investment agreement, AML policy/procedures, AML comfort letter. | | Consultancy | Customer and beneficiary/supplier lists, serviced-industries confirmation, client sourcing explanation, customer-base breakdown, 3 months corporate bank statements, AML/CFT supervision status. | | Luxury yachts - management | Service confirmation, yacht owner details, yacht purchase/source-of-funds evidence or owner agreements, owner/client due diligence evidence, sanctions controls, cash payment thresholds. | | Luxury yachts - chartering/buying/selling | Yacht owner details, yacht purchase/source-of-funds evidence or owner agreements, due diligence policies for clients and yacht owners, sanctions controls, website yacht-list confirmation, cash payment thresholds. | | SEO/SCO/digital marketing/affiliate marketing | 3 customer invoices, 3 months corporate bank statements, customer-base overview, customer sourcing explanation, SEO tracking platform screenshots for SEO companies. | | Real estate | AML/CFT registration status, property ownership details, client/investor funds arrangements, third-party payer or beneficiary details, source of funds/source of wealth evidence, loan agreements, sale/reservation agreements, prospectus for real-estate investment funds. | | Maritime shipping | Vessel list, vessel ownership evidence, owner/yacht manager details, vessel activity monitoring documents, shipping manifest. | | Jewellery - lab-grown diamonds/watches | High-value dealer confirmation, AML policy/procedures if registered, revenue channel split, jurisdiction risk ratings, customer threshold breakdown, supplier list, additional products list. | | Jewellery - natural diamonds/gemstones | High-value dealer confirmation, AML policy/procedures, supplier due diligence, Kimberly Process confirmation, licences/memberships, Ethical Diamond Policy, Modern Slavery Policy, bank statements, supplier/client shipping invoices. | | Jewellery - gold/silver | High-value dealer confirmation, AML policy/procedures, supplier list, licences/memberships, Modern Slavery Policy, bank statements, supplier/client shipping invoices. | | Adult content and dating services | Modern Slavery Policy, website URLs, age verification evidence, user profile verification process, content monitoring/audit process, consent checks, payer/beneficiary lists, bank statements. | | Military and defence | Licence/permit to sell military goods, military/defence goods list, ECJU export licence where applicable, manufacturing/source details, banned goods confirmation, buyer due diligence. | | Weapons and firearms | Licences/permits, manufacturing details, 3 invoices and contractual agreements, buyer due diligence, under-18 controls, customer type confirmation. | | Cannabidiol products (CBD) | Supplier invoices, bank statements, Home Office/DEFRA licences where applicable, THC evidence, no medicinal claims evidence, GMP/EMA or Home Office evidence for medical CBD. | | Vaping/e-cigarettes/e-liquid sellers | Supplier list, 3 supplier invoices, wholesale shipping documents, bank statements with 3 client invoices, operating model, cash due diligence, THC/nicotine/liquid-volume confirmations. | | Mining | Jurisdiction licences/permits, Modern Slavery Policy, ABC policy, ESG policy, government/third-party agreements, onsite mining audit, project details, bank statements, supplier invoices. | | Dropshipping | Supplier/beneficiary list with websites, product and sale-jurisdiction details, 3 supplier invoices, supplier agreements, bank statements, wholesale customer-base breakdown, payment methods, dual-use goods policy. | | Art | High-value dealer and HMRC Art Market Participant status, AML policy/procedures where applicable, cash due diligence, crypto due diligence, sales/storage explanation, bank statements, artwork source. | | Trust/nominee/fiduciary ownership | Beneficial owner identity documents, trust deeds, nominee agreements or fiduciary service agreements, official documents for trustees/settlors/beneficiaries, legal rationale for structure. | | Aviation - spares/parts/repairs | Sourcing details, military aircraft confirmation, 3 supplier invoices, bank statements, licences/certifications, dual-use goods policy, plane ownership/source-of-funds evidence, due diligence policies, sanctions controls. | | Aviation - hire/chartering/selling planes | Plane owner details, plane purchase/source-of-funds evidence or owner agreements, airspace monitoring confirmation, client due diligence policies, sanctions controls, website plane-list confirmation. | | Portable electronics | Supplier/beneficiary list, 3 supplier invoices, wholesale shipping documents, bank statements with 3 client invoices, operating model, cash due diligence. |

Request examplePOST /api/v2/business/onboarding/application/documents
multipart/form-data
curl --request POST 'https://staging.hoppa.global/api/v2/business/onboarding/application/documents?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -F 'File=@/absolute/path/document.pdf' \
  -F 'Purpose=PROOF_OF_FORMATION'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "File": "<binary file>",
  "Purpose": "PROOF_OF_FORMATION"
}
Response examples5 documented statuses
200OKEqualsMoneyDocumentResponse
{
  "id": "string",
  "applicationId": "string",
  "associatedPersonId": "string",
  "purpose": "Example description",
  "createdAt": "2026-08-05T09:30:00Z",
  "updatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/business/onboarding/associated-peopleGet associated people for the current userRequest & responses +
Request exampleGET /api/v2/business/onboarding/associated-people
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/business/onboarding/associated-people?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
Response examples3 documented statuses
200OKapplication/json
[
  {
    "Id": 123,
    "ExternalId": "external_reference_123",
    "FirstName": "Jane",
    "LastName": "Doe",
    "Email": "user@example.com",
    "AssociationType": "string",
    "JobTitle": "string",
    "OwnershipPercentage": 1,
    "IdentityDocumentUploaded": true,
    "AddressDocumentUploaded": true,
    "CreatedAt": "2026-08-05T09:30:00Z"
  }
]
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/business/onboarding/associated-peopleCreate associated people for a business application (Directors, UBOs, Applicants)Request & responses +
Request examplePOST /api/v2/business/onboarding/associated-people
application/jsonSchema: CreateAssociatedPeopleRequest
curl --request POST 'https://staging.hoppa.global/api/v2/business/onboarding/associated-people?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "People": [
    {
      "firstName": "Jane",
      "lastName": "Doe",
      "dateOfBirth": "2026-08-05",
      "emailAddress": "user@example.com",
      "nationalities": [
        "string"
      ],
      "taxId": "string",
      "phoneNumber": "+447700900123",
      "address": {
        "addressLine1": "string",
        "townCity": "London",
        "postcode": "SW1A 1AA",
        "countryCode": "GB",
        "addressLine2": "string",
        "streetName": "string",
        "buildingNumber": "string",
        "buildingName": "string",
        "region": "string",
        "city": "London",
        "country": "GB",
        "address": "string"
      }
    }
  ]
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "People": [
    {
      "firstName": "Jane",
      "lastName": "Doe",
      "dateOfBirth": "2026-08-05",
      "emailAddress": "user@example.com",
      "nationalities": [
        "string"
      ],
      "taxId": "string",
      "phoneNumber": "+447700900123",
      "address": {
        "addressLine1": "string",
        "townCity": "London",
        "postcode": "SW1A 1AA",
        "countryCode": "GB",
        "addressLine2": "string",
        "streetName": "string",
        "buildingNumber": "string",
        "buildingName": "string",
        "region": "string",
        "city": "London",
        "country": "GB",
        "address": "string"
      }
    }
  ]
}
Response examples5 documented statuses
200OKapplication/json
[
  {
    "id": "string",
    "firstName": "Jane",
    "lastName": "Doe",
    "dateOfBirth": "2026-08-05",
    "emailAddress": "user@example.com",
    "nationalities": [
      "string"
    ],
    "taxId": "string",
    "phoneNumber": "+447700900123",
    "createdAt": "2026-08-05T09:30:00Z",
    "updatedAt": "2026-08-05T09:30:00Z"
  }
]
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/business/onboarding/associated-people/{associatedPersonId}/documentsUpload an EqualsMoney associated person onboarding documentRequest & responses +

Uploads one identity, address, or supporting document for an EqualsMoney associated person.

Request examplePOST /api/v2/business/onboarding/associated-people/{associatedPersonId}/documents
multipart/form-data
curl --request POST 'https://staging.hoppa.global/api/v2/business/onboarding/associated-people/123/documents?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -F 'File=@/absolute/path/document.pdf' \
  -F 'Purpose=PROOF_OF_IDENTITY'
Parameters
associatedPersonIdpathstringrequiredExample: 123
userIdqueryintegeroptionalExample: 123
Example request body
{
  "File": "<binary file>",
  "Purpose": "PROOF_OF_IDENTITY"
}
Response examples5 documented statuses
200OKEqualsMoneyDocumentResponse
{
  "id": "string",
  "applicationId": "string",
  "associatedPersonId": "string",
  "purpose": "Example description",
  "createdAt": "2026-08-05T09:30:00Z",
  "updatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

Card Loads2 operations
POST/api/v2/card-loads/cryptoConvert crypto through BoomFi and load the settled USD/EUR amount onto a BPay card.Request & responses +

The operation is asynchronous. Deposit crypto at the returned instruction, then poll GET /api/v2/card-loads/{id}?userId={userId} until status is completed or failed.

Request examplePOST /api/v2/card-loads/crypto
application/jsonSchema: CreateBoomFiBPayCardLoadRequest
curl --request POST 'https://staging.hoppa.global/api/v2/card-loads/crypto' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001' \
  -H 'Content-Type: application/json' \
  --data '{
  "CryptoCurrency": "USDC",
  "CryptoAmount": "100.00",
  "FiatCurrency": "USD",
  "UserId": 123,
  "CardId": 123,
  "ChainId": 123,
  "BoomFiAccountId": "string",
  "BoomFiAccountReference": "external_reference_123"
}'
Parameters
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Example request body
{
  "CryptoCurrency": "USDC",
  "CryptoAmount": "100.00",
  "FiatCurrency": "USD",
  "UserId": 123,
  "CardId": 123,
  "ChainId": 123,
  "BoomFiAccountId": "string",
  "BoomFiAccountReference": "external_reference_123"
}
Response examples3 documented statuses
202AcceptedBoomFiBPayCardLoadResponse
{
  "Id": 123,
  "Status": "PENDING",
  "UserId": 123,
  "CardId": 123,
  "CryptoCurrency": "USDC",
  "CryptoAmount": "100.00",
  "ChainId": 123,
  "FiatCurrency": "USD",
  "EstimatedFiatAmount": "100.00",
  "SettledFiatAmount": "100.00",
  "DepositInstruction": {
    "account_id": 123,
    "sub_account_id": 123,
    "chain_id": 123,
    "chain_name": "string",
    "currency": "USD",
    "address": "string"
  },
  "BoomFiOrderId": "string",
  "BoomFiOrderStatus": "PENDING",
  "BoomFiSettlementStatus": "PENDING",
  "BPayTransferId": "string",
  "FailureMessage": "string",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/card-loads/{id}Get the current BoomFi and BPay status for a crypto card load.Request & responses +
Request exampleGET /api/v2/card-loads/{id}
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/card-loads/123?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
idpathintegerrequiredExample: 123
userIdqueryintegeroptionalExample: 123
Response examples2 documented statuses
200OKBoomFiBPayCardLoadResponse
{
  "Id": 123,
  "Status": "PENDING",
  "UserId": 123,
  "CardId": 123,
  "CryptoCurrency": "USDC",
  "CryptoAmount": "100.00",
  "ChainId": 123,
  "FiatCurrency": "USD",
  "EstimatedFiatAmount": "100.00",
  "SettledFiatAmount": "100.00",
  "DepositInstruction": {
    "account_id": 123,
    "sub_account_id": 123,
    "chain_id": 123,
    "chain_name": "string",
    "currency": "USD",
    "address": "string"
  },
  "BoomFiOrderId": "string",
  "BoomFiOrderStatus": "PENDING",
  "BoomFiSettlementStatus": "PENDING",
  "BPayTransferId": "string",
  "FailureMessage": "string",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

Cards20 operations
GET/api/v2/cards/quantum-topup/estimateEstimate Quantum top-up conversion using CryptoConnect quotes for USD to USDT/USDC and USDT/USDC to USDRequest & responses +
Request exampleGET /api/v2/cards/quantum-topup/estimate
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/cards/quantum-topup/estimate?userId=123&amount=100' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
amountquerynumberoptionalExample: 100
Response examples5 documented statuses
200OKQuantumTopUpEstimateResponse
{
  "success": true,
  "message": "string",
  "usdAmount": 100,
  "usdToUsdt": {
    "baseCurrency": "USD",
    "quoteCurrency": "USD",
    "baseAmount": "100.00",
    "rfqAmount": "100.00",
    "rfqCurrency": "USD",
    "fee": "100.00",
    "feeCurrency": "USD",
    "rate": "string",
    "quoteId": "string",
    "quoteTime": "string",
    "ttlMs": "string"
  },
  "usdToUsdc": {
    "baseCurrency": "USD",
    "quoteCurrency": "USD",
    "baseAmount": "100.00",
    "rfqAmount": "100.00",
    "rfqCurrency": "USD",
    "fee": "100.00",
    "feeCurrency": "USD",
    "rate": "string",
    "quoteId": "string",
    "quoteTime": "string",
    "ttlMs": "string"
  },
  "usdtToUsd": {
    "baseCurrency": "USD",
    "quoteCurrency": "USD",
    "baseAmount": "100.00",
    "rfqAmount": "100.00",
    "rfqCurrency": "USD",
    "fee": "100.00",
    "feeCurrency": "USD",
    "rate": "string",
    "quoteId": "string",
    "quoteTime": "string",
    "ttlMs": "string"
  },
  "usdcToUsd": {
    "baseCurrency": "USD",
    "quoteCurrency": "USD",
    "baseAmount": "100.00",
    "rfqAmount": "100.00",
    "rfqCurrency": "USD",
    "fee": "100.00",
    "feeCurrency": "USD",
    "rate": "string",
    "quoteId": "string",
    "quoteTime": "string",
    "ttlMs": "string"
  },
  "usdt": {
    "baseCurrency": "USD",
    "quoteCurrency": "USD",
    "baseAmount": "100.00",
    "rfqAmount": "100.00",
    "rfqCurrency": "USD",
    "fee": "100.00",
    "feeCurrency": "USD",
    "rate": "string",
    "quoteId": "string",
    "quoteTime": "string",
    "ttlMs": "string"
  },
  "usdc": {
    "baseCurrency": "USD",
    "quoteCurrency": "USD",
    "baseAmount": "100.00",
    "rfqAmount": "100.00",
    "rfqCurrency": "USD",
    "fee": "100.00",
    "feeCurrency": "USD",
    "rate": "string",
    "quoteId": "string",
    "quoteTime": "string",
    "ttlMs": "string"
  },
  "topupfee": 100,
  "topupfeepercent": 100
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
403ForbiddenErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/cards/{cardId}/limitsUpdate card spending limits (daily/weekly/monthly) for a specific user and cardRequest & responses +
Request examplePUT /api/v2/cards/{cardId}/limits
application/jsonSchema: CardUpdateLimitsRequestV2
curl --request PUT 'https://staging.hoppa.global/api/v2/cards/123/limits?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Daily": 100,
  "Weekly": 100,
  "Monthly": 100
}'
Parameters
userIdqueryintegeroptionalExample: 123
cardIdpathintegerrequiredExample: 123
Example request body
{
  "Daily": 100,
  "Weekly": 100,
  "Monthly": 100
}
Response examples5 documented statuses
200OKCardUpdateLimitsResponseV2
{
  "Success": true,
  "Message": "string",
  "Daily": 100,
  "Weekly": 100,
  "Monthly": 100
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/cardsGet list of cards for a userRequest & responses +
Request exampleGET /api/v2/cards
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/cards?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
Response examples4 documented statuses
200OKCardListResponseV2
{
  "Cards": [
    {
      "Id": 123,
      "UserId": 123,
      "ExternalCardId": "external_reference_123",
      "DeliveryAddressId": "string",
      "Nickname": "string",
      "CardType": "string",
      "CardNumber": "string",
      "ExpiryDate": "2026-08-05",
      "Status": "PENDING",
      "Balance": {
        "Available": "string",
        "Pending": "string",
        "Frozen": "string",
        "Currency": "USD"
      },
      "Currency": "USD",
      "VelocityControl": {
        "Type": "string",
        "Limit": "string"
      },
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z",
      "CardTypeId": 123,
      "CardTypeTierId": 123,
      "TierId": 123,
      "AutoLockEnabled": true,
      "AutoLockActiveUntil": "2026-08-05T09:30:00Z",
      "TransakOrder": "string",
      "RequiredAmount": "100.00",
      "AvailableAmount": "100.00",
      "Shortfall": "string",
      "Message": "string",
      "Errors": [
        {
          "key": "string",
          "reason": "string"
        }
      ]
    }
  ],
  "Total": 1,
  "PageTotal": 1
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/cardsCreate a new cardRequest & responses +
Request examplePOST /api/v2/cards
application/jsonSchema: CardCreateV2
curl --request POST 'https://staging.hoppa.global/api/v2/cards' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "CardTypeId": 123,
  "Phone": "+447700900123",
  "ExternalCardId": "external_reference_123",
  "Nickname": "string",
  "Currency": "USD",
  "CardName": "string",
  "BudgetId": "string",
  "BillingAddress": {
    "Line1": "string",
    "Line2": "string",
    "City": "London",
    "State": "string",
    "Country": "GB",
    "PostalCode": "SW1A 1AA"
  },
  "DeliveryAddress": {
    "Line1": "string",
    "Line2": "string",
    "City": "London",
    "State": "string",
    "Country": "GB",
    "PostalCode": "SW1A 1AA"
  },
  "DeliveryAddressId": "string",
  "PhoneCode": "+447700900123",
  "DesignId": "string",
  "PhysicalCardDesignId": "string",
  "DiscountCode": "string",
  "AutoLockEnabled": true
}'
Example request body
{
  "UserId": 123,
  "CardTypeId": 123,
  "Phone": "+447700900123",
  "ExternalCardId": "external_reference_123",
  "Nickname": "string",
  "Currency": "USD",
  "CardName": "string",
  "BudgetId": "string",
  "BillingAddress": {
    "Line1": "string",
    "Line2": "string",
    "City": "London",
    "State": "string",
    "Country": "GB",
    "PostalCode": "SW1A 1AA"
  },
  "DeliveryAddress": {
    "Line1": "string",
    "Line2": "string",
    "City": "London",
    "State": "string",
    "Country": "GB",
    "PostalCode": "SW1A 1AA"
  },
  "DeliveryAddressId": "string",
  "PhoneCode": "+447700900123",
  "DesignId": "string",
  "PhysicalCardDesignId": "string",
  "DiscountCode": "string",
  "AutoLockEnabled": true
}
Response examples4 documented statuses
201CreatedCardResponseV2
{
  "Id": 123,
  "UserId": 123,
  "ExternalCardId": "external_reference_123",
  "DeliveryAddressId": "string",
  "Nickname": "string",
  "CardType": "string",
  "CardNumber": "string",
  "ExpiryDate": "2026-08-05",
  "Status": "PENDING",
  "Balance": {
    "Available": "string",
    "Pending": "string",
    "Frozen": "string",
    "Currency": "USD"
  },
  "Currency": "USD",
  "VelocityControl": {
    "Type": "string",
    "Limit": "string"
  },
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "CardTypeId": 123,
  "CardTypeTierId": 123,
  "TierId": 123,
  "AutoLockEnabled": true,
  "AutoLockActiveUntil": "2026-08-05T09:30:00Z",
  "TransakOrder": "string",
  "RequiredAmount": "100.00",
  "AvailableAmount": "100.00",
  "Shortfall": "string",
  "Message": "string",
  "Errors": [
    {
      "key": "string",
      "reason": "string"
    }
  ]
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/cards/physical-card-feesGet Interlace physical card production and mailing fees for a user and destination countryRequest & responses +
Request exampleGET /api/v2/cards/physical-card-fees
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/cards/physical-card-fees?userId=123&country=GB&cardTypeId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
countryquerystringoptionalExample: GB
cardTypeIdqueryintegeroptionalExample: 123
Response examples5 documented statuses
200OKCardPhysicalCardFeesResponseV2
{
  "Success": true,
  "UserId": 123,
  "AccountId": "string",
  "BinId": "string",
  "ExternalBinId": "external_reference_123",
  "Zone": "string",
  "Fees": [
    {
      "Amount": "100.00",
      "Currency": "USD",
      "FeeType": "100.00",
      "FeeTypeLabel": "100.00"
    }
  ],
  "Message": "string",
  "ErrorCode": "string"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/cards/{cardId}/bulk-ship/quoteQuote Interlace physical card shipment fees for the authenticated user's card.Request & responses +
Request exampleGET /api/v2/cards/{cardId}/bulk-ship/quote
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/cards/123/bulk-ship/quote?userId=0' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
cardIdpathintegerrequiredExample: 123
userIdqueryintegeroptionalExample: 0
Response examples4 documented statuses
200OKCardBulkShipResponseV2
{
  "Success": true,
  "CardId": 123,
  "UserId": 123,
  "ExternalCardId": "external_reference_123",
  "ShipmentExecuted": true,
  "Fees": [
    {
      "Amount": "100.00",
      "Currency": "USD",
      "FeeType": "100.00",
      "FeeTypeLabel": "100.00"
    }
  ],
  "FeeZone": "100.00",
  "FeeBinId": "100.00",
  "CustomerPaysForProduction": true,
  "CustomerPaysForShippment": true,
  "CustomerProductionAmount": "100.00",
  "CustomerShippingAmount": "100.00",
  "RequiredAmount": "100.00",
  "AvailableAmount": "100.00",
  "Shortfall": "string",
  "CardUnloadAttempted": true,
  "CardUnloadSucceeded": true,
  "CardUnloadAmount": "100.00",
  "TaskId": "string",
  "Status": "PENDING",
  "Message": "string",
  "ErrorCode": "string"
}
400Bad RequestCardBulkShipResponseV2
{
  "Success": true,
  "CardId": 123,
  "UserId": 123,
  "ExternalCardId": "external_reference_123",
  "ShipmentExecuted": true,
  "Fees": [
    {
      "Amount": "100.00",
      "Currency": "USD",
      "FeeType": "100.00",
      "FeeTypeLabel": "100.00"
    }
  ],
  "FeeZone": "100.00",
  "FeeBinId": "100.00",
  "CustomerPaysForProduction": true,
  "CustomerPaysForShippment": true,
  "CustomerProductionAmount": "100.00",
  "CustomerShippingAmount": "100.00",
  "RequiredAmount": "100.00",
  "AvailableAmount": "100.00",
  "Shortfall": "string",
  "CardUnloadAttempted": true,
  "CardUnloadSucceeded": true,
  "CardUnloadAmount": "100.00",
  "TaskId": "string",
  "Status": "PENDING",
  "Message": "string",
  "ErrorCode": "string"
}
401UnauthorizedProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
404Not FoundCardBulkShipResponseV2
{
  "Success": true,
  "CardId": 123,
  "UserId": 123,
  "ExternalCardId": "external_reference_123",
  "ShipmentExecuted": true,
  "Fees": [
    {
      "Amount": "100.00",
      "Currency": "USD",
      "FeeType": "100.00",
      "FeeTypeLabel": "100.00"
    }
  ],
  "FeeZone": "100.00",
  "FeeBinId": "100.00",
  "CustomerPaysForProduction": true,
  "CustomerPaysForShippment": true,
  "CustomerProductionAmount": "100.00",
  "CustomerShippingAmount": "100.00",
  "RequiredAmount": "100.00",
  "AvailableAmount": "100.00",
  "Shortfall": "string",
  "CardUnloadAttempted": true,
  "CardUnloadSucceeded": true,
  "CardUnloadAmount": "100.00",
  "TaskId": "string",
  "Status": "PENDING",
  "Message": "string",
  "ErrorCode": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/cards/{cardId}/bulk-ship/quoteQuote Interlace physical card shipment fees for the authenticated user's card.Request & responses +
Request examplePOST /api/v2/cards/{cardId}/bulk-ship/quote
No request body
curl --request POST 'https://staging.hoppa.global/api/v2/cards/123/bulk-ship/quote?userId=0' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
cardIdpathintegerrequiredExample: 123
userIdqueryintegeroptionalExample: 0
Response examples4 documented statuses
200OKCardBulkShipResponseV2
{
  "Success": true,
  "CardId": 123,
  "UserId": 123,
  "ExternalCardId": "external_reference_123",
  "ShipmentExecuted": true,
  "Fees": [
    {
      "Amount": "100.00",
      "Currency": "USD",
      "FeeType": "100.00",
      "FeeTypeLabel": "100.00"
    }
  ],
  "FeeZone": "100.00",
  "FeeBinId": "100.00",
  "CustomerPaysForProduction": true,
  "CustomerPaysForShippment": true,
  "CustomerProductionAmount": "100.00",
  "CustomerShippingAmount": "100.00",
  "RequiredAmount": "100.00",
  "AvailableAmount": "100.00",
  "Shortfall": "string",
  "CardUnloadAttempted": true,
  "CardUnloadSucceeded": true,
  "CardUnloadAmount": "100.00",
  "TaskId": "string",
  "Status": "PENDING",
  "Message": "string",
  "ErrorCode": "string"
}
400Bad RequestCardBulkShipResponseV2
{
  "Success": true,
  "CardId": 123,
  "UserId": 123,
  "ExternalCardId": "external_reference_123",
  "ShipmentExecuted": true,
  "Fees": [
    {
      "Amount": "100.00",
      "Currency": "USD",
      "FeeType": "100.00",
      "FeeTypeLabel": "100.00"
    }
  ],
  "FeeZone": "100.00",
  "FeeBinId": "100.00",
  "CustomerPaysForProduction": true,
  "CustomerPaysForShippment": true,
  "CustomerProductionAmount": "100.00",
  "CustomerShippingAmount": "100.00",
  "RequiredAmount": "100.00",
  "AvailableAmount": "100.00",
  "Shortfall": "string",
  "CardUnloadAttempted": true,
  "CardUnloadSucceeded": true,
  "CardUnloadAmount": "100.00",
  "TaskId": "string",
  "Status": "PENDING",
  "Message": "string",
  "ErrorCode": "string"
}
401UnauthorizedProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
404Not FoundCardBulkShipResponseV2
{
  "Success": true,
  "CardId": 123,
  "UserId": 123,
  "ExternalCardId": "external_reference_123",
  "ShipmentExecuted": true,
  "Fees": [
    {
      "Amount": "100.00",
      "Currency": "USD",
      "FeeType": "100.00",
      "FeeTypeLabel": "100.00"
    }
  ],
  "FeeZone": "100.00",
  "FeeBinId": "100.00",
  "CustomerPaysForProduction": true,
  "CustomerPaysForShippment": true,
  "CustomerProductionAmount": "100.00",
  "CustomerShippingAmount": "100.00",
  "RequiredAmount": "100.00",
  "AvailableAmount": "100.00",
  "Shortfall": "string",
  "CardUnloadAttempted": true,
  "CardUnloadSucceeded": true,
  "CardUnloadAmount": "100.00",
  "TaskId": "string",
  "Status": "PENDING",
  "Message": "string",
  "ErrorCode": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/cards/{cardId}/bulk-shipExecute Interlace physical card shipment for the authenticated user's card.Request & responses +
Request examplePOST /api/v2/cards/{cardId}/bulk-ship
No request body
curl --request POST 'https://staging.hoppa.global/api/v2/cards/123/bulk-ship?userId=0' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
cardIdpathintegerrequiredExample: 123
userIdqueryintegeroptionalExample: 0
Response examples4 documented statuses
200OKCardBulkShipResponseV2
{
  "Success": true,
  "CardId": 123,
  "UserId": 123,
  "ExternalCardId": "external_reference_123",
  "ShipmentExecuted": true,
  "Fees": [
    {
      "Amount": "100.00",
      "Currency": "USD",
      "FeeType": "100.00",
      "FeeTypeLabel": "100.00"
    }
  ],
  "FeeZone": "100.00",
  "FeeBinId": "100.00",
  "CustomerPaysForProduction": true,
  "CustomerPaysForShippment": true,
  "CustomerProductionAmount": "100.00",
  "CustomerShippingAmount": "100.00",
  "RequiredAmount": "100.00",
  "AvailableAmount": "100.00",
  "Shortfall": "string",
  "CardUnloadAttempted": true,
  "CardUnloadSucceeded": true,
  "CardUnloadAmount": "100.00",
  "TaskId": "string",
  "Status": "PENDING",
  "Message": "string",
  "ErrorCode": "string"
}
400Bad RequestCardBulkShipResponseV2
{
  "Success": true,
  "CardId": 123,
  "UserId": 123,
  "ExternalCardId": "external_reference_123",
  "ShipmentExecuted": true,
  "Fees": [
    {
      "Amount": "100.00",
      "Currency": "USD",
      "FeeType": "100.00",
      "FeeTypeLabel": "100.00"
    }
  ],
  "FeeZone": "100.00",
  "FeeBinId": "100.00",
  "CustomerPaysForProduction": true,
  "CustomerPaysForShippment": true,
  "CustomerProductionAmount": "100.00",
  "CustomerShippingAmount": "100.00",
  "RequiredAmount": "100.00",
  "AvailableAmount": "100.00",
  "Shortfall": "string",
  "CardUnloadAttempted": true,
  "CardUnloadSucceeded": true,
  "CardUnloadAmount": "100.00",
  "TaskId": "string",
  "Status": "PENDING",
  "Message": "string",
  "ErrorCode": "string"
}
401UnauthorizedProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
404Not FoundCardBulkShipResponseV2
{
  "Success": true,
  "CardId": 123,
  "UserId": 123,
  "ExternalCardId": "external_reference_123",
  "ShipmentExecuted": true,
  "Fees": [
    {
      "Amount": "100.00",
      "Currency": "USD",
      "FeeType": "100.00",
      "FeeTypeLabel": "100.00"
    }
  ],
  "FeeZone": "100.00",
  "FeeBinId": "100.00",
  "CustomerPaysForProduction": true,
  "CustomerPaysForShippment": true,
  "CustomerProductionAmount": "100.00",
  "CustomerShippingAmount": "100.00",
  "RequiredAmount": "100.00",
  "AvailableAmount": "100.00",
  "Shortfall": "string",
  "CardUnloadAttempted": true,
  "CardUnloadSucceeded": true,
  "CardUnloadAmount": "100.00",
  "TaskId": "string",
  "Status": "PENDING",
  "Message": "string",
  "ErrorCode": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/cards/cardHoldersGet list of card holders for a userRequest & responses +
Request exampleGET /api/v2/cards/cardHolders
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/cards/cardHolders?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
Response examples4 documented statuses
200OKapplication/json
[
  {
    "Id": 123,
    "UserId": 123,
    "CompanyId": 123,
    "AccountId": "string",
    "CardHolderId": "string",
    "BinRangeId": 123,
    "CardHolderStatus": "PENDING",
    "CreatedAt": "2026-08-05T09:30:00Z",
    "UpdatedAt": "2026-08-05T09:30:00Z"
  }
]
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/cards/{cardId}Get detailed card information including sensitive dataRequest & responses +
Request exampleGET /api/v2/cards/{cardId}
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/cards/123?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
cardIdpathintegerrequiredExample: 123
Response examples5 documented statuses
200OKCardDetailsResponseV2
{
  "CardNo": "string",
  "CVV": "string",
  "ExpYear": "string",
  "ExpMonth": "string",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "Id": 123,
  "UserId": 123,
  "ExternalCardId": "external_reference_123",
  "DeliveryAddressId": "string",
  "Nickname": "string",
  "CardType": "string",
  "CardNumber": "string",
  "ExpiryDate": "2026-08-05",
  "Status": "PENDING",
  "Balance": {
    "Available": "string",
    "Pending": "string",
    "Frozen": "string",
    "Currency": "USD"
  },
  "Currency": "USD",
  "VelocityControl": {
    "Type": "string",
    "Limit": "string"
  },
  "CardTypeId": 123,
  "CardTypeTierId": 123,
  "TierId": 123,
  "AutoLockEnabled": true,
  "AutoLockActiveUntil": "2026-08-05T09:30:00Z",
  "TransakOrder": "string",
  "RequiredAmount": "100.00",
  "AvailableAmount": "100.00",
  "Shortfall": "string",
  "Message": "string",
  "Errors": [
    {
      "key": "string",
      "reason": "string"
    }
  ]
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

DELETE/api/v2/cards/{cardId}Permanently delete an Interlace card.Request & responses +
Request exampleDELETE /api/v2/cards/{cardId}
No request body
curl --request DELETE 'https://staging.hoppa.global/api/v2/cards/123?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
cardIdpathintegerrequiredExample: 123
Response examples5 documented statuses
200OKCardDeleteResponseV2
{
  "Success": true,
  "Message": "string"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/cards/{cardId}/activateActivate a physical cardRequest & responses +
Request examplePOST /api/v2/cards/{cardId}/activate
No request body
curl --request POST 'https://staging.hoppa.global/api/v2/cards/123/activate?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
cardIdpathintegerrequiredExample: 123
Response examples5 documented statuses
200OKCardActivateResponseV2
{
  "Success": true,
  "Message": "string"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/cards/{cardId}/freezeFreeze a card to temporarily disable itRequest & responses +
Request examplePOST /api/v2/cards/{cardId}/freeze
No request body
curl --request POST 'https://staging.hoppa.global/api/v2/cards/123/freeze?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
cardIdpathintegerrequiredExample: 123
Response examples5 documented statuses
200OKCardFreezeResponseV2
{
  "Success": true,
  "Message": "string"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/cards/{cardId}/enableEnable (unfreeze) a card to re-enable itRequest & responses +
Request examplePOST /api/v2/cards/{cardId}/enable
No request body
curl --request POST 'https://staging.hoppa.global/api/v2/cards/123/enable?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
cardIdpathintegerrequiredExample: 123
Response examples5 documented statuses
200OKCardEnableResponseV2
{
  "Success": true,
  "Message": "string",
  "AutoLockActiveUntil": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/cards/{cardId}/auto-lockEnable or disable Auto Lock for a cardRequest & responses +
Request examplePUT /api/v2/cards/{cardId}/auto-lock
application/jsonSchema: CardAutoLockRequestV2
curl --request PUT 'https://staging.hoppa.global/api/v2/cards/123/auto-lock?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Enabled": true
}'
Parameters
userIdqueryintegeroptionalExample: 123
cardIdpathintegerrequiredExample: 123
Example request body
{
  "Enabled": true
}
Response examples5 documented statuses
200OKCardAutoLockResponseV2
{
  "Success": true,
  "Message": "string",
  "AutoLockEnabled": true,
  "AutoLockActiveUntil": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/cards/{cardId}/transactionsGet card transactions for a specific user and cardRequest & responses +
Request exampleGET /api/v2/cards/{cardId}/transactions
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/cards/123/transactions?userId=123&limit=25&page=1' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
cardIdpathintegerrequiredExample: 123
limitqueryintegeroptionalExample: 25
pagequeryintegeroptionalExample: 1
Response examples5 documented statuses
200OKCardTransactionsResponseV2
{
  "Transactions": [
    {
      "Id": "string",
      "AccountId": "string",
      "CardId": "string",
      "Currency": "USD",
      "Amount": 100,
      "Fee": 100,
      "Type": "string",
      "ClientTransactionId": "string",
      "Remark": "string",
      "Detail": "string",
      "Status": "PENDING",
      "TransactionTime": "2026-08-05T09:30:00Z",
      "TransactionCurrency": "USD",
      "TransactionAmount": 100,
      "MerchantName": "string",
      "Mcc": "string",
      "MccCategory": "string",
      "MerchantCity": "London",
      "MerchantCountry": "GB",
      "MerchantState": "string",
      "MerchantZipcode": "SW1A 1AA",
      "MerchantMid": "string"
    }
  ],
  "Total": 1,
  "PageTotal": 1,
  "CurrentPage": 1,
  "HasMorePages": true
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/cards/{cardId}/pinUpdate card PINRequest & responses +

**PIN Code Rules** 1. **Length** The PIN must be exactly 6 digits. 2. **No repeated digits** It must not contain any sequence of three identical digits. Not allowed: `111`, `222`, `999` 3. **No sequential digits** No three consecutive increasing or decreasing digits. Examples not allowed: `123`, `234`, `789`, `890`, `098`, `321`

Request examplePUT /api/v2/cards/{cardId}/pin
application/jsonSchema: CardUpdatePinRequestV2
curl --request PUT 'https://staging.hoppa.global/api/v2/cards/123/pin?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Pin": "246805"
}'
Parameters
userIdqueryintegeroptionalExample: 123
cardIdpathintegerrequiredExample: 123
Example request body
{
  "Pin": "246805"
}
Response examples5 documented statuses
200OKCardUpdatePinResponseV2
{
  "Success": true,
  "Message": "string"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/cards/topupTopUp - Direct card top-up with card IDRequest & responses +
Request examplePOST /api/v2/cards/topup
application/jsonSchema: TopUpRequest
curl --request POST 'https://staging.hoppa.global/api/v2/cards/topup' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "CardId": 123,
  "Token": "USDC",
  "Value": 100
}'
Example request body
{
  "CardId": 123,
  "Token": "USDC",
  "Value": 100
}
Response examples4 documented statuses
200OKTopUpResponse
{
  "Success": true,
  "TransakUrl": "https://example.com/callback",
  "OrderId": "string",
  "Token": "USDC",
  "Value": 100,
  "WalletAddress": "0x1111111111111111111111111111111111111111",
  "Message": "string",
  "ErrorCode": "string",
  "ErrorMessage": "string",
  "Fee": 100,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "Configuration": {
    "FiatCurrency": "USD",
    "CryptoCurrency": "USDC",
    "Network": "string",
    "MinAmount": 100,
    "MaxAmount": 100,
    "IsTestMode": true
  }
}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
401UnauthorizedProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
500Internal Server Errorapplication/json
{}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/cards/unload-cardUnloadFromCard - Unload funds from a card to quantum walletRequest & responses +
Request examplePOST /api/v2/cards/unload-card
application/jsonSchema: CardUnloadRequest
curl --request POST 'https://staging.hoppa.global/api/v2/cards/unload-card' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "CardId": 123,
  "Currency": "USD",
  "Value": 100
}'
Example request body
{
  "CardId": 123,
  "Currency": "USD",
  "Value": 100
}
Response examples4 documented statuses
200OKCardUnloadResponse
{
  "Success": true,
  "CardId": 123,
  "ExternalCardId": "external_reference_123",
  "RequestedAmount": 100,
  "ActualAmount": 100,
  "Fee": 100,
  "NetAmount": 100,
  "Currency": "USD",
  "Status": "PENDING",
  "TransactionId": "string",
  "ExternalTransactionId": "external_reference_123",
  "RequestedAt": "2026-08-05T09:30:00Z",
  "ProcessedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z",
  "Destination": {
    "Type": "string",
    "AccountNumber": "string",
    "WalletAddress": "0x1111111111111111111111111111111111111111",
    "BankName": "string",
    "RoutingNumber": "string",
    "SwiftCode": "string",
    "AccountHolderName": "string",
    "IsVerified": true
  },
  "BalanceAfter": {
    "AvailableBalance": 100,
    "PendingBalance": 100,
    "TotalBalance": 100,
    "Currency": "USD",
    "UpdatedAt": "2026-08-05T09:30:00Z"
  },
  "ErrorCode": "string",
  "ErrorMessage": "string",
  "Message": "string",
  "Audit": {
    "RequestedBy": "string",
    "RequestedAt": "2026-08-05T09:30:00Z",
    "RequestSource": "string",
    "IPAddress": "string",
    "UserAgent": "string",
    "IsSecureConnection": true,
    "AuthenticationMethod": "string",
    "AdditionalNotes": "string"
  }
}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
401UnauthorizedProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
500Internal Server Errorapplication/json
{}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/cards/{cardId}/widgetGet secure widget URL for displaying card details in an iframeRequest & responses +
Request exampleGET /api/v2/cards/{cardId}/widget
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/cards/123/widget?userId=123&verificationToken=USDC' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
verificationTokenquerystringoptionalExample: USDC
cardIdpathintegerrequiredExample: 123
Response examples5 documented statuses
200OKCardWidgetResponse
{
  "Success": true,
  "WidgetUrl": "https://example.com/callback",
  "WidgetToken": "USDC",
  "ExpiresIn": 1,
  "ErrorCode": "string",
  "ErrorMessage": "string",
  "CardId": 123,
  "Config": {
    "PrimaryColor": "string",
    "BackgroundColor": "string",
    "TextColor": "string",
    "Width": "string",
    "Height": "string"
  }
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

Crypto Virtual Accounts9 operations
GET/api/v2/crypto-virtual-accounts/trading-overviewOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/crypto-virtual-accounts/trading-overview
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/crypto-virtual-accounts/trading-overview?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
Response examples2 documented statuses
200OKBoomFiTradingOverview
{
  "account": {
    "id": 123,
    "reference": "external_reference_123",
    "name": "string",
    "account_type": "string",
    "enabled": true,
    "state": "string",
    "sub_accounts": [
      {
        "id": 123,
        "chain_id": 123,
        "address": "string",
        "chain": {
          "id": {},
          "name": {},
          "native_currency_symbol": {}
        },
        "state": "string",
        "status": "PENDING"
      }
    ]
  },
  "balances": {
    "balances": [
      {
        "account_id": 123,
        "chain": {
          "id": {},
          "name": {},
          "native_currency_symbol": {}
        },
        "currency": "USD",
        "token_address": "USDC",
        "amount": "100.00",
        "amount_billing_currency": "USD",
        "pending_amount": "100.00",
        "pending_amount_billing_currency": "USD"
      }
    ],
    "total_balance": "100.00"
  },
  "currencies": {},
  "settlement_accounts": [
    {
      "id": 123,
      "name": "string",
      "currency": "USD",
      "bank_name": "string",
      "account_number": "string",
      "account_number_hint": "string",
      "account_holder_name": "string",
      "country": "GB",
      "enabled": true,
      "state": "string",
      "status": "PENDING"
    }
  ]
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/crypto-virtual-accounts/swap-targetsOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/crypto-virtual-accounts/swap-targets
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/crypto-virtual-accounts/swap-targets?currency=USD&chainId=123&amount=100.00' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
currencyquerystringoptionalExample: USD
chainIdqueryintegeroptionalExample: 123
amountquerystringoptionalExample: 100.00
Response examples2 documented statuses
200OKapplication/json
[
  {
    "currency": "USD",
    "chain_id": 123
  }
]
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/crypto-virtual-accounts/settlement-accountsOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/crypto-virtual-accounts/settlement-accounts
application/jsonSchema: BoomFiCreateBankAddressBookRequest
curl --request POST 'https://staging.hoppa.global/api/v2/crypto-virtual-accounts/settlement-accounts' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "name": "string",
  "account_number": "string",
  "bank_name": "string",
  "account_holder_name": "string",
  "country": "GB",
  "currency": "USD"
}'
Example request body
{
  "name": "string",
  "account_number": "string",
  "bank_name": "string",
  "account_holder_name": "string",
  "country": "GB",
  "currency": "USD"
}
Response examples2 documented statuses
201CreatedBoomFiBankAddressBookAccount
{
  "id": 123,
  "name": "string",
  "currency": "USD",
  "bank_name": "string",
  "account_number": "string",
  "account_number_hint": "string",
  "account_holder_name": "string",
  "country": "GB",
  "enabled": true,
  "state": "string",
  "status": "PENDING"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/crypto-virtual-accountsOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/crypto-virtual-accounts
application/jsonSchema: PublicOpenCryptoVirtualAccountRequest
curl --request POST 'https://staging.hoppa.global/api/v2/crypto-virtual-accounts' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Name": "string",
  "Providers": [
    "boomfi"
  ],
  "Chains": [
    {
      "Currencies": [
        "string"
      ],
      "ChainId": 123
    }
  ],
  "UserId": 123
}'
Example request body
{
  "Name": "string",
  "Providers": [
    "boomfi"
  ],
  "Chains": [
    {
      "Currencies": [
        "string"
      ],
      "ChainId": 123
    }
  ],
  "UserId": 123
}
Response examples3 documented statuses
201CreatedOpenCryptoVirtualAccountResponse
{
  "Success": true,
  "Message": "string",
  "Results": [
    {
      "Provider": "string",
      "Status": "PENDING",
      "Reference": "external_reference_123",
      "Message": "string",
      "Account": {
        "id": 123,
        "name": "string",
        "address": "string",
        "chain_id": 123,
        "currencies": [
          {}
        ],
        "enabled": true,
        "created_at": "2026-08-05T09:30:00Z"
      },
      "Wallets": [
        {
          "Id": 123,
          "WalletAddress": "0x1111111111111111111111111111111111111111",
          "CryptoAsset": "string",
          "Status": "PENDING",
          "ExternalWalletId": "external_reference_123",
          "WalletType": "string"
        }
      ]
    }
  ]
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/crypto-virtual-accounts/payin-addressOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/crypto-virtual-accounts/payin-address
application/jsonSchema: PublicCreateCryptoDepositAddressRequest
curl --request POST 'https://staging.hoppa.global/api/v2/crypto-virtual-accounts/payin-address' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "crypto_currency": "USDC",
  "chain_id": 123,
  "userId": 123
}'
Example request body
{
  "crypto_currency": "USDC",
  "chain_id": 123,
  "userId": 123
}
Response examples3 documented statuses
201CreatedCreateCryptoDepositAddressResponse
{
  "DepositWallet": {},
  "OtcRequest": {
    "Id": 123,
    "Status": "PENDING",
    "BoomFiVirtualAccountId": "string",
    "CryptoCurrency": "USDC",
    "CryptoAmount": "100.00",
    "ChainId": 123,
    "FiatCurrency": "USD",
    "SettlementIban": "string",
    "SettlementAccountId": "string",
    "BoomFiOrderId": "string",
    "BoomFiQuoteId": "string",
    "BoomFiOrderStatus": "PENDING",
    "BoomFiSettlementStatus": "PENDING",
    "ToAmount": "100.00",
    "EffectiveRate": "string",
    "FailureMessage": "string",
    "SlackChannelId": "string",
    "SlackThreadTs": "string",
    "SlackPermalink": "string",
    "CompletedAt": "2026-08-05T09:30:00Z",
    "CompletionMessage": "string"
  }
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/crypto-virtual-accounts/equals-to-interlaceOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/crypto-virtual-accounts/equals-to-interlace
application/jsonSchema: PublicEqualsToInterlaceRequest
curl --request POST 'https://staging.hoppa.global/api/v2/crypto-virtual-accounts/equals-to-interlace' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "FiatCurrency": "USD",
  "Amount": 100,
  "BudgetId": "string"
}'
Example request body
{
  "UserId": 123,
  "FiatCurrency": "USD",
  "Amount": 100,
  "BudgetId": "string"
}
Response examples3 documented statuses
201CreatedPublicEqualsToInterlaceResponse
{
  "Success": true,
  "Message": "string",
  "Reference": "external_reference_123",
  "UserId": 123,
  "BudgetId": "string",
  "FiatCurrency": "USD",
  "FiatAmount": "100.00",
  "CryptoCurrency": "USDC",
  "EstimatedCryptoAmount": "100.00",
  "EstimatedFeeAmount": "100.00",
  "Rate": "string",
  "ChainId": 123,
  "Chain": "string",
  "DepositAddress": "string",
  "BoomFiPayout": {}
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/crypto-virtual-accounts/equals-to-wallet/initiateOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/crypto-virtual-accounts/equals-to-wallet/initiate
application/jsonSchema: PublicEqualsToWalletInitiateRequest
curl --request POST 'https://staging.hoppa.global/api/v2/crypto-virtual-accounts/equals-to-wallet/initiate' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "FiatCurrency": "USD",
  "Amount": 100,
  "BudgetId": "string",
  "CryptoCurrency": "USDC",
  "Chain": "string",
  "Address": "string"
}'
Example request body
{
  "UserId": 123,
  "FiatCurrency": "USD",
  "Amount": 100,
  "BudgetId": "string",
  "CryptoCurrency": "USDC",
  "Chain": "string",
  "Address": "string"
}
Response examples3 documented statuses
200OKPublicEqualsToWalletInitiateResponse
{
  "Success": true,
  "VerificationToken": "USDC",
  "Message": "string",
  "ExpiresAt": "2026-08-05T09:30:00Z",
  "Reference": "external_reference_123",
  "UserId": 123,
  "BudgetId": "string",
  "FiatCurrency": "USD",
  "FiatAmount": "100.00",
  "CryptoCurrency": "USDC",
  "EstimatedCryptoAmount": "100.00",
  "EstimatedFeeAmount": "100.00",
  "Rate": "string",
  "ChainId": 123,
  "Chain": "string",
  "DestinationAddress": "0x1111111111111111111111111111111111111111",
  "DestinationAddressMasked": "0x1111111111111111111111111111111111111111"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/crypto-virtual-accounts/equals-to-wallet/confirmOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/crypto-virtual-accounts/equals-to-wallet/confirm
application/jsonSchema: PublicEqualsToWalletConfirmRequest
curl --request POST 'https://staging.hoppa.global/api/v2/crypto-virtual-accounts/equals-to-wallet/confirm' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "VerificationToken": "USDC",
  "OtpCode": "string"
}'
Example request body
{
  "UserId": 123,
  "VerificationToken": "USDC",
  "OtpCode": "string"
}
Response examples3 documented statuses
200OKPublicEqualsToWalletConfirmResponse
{
  "Status": "PENDING",
  "Notice": "string",
  "Success": true,
  "VerificationToken": "USDC",
  "Message": "string",
  "ExpiresAt": "2026-08-05T09:30:00Z",
  "Reference": "external_reference_123",
  "UserId": 123,
  "BudgetId": "string",
  "FiatCurrency": "USD",
  "FiatAmount": "100.00",
  "CryptoCurrency": "USDC",
  "EstimatedCryptoAmount": "100.00",
  "EstimatedFeeAmount": "100.00",
  "Rate": "string",
  "ChainId": 123,
  "Chain": "string",
  "DestinationAddress": "0x1111111111111111111111111111111111111111",
  "DestinationAddressMasked": "0x1111111111111111111111111111111111111111"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/crypto-virtual-accounts/ramp-quoteOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/crypto-virtual-accounts/ramp-quote
application/jsonSchema: PublicBoomFiRampQuoteRequest
curl --request POST 'https://staging.hoppa.global/api/v2/crypto-virtual-accounts/ramp-quote' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "CryptoCurrency": "USDC",
  "FiatCurrency": "USD",
  "CryptoAmount": "100.00",
  "UserId": 123,
  "AccountId": "string",
  "AccountReference": "external_reference_123",
  "ChainId": 123
}'
Example request body
{
  "CryptoCurrency": "USDC",
  "FiatCurrency": "USD",
  "CryptoAmount": "100.00",
  "UserId": 123,
  "AccountId": "string",
  "AccountReference": "external_reference_123",
  "ChainId": 123
}
Response examples3 documented statuses
200OKBoomFiRampQuoteData
{
  "buy_currency": "USD",
  "buy_amount": "100.00",
  "sell_currency": "USD",
  "sell_amount": "100.00",
  "payment_method": "string",
  "quote_time": "2026-08-05T09:30:00Z",
  "expiry": "2026-08-05T09:30:00Z",
  "rate": "string",
  "fees": {
    "fee_ccy": "100.00",
    "network_fee": "100.00",
    "boomfi_fee": "100.00",
    "total_fee": "100.00"
  },
  "quote_amount": "100.00",
  "settlement_ccy": "string",
  "settlement_chain_id": 123,
  "settlement_token_address": "USDC",
  "session": "string"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

DiscountCodes6 operations
GET/api/v2/admin/discount-codesGets all discount codes for the authenticated user's companyadminRequest & responses +
Request exampleGET /api/v2/admin/discount-codes
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/admin/discount-codes?companyId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
companyIdqueryintegeroptionalExample: 123
Response examples1 documented status
200OKDiscountCodeListResponse
{
  "Codes": [
    {
      "Id": 123,
      "Code": "string",
      "Description": "Example description",
      "CompanyId": 123,
      "DiscountType": "string",
      "BuyDiscountPercent": 100,
      "MonthlyDiscountPercent": 100,
      "YearlyDiscountPercent": 100,
      "BuyDiscountFixed": 100,
      "MonthlyDiscountFixed": 100,
      "YearlyDiscountFixed": 100,
      "MaxUsesTotal": 1,
      "MaxUsesPerUser": 1,
      "CurrentUses": 1,
      "ValidFrom": "2026-08-05T09:30:00Z",
      "ValidTill": "2026-08-05T09:30:00Z",
      "ApplicableUserIds": [
        1
      ],
      "IsActive": true,
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z",
      "CreatedBy": 1
    }
  ],
  "Total": 1
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/admin/discount-codesCreates a new discount codeadminRequest & responses +
Request examplePOST /api/v2/admin/discount-codes
application/jsonSchema: CreateDiscountCodeRequest
curl --request POST 'https://staging.hoppa.global/api/v2/admin/discount-codes?companyId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Code": "string",
  "Description": "Example description",
  "DiscountType": "string",
  "BuyDiscountPercent": 100,
  "MonthlyDiscountPercent": 100,
  "YearlyDiscountPercent": 100,
  "BuyDiscountFixed": 100,
  "MonthlyDiscountFixed": 100,
  "YearlyDiscountFixed": 100,
  "MaxUsesTotal": 1,
  "MaxUsesPerUser": 1,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidTill": "2026-08-05T09:30:00Z",
  "ApplicableUserIds": [
    1
  ],
  "IsActive": true
}'
Parameters
companyIdqueryintegeroptionalExample: 123
Example request body
{
  "Code": "string",
  "Description": "Example description",
  "DiscountType": "string",
  "BuyDiscountPercent": 100,
  "MonthlyDiscountPercent": 100,
  "YearlyDiscountPercent": 100,
  "BuyDiscountFixed": 100,
  "MonthlyDiscountFixed": 100,
  "YearlyDiscountFixed": 100,
  "MaxUsesTotal": 1,
  "MaxUsesPerUser": 1,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidTill": "2026-08-05T09:30:00Z",
  "ApplicableUserIds": [
    1
  ],
  "IsActive": true
}
Response examples1 documented status
200OKDiscountCodeResponse
{
  "Id": 123,
  "Code": "string",
  "Description": "Example description",
  "CompanyId": 123,
  "DiscountType": "string",
  "BuyDiscountPercent": 100,
  "MonthlyDiscountPercent": 100,
  "YearlyDiscountPercent": 100,
  "BuyDiscountFixed": 100,
  "MonthlyDiscountFixed": 100,
  "YearlyDiscountFixed": 100,
  "MaxUsesTotal": 1,
  "MaxUsesPerUser": 1,
  "CurrentUses": 1,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidTill": "2026-08-05T09:30:00Z",
  "ApplicableUserIds": [
    1
  ],
  "IsActive": true,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "CreatedBy": 1
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/admin/discount-codes/{id}Gets a specific discount code by IDadminRequest & responses +
Request exampleGET /api/v2/admin/discount-codes/{id}
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/admin/discount-codes/123?companyId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
idpathintegerrequiredExample: 123
companyIdqueryintegeroptionalExample: 123
Response examples1 documented status
200OKDiscountCodeResponse
{
  "Id": 123,
  "Code": "string",
  "Description": "Example description",
  "CompanyId": 123,
  "DiscountType": "string",
  "BuyDiscountPercent": 100,
  "MonthlyDiscountPercent": 100,
  "YearlyDiscountPercent": 100,
  "BuyDiscountFixed": 100,
  "MonthlyDiscountFixed": 100,
  "YearlyDiscountFixed": 100,
  "MaxUsesTotal": 1,
  "MaxUsesPerUser": 1,
  "CurrentUses": 1,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidTill": "2026-08-05T09:30:00Z",
  "ApplicableUserIds": [
    1
  ],
  "IsActive": true,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "CreatedBy": 1
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/admin/discount-codes/{id}Updates an existing discount codeadminRequest & responses +
Request examplePUT /api/v2/admin/discount-codes/{id}
application/jsonSchema: UpdateDiscountCodeRequest
curl --request PUT 'https://staging.hoppa.global/api/v2/admin/discount-codes/123?companyId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Code": "string",
  "Description": "Example description",
  "DiscountType": "string",
  "BuyDiscountPercent": 100,
  "MonthlyDiscountPercent": 100,
  "YearlyDiscountPercent": 100,
  "BuyDiscountFixed": 100,
  "MonthlyDiscountFixed": 100,
  "YearlyDiscountFixed": 100,
  "MaxUsesTotal": 1,
  "MaxUsesPerUser": 1,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidTill": "2026-08-05T09:30:00Z",
  "ApplicableUserIds": [
    1
  ],
  "IsActive": true,
  "UpdateExistingCards": true
}'
Parameters
idpathintegerrequiredExample: 123
companyIdqueryintegeroptionalExample: 123
Example request body
{
  "Code": "string",
  "Description": "Example description",
  "DiscountType": "string",
  "BuyDiscountPercent": 100,
  "MonthlyDiscountPercent": 100,
  "YearlyDiscountPercent": 100,
  "BuyDiscountFixed": 100,
  "MonthlyDiscountFixed": 100,
  "YearlyDiscountFixed": 100,
  "MaxUsesTotal": 1,
  "MaxUsesPerUser": 1,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidTill": "2026-08-05T09:30:00Z",
  "ApplicableUserIds": [
    1
  ],
  "IsActive": true,
  "UpdateExistingCards": true
}
Response examples1 documented status
200OKDiscountCodeResponse
{
  "Id": 123,
  "Code": "string",
  "Description": "Example description",
  "CompanyId": 123,
  "DiscountType": "string",
  "BuyDiscountPercent": 100,
  "MonthlyDiscountPercent": 100,
  "YearlyDiscountPercent": 100,
  "BuyDiscountFixed": 100,
  "MonthlyDiscountFixed": 100,
  "YearlyDiscountFixed": 100,
  "MaxUsesTotal": 1,
  "MaxUsesPerUser": 1,
  "CurrentUses": 1,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidTill": "2026-08-05T09:30:00Z",
  "ApplicableUserIds": [
    1
  ],
  "IsActive": true,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "CreatedBy": 1
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

DELETE/api/v2/admin/discount-codes/{id}Deletes a discount codeadminRequest & responses +
Request exampleDELETE /api/v2/admin/discount-codes/{id}
No request body
curl --request DELETE 'https://staging.hoppa.global/api/v2/admin/discount-codes/123?companyId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
idpathintegerrequiredExample: 123
companyIdqueryintegeroptionalExample: 123
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/admin/discount-codes/cards/{cardId}/discountUpdates a card's discount code (for admin use)adminRequest & responses +
Request examplePUT /api/v2/admin/discount-codes/cards/{cardId}/discount
application/jsonSchema: UpdateCardDiscountRequest
curl --request PUT 'https://staging.hoppa.global/api/v2/admin/discount-codes/cards/123/discount?companyId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "DiscountCode": "string"
}'
Parameters
cardIdpathintegerrequiredExample: 123
companyIdqueryintegeroptionalExample: 123
Example request body
{
  "DiscountCode": "string"
}
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

DualBalance4 operations
GET/api/v2/dashboard/dual-balanceOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/dashboard/dual-balance
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/dashboard/dual-balance' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples1 documented status
200OKDualBalanceDashboardResponse
{
  "Enabled": true,
  "WhitelabelName": "string",
  "Status": "PENDING",
  "TotalUsd": 100,
  "AvailableUsd": 100,
  "LastUpdatedAt": "2026-08-05T09:30:00Z",
  "FundingEligible": true,
  "Message": "string",
  "Balances": [
    {
      "BalanceId": "100.00",
      "Type": "string",
      "Currency": "USD",
      "Balance": 100,
      "AvailableBalance": 100,
      "UsdValue": 100,
      "AvailableUsdValue": 100,
      "Timestamp": "2026-08-05T09:30:00Z"
    }
  ],
  "Cards": [
    {
      "CardId": 123,
      "Label": "string",
      "Currency": "USD"
    }
  ]
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/dashboard/dual-balance/card-funding/previewOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/dashboard/dual-balance/card-funding/preview
application/jsonSchema: DualBalanceFundingPreviewRequest
curl --request POST 'https://staging.hoppa.global/api/v2/dashboard/dual-balance/card-funding/preview' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "BalanceId": "100.00",
  "Amount": 100,
  "CardId": 123
}'
Example request body
{
  "BalanceId": "100.00",
  "Amount": 100,
  "CardId": 123
}
Response examples1 documented status
200OKDualBalanceFundingPreviewResponse
{
  "PreviewId": "00000000-0000-4000-8000-000000000123",
  "SourceCurrency": "USD",
  "SourceAmount": 100,
  "SourceDebitUsd": 100,
  "CardTopUpFeeUsd": 100,
  "ExpectedNetCardCreditUsd": 100,
  "MinimumUsd": 100,
  "MaximumUsd": 100,
  "ExpiresAt": "2026-08-05T09:30:00Z"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/dashboard/dual-balance/card-fundingOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/dashboard/dual-balance/card-funding
application/jsonSchema: DualBalanceFundingSubmitRequest
curl --request POST 'https://staging.hoppa.global/api/v2/dashboard/dual-balance/card-funding' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001' \
  -H 'Content-Type: application/json' \
  --data '{
  "PreviewId": "00000000-0000-4000-8000-000000000123"
}'
Parameters
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Example request body
{
  "PreviewId": "00000000-0000-4000-8000-000000000123"
}
Response examples1 documented status
202AcceptedDualBalanceFundingAcceptedResponse
{
  "RequestId": "00000000-0000-4000-8000-000000000123",
  "Status": "PENDING"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/dashboard/dual-balance/card-funding/{requestId}Open request and response documentationRequest & responses +
Request exampleGET /api/v2/dashboard/dual-balance/card-funding/{requestId}
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/dashboard/dual-balance/card-funding/00000000-0000-4000-8000-000000000123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
requestIdpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
Response examples1 documented status
200OKDualBalanceFundingStatusResponse
{
  "RequestId": "00000000-0000-4000-8000-000000000123",
  "Status": "PENDING",
  "SourceCurrency": "USD",
  "SourceAmount": 100,
  "SourceDebitUsd": 100,
  "CardTopUpFeeUsd": 100,
  "NetCardCreditUsd": 100,
  "CardId": 123,
  "InterlaceOperationId": "string",
  "CardLoadOperationId": "string",
  "ErrorCode": "string",
  "Message": "string",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

Loyalty Program61 operations
GET/api/loyalty-programs/programs/{companyId}Get loyalty programs for a specific company (legacy endpoint compatibility).legacyRequest & responses +
Request exampleGET /api/loyalty-programs/programs/{companyId}
No request body
curl --request GET 'https://staging.hoppa.global/api/loyalty-programs/programs/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
companyIdpathintegerrequiredExample: 123
Response examples3 documented statuses
200OKapplication/json
{}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
404Not FoundProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/loyalty-programs/auto-assign/stats/{loyaltyProgramId}Get point assignment statistics for a loyalty program (legacy endpoint compatibility).legacyRequest & responses +
Request exampleGET /api/loyalty-programs/auto-assign/stats/{loyaltyProgramId}
No request body
curl --request GET 'https://staging.hoppa.global/api/loyalty-programs/auto-assign/stats/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
loyaltyProgramIdpathintegerrequiredExample: 123
Response examples3 documented statuses
200OKapplication/json
{}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
404Not FoundProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/loyalty-programs/auto-assign/card-transactionProcess card transaction for automatic point assignment (legacy endpoint compatibility).legacyRequest & responses +
Request examplePOST /api/loyalty-programs/auto-assign/card-transaction
application/json
curl --request POST 'https://staging.hoppa.global/api/loyalty-programs/auto-assign/card-transaction' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{}'
Example request body
{}
Response examples2 documented statuses
200OKapplication/json
{}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/loyalty-programs/auto-assign/payment-requestProcess payment request for automatic point assignment (legacy endpoint compatibility).legacyRequest & responses +
Request examplePOST /api/loyalty-programs/auto-assign/payment-request
application/json
curl --request POST 'https://staging.hoppa.global/api/loyalty-programs/auto-assign/payment-request' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{}'
Example request body
{}
Response examples2 documented statuses
200OKapplication/json
{}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/loyalty-programs/auto-assign/bulkBulk process transactions for automatic point assignment (legacy endpoint compatibility).legacyRequest & responses +
Request examplePOST /api/loyalty-programs/auto-assign/bulk
application/json
curl --request POST 'https://staging.hoppa.global/api/loyalty-programs/auto-assign/bulk' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{}'
Example request body
{}
Response examples2 documented statuses
200OKapplication/json
{}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/loyalty-programs/auto-assign/reverseReverse point assignment (legacy endpoint compatibility).legacyRequest & responses +
Request examplePOST /api/loyalty-programs/auto-assign/reverse
application/json
curl --request POST 'https://staging.hoppa.global/api/loyalty-programs/auto-assign/reverse' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{}'
Example request body
{}
Response examples2 documented statuses
200OKapplication/json
{}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/loyalty-programs/transaction-import/configs/{companyId}Get transaction import configurations for a company (legacy endpoint compatibility).legacyRequest & responses +
Request exampleGET /api/loyalty-programs/transaction-import/configs/{companyId}
No request body
curl --request GET 'https://staging.hoppa.global/api/loyalty-programs/transaction-import/configs/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
companyIdpathintegerrequiredExample: 123
Response examples2 documented statuses
200OKapplication/json
[
  {}
]
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/loyalty-programs/transaction-import/jobs/{companyId}Get transaction import jobs for a company (legacy endpoint compatibility).legacyRequest & responses +
Request exampleGET /api/loyalty-programs/transaction-import/jobs/{companyId}
No request body
curl --request GET 'https://staging.hoppa.global/api/loyalty-programs/transaction-import/jobs/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
companyIdpathintegerrequiredExample: 123
Response examples2 documented statuses
200OKapplication/json
[
  {}
]
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/loyalty-programs/transaction-import/transactions/{jobId}Get imported transactions for a specific job (legacy endpoint compatibility).legacyRequest & responses +
Request exampleGET /api/loyalty-programs/transaction-import/transactions/{jobId}
No request body
curl --request GET 'https://staging.hoppa.global/api/loyalty-programs/transaction-import/transactions/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
jobIdpathintegerrequiredExample: 123
Response examples2 documented statuses
200OKapplication/json
[
  {}
]
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/loyalty-programs/transaction-import/configsCreate transaction import configuration (legacy endpoint compatibility).legacyRequest & responses +
Request examplePOST /api/loyalty-programs/transaction-import/configs
application/json
curl --request POST 'https://staging.hoppa.global/api/loyalty-programs/transaction-import/configs' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{}'
Example request body
{}
Response examples2 documented statuses
201Createdapplication/json
{}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/loyalty-programs/transaction-import/upload/{configId}Upload file for transaction import (legacy endpoint compatibility).legacyRequest & responses +
Request examplePOST /api/loyalty-programs/transaction-import/upload/{configId}
multipart/form-data
curl --request POST 'https://staging.hoppa.global/api/loyalty-programs/transaction-import/upload/123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -F 'File=@/absolute/path/document.pdf'
Parameters
configIdpathintegerrequiredExample: 123
Example request body
{
  "File": "<binary file>"
}
Response examples2 documented statuses
200OKapplication/json
{}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/loyalty-programs/merchantsGet merchants with filtering (legacy endpoint compatibility).legacyRequest & responses +
Request exampleGET /api/loyalty-programs/merchants
No request body
curl --request GET 'https://staging.hoppa.global/api/loyalty-programs/merchants?search=example&category=example&isActive=example&page=1&limit=50' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
searchquerystringoptionalExample: example
categoryquerystringoptionalExample: example
isActivequerystringoptionalExample: example
pagequeryintegeroptionalExample: 1
limitqueryintegeroptionalExample: 50
Response examples2 documented statuses
200OKapplication/json
{}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/loyalty-programs/merchantsCreate merchant (legacy endpoint compatibility).legacyRequest & responses +
Request examplePOST /api/loyalty-programs/merchants
application/json
curl --request POST 'https://staging.hoppa.global/api/loyalty-programs/merchants' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{}'
Example request body
{}
Response examples2 documented statuses
201Createdapplication/json
{}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/loyalty-programs/merchants/statsGet merchant statistics (legacy endpoint compatibility).legacyRequest & responses +
Request exampleGET /api/loyalty-programs/merchants/stats
No request body
curl --request GET 'https://staging.hoppa.global/api/loyalty-programs/merchants/stats' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples2 documented statuses
200OKapplication/json
{}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/loyalty-programs/merchants/{merchantId}/idsGet merchant IDs for a specific merchant (legacy endpoint compatibility).legacyRequest & responses +
Request exampleGET /api/loyalty-programs/merchants/{merchantId}/ids
No request body
curl --request GET 'https://staging.hoppa.global/api/loyalty-programs/merchants/123/ids' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
merchantIdpathintegerrequiredExample: 123
Response examples3 documented statuses
200OKapplication/json
{}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
404Not FoundProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/loyalty-programs/merchants/{merchantId}/idsAdd merchant ID (legacy endpoint compatibility).legacyRequest & responses +
Request examplePOST /api/loyalty-programs/merchants/{merchantId}/ids
application/json
curl --request POST 'https://staging.hoppa.global/api/loyalty-programs/merchants/123/ids' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{}'
Parameters
merchantIdpathintegerrequiredExample: 123
Example request body
{}
Response examples2 documented statuses
201Createdapplication/json
{}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/loyalty-programs/merchants/{merchantId}Update merchant (legacy endpoint compatibility).legacyRequest & responses +
Request examplePUT /api/loyalty-programs/merchants/{merchantId}
application/json
curl --request PUT 'https://staging.hoppa.global/api/loyalty-programs/merchants/123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{}'
Parameters
merchantIdpathintegerrequiredExample: 123
Example request body
{}
Response examples3 documented statuses
200OKapplication/json
{}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
404Not FoundProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

DELETE/api/loyalty-programs/merchants/{merchantId}Delete merchant (legacy endpoint compatibility).legacyRequest & responses +
Request exampleDELETE /api/loyalty-programs/merchants/{merchantId}
No request body
curl --request DELETE 'https://staging.hoppa.global/api/loyalty-programs/merchants/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
merchantIdpathintegerrequiredExample: 123
Response examples3 documented statuses
204No Contentapplication/json
{}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
404Not FoundProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/programsGet loyalty program configuration for the authenticated companyRequest & responses +
Request exampleGET /api/v2/loyalty/programs
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/programs' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples4 documented statuses
200OKLoyaltyProgramResponse
{
  "Id": 123,
  "Name": "string",
  "Description": "Example description",
  "IsActive": true,
  "PointValueRate": 100,
  "PointValueCurrency": "USD",
  "Rules": [
    {
      "Id": 123,
      "RuleName": "string",
      "RuleType": "string",
      "PointsPerUnit": 100,
      "MinTransactionAmount": 100,
      "MaxTransactionAmount": 100,
      "MerchantCategory": "string",
      "UserTier": "string",
      "Priority": 1,
      "IsActive": true,
      "ValidFrom": "2026-08-05T09:30:00Z",
      "ValidUntil": "2026-08-05T09:30:00Z",
      "Multiplier": 100,
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/loyalty/programsCreate or update loyalty program for the authenticated companyRequest & responses +
Request examplePOST /api/v2/loyalty/programs
application/jsonSchema: CreateLoyaltyProgramRequest
curl --request POST 'https://staging.hoppa.global/api/v2/loyalty/programs' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Name": "string",
  "PointValueRate": 100,
  "Description": "Example description",
  "IsActive": true,
  "PointValueCurrency": "USD"
}'
Example request body
{
  "Name": "string",
  "PointValueRate": 100,
  "Description": "Example description",
  "IsActive": true,
  "PointValueCurrency": "USD"
}
Response examples4 documented statuses
200OKLoyaltyProgramResponse
{
  "Id": 123,
  "Name": "string",
  "Description": "Example description",
  "IsActive": true,
  "PointValueRate": 100,
  "PointValueCurrency": "USD",
  "Rules": [
    {
      "Id": 123,
      "RuleName": "string",
      "RuleType": "string",
      "PointsPerUnit": 100,
      "MinTransactionAmount": 100,
      "MaxTransactionAmount": 100,
      "MerchantCategory": "string",
      "UserTier": "string",
      "Priority": 1,
      "IsActive": true,
      "ValidFrom": "2026-08-05T09:30:00Z",
      "ValidUntil": "2026-08-05T09:30:00Z",
      "Multiplier": 100,
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/loyalty/programsUpdate loyalty program for the authenticated companyRequest & responses +
Request examplePUT /api/v2/loyalty/programs
application/jsonSchema: UpdateLoyaltyProgramRequest
curl --request PUT 'https://staging.hoppa.global/api/v2/loyalty/programs' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Name": "string",
  "PointValueRate": 100,
  "Description": "Example description",
  "IsActive": true,
  "PointValueCurrency": "USD"
}'
Example request body
{
  "Name": "string",
  "PointValueRate": 100,
  "Description": "Example description",
  "IsActive": true,
  "PointValueCurrency": "USD"
}
Response examples5 documented statuses
200OKLoyaltyProgramResponse
{
  "Id": 123,
  "Name": "string",
  "Description": "Example description",
  "IsActive": true,
  "PointValueRate": 100,
  "PointValueCurrency": "USD",
  "Rules": [
    {
      "Id": 123,
      "RuleName": "string",
      "RuleType": "string",
      "PointsPerUnit": 100,
      "MinTransactionAmount": 100,
      "MaxTransactionAmount": 100,
      "MerchantCategory": "string",
      "UserTier": "string",
      "Priority": 1,
      "IsActive": true,
      "ValidFrom": "2026-08-05T09:30:00Z",
      "ValidUntil": "2026-08-05T09:30:00Z",
      "Multiplier": 100,
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/rulesGet all loyalty rules for the authenticated company's loyalty programRequest & responses +
Request exampleGET /api/v2/loyalty/rules
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/rules' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples3 documented statuses
200OKLoyaltyRulesResponse
{
  "Rules": [
    {
      "Id": 123,
      "RuleName": "string",
      "RuleType": "string",
      "PointsPerUnit": 100,
      "MinTransactionAmount": 100,
      "MaxTransactionAmount": 100,
      "MerchantCategory": "string",
      "UserTier": "string",
      "Priority": 1,
      "IsActive": true,
      "ValidFrom": "2026-08-05T09:30:00Z",
      "ValidUntil": "2026-08-05T09:30:00Z",
      "Multiplier": 100,
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "TotalCount": 1
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/loyalty/rulesCreate a new loyalty rule for the authenticated company's loyalty programRequest & responses +
Request examplePOST /api/v2/loyalty/rules
application/jsonSchema: CreateLoyaltyRuleRequest
curl --request POST 'https://staging.hoppa.global/api/v2/loyalty/rules' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "RuleName": "string",
  "RuleType": "string",
  "PointsPerUnit": 100,
  "MinTransactionAmount": 100,
  "MaxTransactionAmount": 100,
  "MerchantCategory": "string",
  "UserTier": "string",
  "Priority": 1,
  "IsActive": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "Multiplier": 100
}'
Example request body
{
  "RuleName": "string",
  "RuleType": "string",
  "PointsPerUnit": 100,
  "MinTransactionAmount": 100,
  "MaxTransactionAmount": 100,
  "MerchantCategory": "string",
  "UserTier": "string",
  "Priority": 1,
  "IsActive": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "Multiplier": 100
}
Response examples4 documented statuses
201CreatedLoyaltyRuleResponse
{
  "Id": 123,
  "RuleName": "string",
  "RuleType": "string",
  "PointsPerUnit": 100,
  "MinTransactionAmount": 100,
  "MaxTransactionAmount": 100,
  "MerchantCategory": "string",
  "UserTier": "string",
  "Priority": 1,
  "IsActive": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "Multiplier": 100,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/loyalty/rules/{ruleId}Update an existing loyalty ruleRequest & responses +
Request examplePUT /api/v2/loyalty/rules/{ruleId}
application/jsonSchema: UpdateLoyaltyRuleRequest
curl --request PUT 'https://staging.hoppa.global/api/v2/loyalty/rules/123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "RuleName": "string",
  "RuleType": "string",
  "PointsPerUnit": 100,
  "MinTransactionAmount": 100,
  "MaxTransactionAmount": 100,
  "MerchantCategory": "string",
  "UserTier": "string",
  "Priority": 1,
  "IsActive": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "Multiplier": 100
}'
Parameters
ruleIdpathintegerrequiredExample: 123
Example request body
{
  "RuleName": "string",
  "RuleType": "string",
  "PointsPerUnit": 100,
  "MinTransactionAmount": 100,
  "MaxTransactionAmount": 100,
  "MerchantCategory": "string",
  "UserTier": "string",
  "Priority": 1,
  "IsActive": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "Multiplier": 100
}
Response examples5 documented statuses
200OKLoyaltyRuleResponse
{
  "Id": 123,
  "RuleName": "string",
  "RuleType": "string",
  "PointsPerUnit": 100,
  "MinTransactionAmount": 100,
  "MaxTransactionAmount": 100,
  "MerchantCategory": "string",
  "UserTier": "string",
  "Priority": 1,
  "IsActive": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "Multiplier": 100,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

DELETE/api/v2/loyalty/rules/{ruleId}Delete a loyalty rule with referential integrity checksRequest & responses +
Request exampleDELETE /api/v2/loyalty/rules/{ruleId}
No request body
curl --request DELETE 'https://staging.hoppa.global/api/v2/loyalty/rules/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
ruleIdpathintegerrequiredExample: 123
Response examples5 documented statuses
204No Contentapplication/json
{}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
409ConflictErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/balancesGet point balances for all users (admin view)Request & responses +
Request exampleGET /api/v2/loyalty/balances
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/balances?limit=50&offset=0' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
limitqueryintegeroptionalExample: 50
offsetqueryintegeroptionalExample: 0
Response examples3 documented statuses
200OKapplication/json
[
  {
    "UserId": 123,
    "ProgramId": 123,
    "CurrentBalance": 1,
    "TotalEarned": 1,
    "TotalRedeemed": 1,
    "TierLevel": "string",
    "LastActivity": "2026-08-05T09:30:00Z",
    "EnrolledAt": "2026-08-05T09:30:00Z",
    "MonthlyStats": {
      "CurrentMonthEarned": 1,
      "PreviousMonthEarned": 1,
      "GrowthPercentage": 100,
      "TransactionCount": 1
    }
  }
]
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/transactionsGet point transactions for all users (admin view)Request & responses +
Request exampleGET /api/v2/loyalty/transactions
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/transactions?limit=50&offset=0&transactionType=example&startDate=2026-08-05T09%3A30%3A00Z&endDate=2026-08-05T09%3A30%3A00Z' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
limitqueryintegeroptionalExample: 50
offsetqueryintegeroptionalExample: 0
transactionTypequerystringoptionalExample: example
startDatequerystringoptionalExample: 2026-08-05T09:30:00Z
endDatequerystringoptionalExample: 2026-08-05T09:30:00Z
Response examples3 documented statuses
200OKapplication/json
[
  {
    "Id": 123,
    "TransactionType": "string",
    "Points": 1,
    "Description": "Example description",
    "Source": "string",
    "SourceTransactionId": "string",
    "CreatedAt": "2026-08-05T09:30:00Z",
    "ProcessedAt": "2026-08-05T09:30:00Z",
    "Metadata": {}
  }
]
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/user-balanceGet point balance for the authenticated userRequest & responses +
Request exampleGET /api/v2/loyalty/user-balance
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/user-balance' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples3 documented statuses
200OKUserPointBalanceResponse
{
  "UserId": 123,
  "ProgramId": 123,
  "CurrentBalance": 1,
  "TotalEarned": 1,
  "TotalRedeemed": 1,
  "TierLevel": "string",
  "LastActivity": "2026-08-05T09:30:00Z",
  "EnrolledAt": "2026-08-05T09:30:00Z",
  "MonthlyStats": {
    "CurrentMonthEarned": 1,
    "PreviousMonthEarned": 1,
    "GrowthPercentage": 100,
    "TransactionCount": 1
  }
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/user-transactionsGet point transaction history for the authenticated userRequest & responses +
Request exampleGET /api/v2/loyalty/user-transactions
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/user-transactions?limit=50&offset=0&transactionType=example&startDate=2026-08-05T09%3A30%3A00Z&endDate=2026-08-05T09%3A30%3A00Z' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
limitqueryintegeroptionalExample: 50
offsetqueryintegeroptionalExample: 0
transactionTypequerystringoptionalExample: example
startDatequerystringoptionalExample: 2026-08-05T09:30:00Z
endDatequerystringoptionalExample: 2026-08-05T09:30:00Z
Response examples3 documented statuses
200OKapplication/json
[
  {
    "Id": 123,
    "TransactionType": "string",
    "Points": 1,
    "Description": "Example description",
    "Source": "string",
    "SourceTransactionId": "string",
    "CreatedAt": "2026-08-05T09:30:00Z",
    "ProcessedAt": "2026-08-05T09:30:00Z",
    "Metadata": {}
  }
]
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/loyalty/test-calculationTest point calculation for a transactionRequest & responses +
Request examplePOST /api/v2/loyalty/test-calculation
application/jsonSchema: PointCalculationRequest
curl --request POST 'https://staging.hoppa.global/api/v2/loyalty/test-calculation' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Amount": 100,
  "Currency": "USD",
  "MerchantCategory": "string",
  "UserTier": "string",
  "TransactionTimestamp": "2026-08-05T09:30:00Z"
}'
Example request body
{
  "Amount": 100,
  "Currency": "USD",
  "MerchantCategory": "string",
  "UserTier": "string",
  "TransactionTimestamp": "2026-08-05T09:30:00Z"
}
Response examples4 documented statuses
200OKPointCalculationResponse
{
  "TotalPoints": 1,
  "TransactionAmount": 100,
  "Currency": "USD",
  "AppliedRules": [
    {
      "RuleId": 123,
      "RuleName": "string",
      "RuleType": "string",
      "PointsPerUnit": 100,
      "Multiplier": 100,
      "PointsEarned": 1,
      "Priority": 1
    }
  ],
  "Breakdown": {
    "BasePoints": 100,
    "BonusPoints": 100,
    "MultiplierBonus": 100,
    "AppliedConditions": [
      "string"
    ]
  }
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/transaction-import/configsGet all transaction import configurations for the authenticated companyRequest & responses +
Request exampleGET /api/v2/loyalty/transaction-import/configs
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/transaction-import/configs' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples3 documented statuses
200OKapplication/json
[
  {
    "Id": 123,
    "ConfigName": "string",
    "ImportMethod": "string",
    "FieldMappings": {},
    "IsActive": true,
    "CreatedAt": "2026-08-05T09:30:00Z",
    "UpdatedAt": "2026-08-05T09:30:00Z"
  }
]
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/loyalty/transaction-import/configsCreate a new transaction import configurationRequest & responses +
Request examplePOST /api/v2/loyalty/transaction-import/configs
application/jsonSchema: CreateTransactionImportConfigRequest
curl --request POST 'https://staging.hoppa.global/api/v2/loyalty/transaction-import/configs' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "ConfigName": "string",
  "ImportMethod": "string",
  "FieldMappings": {},
  "IsActive": true
}'
Example request body
{
  "ConfigName": "string",
  "ImportMethod": "string",
  "FieldMappings": {},
  "IsActive": true
}
Response examples4 documented statuses
201CreatedTransactionImportConfigResponse
{
  "Id": 123,
  "ConfigName": "string",
  "ImportMethod": "string",
  "FieldMappings": {},
  "IsActive": true,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/loyalty/transaction-import/upload/{configId}Upload and process a transaction import fileRequest & responses +
Request examplePOST /api/v2/loyalty/transaction-import/upload/{configId}
multipart/form-data
curl --request POST 'https://staging.hoppa.global/api/v2/loyalty/transaction-import/upload/123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -F 'File=@/absolute/path/document.pdf'
Parameters
configIdpathintegerrequiredExample: 123
Example request body
{
  "File": "<binary file>"
}
Response examples6 documented statuses
202AcceptedImportJobResponse
{
  "Id": 123,
  "Status": "PENDING",
  "FileName": "string",
  "TotalRecords": 1,
  "ProcessedRecords": 1,
  "SuccessfulRecords": 1,
  "FailedRecords": 1,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "StartedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z",
  "ErrorDetails": {}
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
413Payload Too LargeErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/transaction-import/jobsGet import job history with status and statisticsRequest & responses +
Request exampleGET /api/v2/loyalty/transaction-import/jobs
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/transaction-import/jobs?limit=50&offset=0' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
limitqueryintegeroptionalExample: 50
offsetqueryintegeroptionalExample: 0
Response examples3 documented statuses
200OKapplication/json
[
  {
    "Id": 123,
    "Status": "PENDING",
    "FileName": "string",
    "TotalRecords": 1,
    "ProcessedRecords": 1,
    "SuccessfulRecords": 1,
    "FailedRecords": 1,
    "CreatedAt": "2026-08-05T09:30:00Z",
    "StartedAt": "2026-08-05T09:30:00Z",
    "CompletedAt": "2026-08-05T09:30:00Z",
    "ErrorDetails": {}
  }
]
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/transaction-import/jobs/details/{jobId}Get detailed information about a specific import jobRequest & responses +
Request exampleGET /api/v2/loyalty/transaction-import/jobs/details/{jobId}
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/transaction-import/jobs/details/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
jobIdpathintegerrequiredExample: 123
Response examples4 documented statuses
200OKImportJobResponse
{
  "Id": 123,
  "Status": "PENDING",
  "FileName": "string",
  "TotalRecords": 1,
  "ProcessedRecords": 1,
  "SuccessfulRecords": 1,
  "FailedRecords": 1,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "StartedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z",
  "ErrorDetails": {}
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/merchantsGet merchants with search, filtering, and paginationRequest & responses +
Request exampleGET /api/v2/loyalty/merchants
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/merchants?search=example&category=example&isActive=true&isPartner=true&limit=50&offset=0' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
searchquerystringoptionalExample: example
categoryquerystringoptionalExample: example
isActivequerybooleanoptionalExample: true
isPartnerquerybooleanoptionalExample: true
limitqueryintegeroptionalExample: 50
offsetqueryintegeroptionalExample: 0
Response examples3 documented statuses
200OKMerchantListResponse
{
  "Merchants": [
    {
      "Id": 123,
      "Name": "string",
      "Description": "Example description",
      "Category": "string",
      "CompanyId": 123,
      "IsActive": true,
      "IsPartner": true,
      "ContactEmail": "user@example.com",
      "ContactPhone": "+447700900123",
      "Address": "string",
      "Website": "string",
      "MerchantIds": [
        {
          "Id": 123,
          "MerchantId": 123,
          "IdentifierType": "string",
          "IdentifierValue": "string",
          "Priority": 1,
          "IsActive": true,
          "CreatedAt": "2026-08-05T09:30:00Z",
          "UpdatedAt": "2026-08-05T09:30:00Z"
        }
      ],
      "LoyaltyRules": [
        {
          "Id": 123,
          "RuleName": "string",
          "PointsPerUnit": 100,
          "Multiplier": 100,
          "MinTransactionAmount": 100,
          "MaxTransactionAmount": 100,
          "IsActive": true,
          "ValidFrom": "2026-08-05T09:30:00Z",
          "ValidUntil": "2026-08-05T09:30:00Z",
          "CreatedAt": "2026-08-05T09:30:00Z",
          "UpdatedAt": "2026-08-05T09:30:00Z"
        }
      ],
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "Pagination": {
    "Total": 1,
    "PageNumber": 1,
    "PageSize": 1,
    "TotalPages": 1
  }
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/loyalty/merchantsCreate a new merchant for the authenticated companyRequest & responses +
Request examplePOST /api/v2/loyalty/merchants
application/jsonSchema: CreateMerchantRequest
curl --request POST 'https://staging.hoppa.global/api/v2/loyalty/merchants' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Name": "string",
  "Description": "Example description",
  "Category": "string",
  "IsActive": true,
  "IsPartner": true,
  "ContactEmail": "user@example.com",
  "ContactPhone": "+447700900123",
  "Address": "string",
  "Website": "string"
}'
Example request body
{
  "Name": "string",
  "Description": "Example description",
  "Category": "string",
  "IsActive": true,
  "IsPartner": true,
  "ContactEmail": "user@example.com",
  "ContactPhone": "+447700900123",
  "Address": "string",
  "Website": "string"
}
Response examples4 documented statuses
201CreatedMerchantResponse
{
  "Id": 123,
  "Name": "string",
  "Description": "Example description",
  "Category": "string",
  "CompanyId": 123,
  "IsActive": true,
  "IsPartner": true,
  "ContactEmail": "user@example.com",
  "ContactPhone": "+447700900123",
  "Address": "string",
  "Website": "string",
  "MerchantIds": [
    {
      "Id": 123,
      "MerchantId": 123,
      "IdentifierType": "string",
      "IdentifierValue": "string",
      "Priority": 1,
      "IsActive": true,
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "LoyaltyRules": [
    {
      "Id": 123,
      "RuleName": "string",
      "PointsPerUnit": 100,
      "Multiplier": 100,
      "MinTransactionAmount": 100,
      "MaxTransactionAmount": 100,
      "IsActive": true,
      "ValidFrom": "2026-08-05T09:30:00Z",
      "ValidUntil": "2026-08-05T09:30:00Z",
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/loyalty/merchants/{merchantId}Update an existing merchantRequest & responses +
Request examplePUT /api/v2/loyalty/merchants/{merchantId}
application/jsonSchema: UpdateMerchantRequest
curl --request PUT 'https://staging.hoppa.global/api/v2/loyalty/merchants/123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Name": "string",
  "Description": "Example description",
  "Category": "string",
  "IsActive": true,
  "IsPartner": true,
  "ContactEmail": "user@example.com",
  "ContactPhone": "+447700900123",
  "Address": "string",
  "Website": "string"
}'
Parameters
merchantIdpathintegerrequiredExample: 123
Example request body
{
  "Name": "string",
  "Description": "Example description",
  "Category": "string",
  "IsActive": true,
  "IsPartner": true,
  "ContactEmail": "user@example.com",
  "ContactPhone": "+447700900123",
  "Address": "string",
  "Website": "string"
}
Response examples5 documented statuses
200OKMerchantResponse
{
  "Id": 123,
  "Name": "string",
  "Description": "Example description",
  "Category": "string",
  "CompanyId": 123,
  "IsActive": true,
  "IsPartner": true,
  "ContactEmail": "user@example.com",
  "ContactPhone": "+447700900123",
  "Address": "string",
  "Website": "string",
  "MerchantIds": [
    {
      "Id": 123,
      "MerchantId": 123,
      "IdentifierType": "string",
      "IdentifierValue": "string",
      "Priority": 1,
      "IsActive": true,
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "LoyaltyRules": [
    {
      "Id": 123,
      "RuleName": "string",
      "PointsPerUnit": 100,
      "Multiplier": 100,
      "MinTransactionAmount": 100,
      "MaxTransactionAmount": 100,
      "IsActive": true,
      "ValidFrom": "2026-08-05T09:30:00Z",
      "ValidUntil": "2026-08-05T09:30:00Z",
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

DELETE/api/v2/loyalty/merchants/{merchantId}Delete a merchant with cascade validationRequest & responses +
Request exampleDELETE /api/v2/loyalty/merchants/{merchantId}
No request body
curl --request DELETE 'https://staging.hoppa.global/api/v2/loyalty/merchants/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
merchantIdpathintegerrequiredExample: 123
Response examples5 documented statuses
204No Contentapplication/json
{}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
409ConflictErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/merchants/statsGet merchant statistics including transaction counts and revenue metricsRequest & responses +
Request exampleGET /api/v2/loyalty/merchants/stats
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/merchants/stats?period=30d' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
periodquerystringoptionalExample: 30d
Response examples3 documented statuses
200OKMerchantStatsResponse
{
  "TotalMerchants": 1,
  "ActiveMerchants": 1,
  "InactiveMerchants": 1,
  "PartnerMerchants": 1,
  "TotalTransactions": 1,
  "TotalRevenue": 100,
  "AverageTransactionValue": 100,
  "CategoryStats": [
    {
      "Category": "string",
      "MerchantCount": 1,
      "Percentage": 100
    }
  ],
  "TopMerchants": [
    {
      "MerchantId": 123,
      "Name": "string",
      "Category": "string",
      "TransactionCount": 1,
      "Revenue": 100,
      "PointsAwarded": 1
    }
  ],
  "TopCategories": [
    {
      "Category": "string",
      "MerchantCount": 1,
      "TransactionCount": 1,
      "Revenue": 100
    }
  ],
  "Period": "string",
  "StartDate": "2026-08-05T09:30:00Z",
  "EndDate": "2026-08-05T09:30:00Z",
  "GeneratedAt": "2026-08-05T09:30:00Z"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/merchants/{merchantId}/idsGet merchant IDs for a specific merchantRequest & responses +
Request exampleGET /api/v2/loyalty/merchants/{merchantId}/ids
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/merchants/123/ids' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
merchantIdpathintegerrequiredExample: 123
Response examples4 documented statuses
200OKapplication/json
[
  {
    "Id": 123,
    "MerchantId": 123,
    "IdentifierType": "string",
    "IdentifierValue": "string",
    "Priority": 1,
    "IsActive": true,
    "CreatedAt": "2026-08-05T09:30:00Z",
    "UpdatedAt": "2026-08-05T09:30:00Z"
  }
]
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/loyalty/merchants/{merchantId}/idsCreate a new merchant ID for a specific merchantRequest & responses +
Request examplePOST /api/v2/loyalty/merchants/{merchantId}/ids
application/jsonSchema: CreateMerchantIdRequest
curl --request POST 'https://staging.hoppa.global/api/v2/loyalty/merchants/123/ids' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "IdentifierType": "string",
  "IdentifierValue": "string",
  "Priority": 1,
  "IsActive": true
}'
Parameters
merchantIdpathintegerrequiredExample: 123
Example request body
{
  "IdentifierType": "string",
  "IdentifierValue": "string",
  "Priority": 1,
  "IsActive": true
}
Response examples5 documented statuses
201CreatedMerchantIdResponse
{
  "Id": 123,
  "MerchantId": 123,
  "IdentifierType": "string",
  "IdentifierValue": "string",
  "Priority": 1,
  "IsActive": true,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/loyalty/merchants/{merchantId}/ids/{midId}Update an existing merchant IDRequest & responses +
Request examplePUT /api/v2/loyalty/merchants/{merchantId}/ids/{midId}
application/jsonSchema: UpdateMerchantIdRequest
curl --request PUT 'https://staging.hoppa.global/api/v2/loyalty/merchants/123/ids/123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "IdentifierType": "string",
  "IdentifierValue": "string",
  "Priority": 1,
  "IsActive": true
}'
Parameters
merchantIdpathintegerrequiredExample: 123
midIdpathintegerrequiredExample: 123
Example request body
{
  "IdentifierType": "string",
  "IdentifierValue": "string",
  "Priority": 1,
  "IsActive": true
}
Response examples5 documented statuses
200OKMerchantIdResponse
{
  "Id": 123,
  "MerchantId": 123,
  "IdentifierType": "string",
  "IdentifierValue": "string",
  "Priority": 1,
  "IsActive": true,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

DELETE/api/v2/loyalty/merchants/{merchantId}/ids/{midId}Delete a merchant IDRequest & responses +
Request exampleDELETE /api/v2/loyalty/merchants/{merchantId}/ids/{midId}
No request body
curl --request DELETE 'https://staging.hoppa.global/api/v2/loyalty/merchants/123/ids/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
merchantIdpathintegerrequiredExample: 123
midIdpathintegerrequiredExample: 123
Response examples4 documented statuses
204No Contentapplication/json
{}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/merchants/{merchantId}/loyalty-rulesGet merchant loyalty rules for a specific merchantRequest & responses +
Request exampleGET /api/v2/loyalty/merchants/{merchantId}/loyalty-rules
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/merchants/123/loyalty-rules' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
merchantIdpathintegerrequiredExample: 123
Response examples4 documented statuses
200OKapplication/json
[
  {
    "Id": 123,
    "RuleName": "string",
    "PointsPerUnit": 100,
    "Multiplier": 100,
    "MinTransactionAmount": 100,
    "MaxTransactionAmount": 100,
    "IsActive": true,
    "ValidFrom": "2026-08-05T09:30:00Z",
    "ValidUntil": "2026-08-05T09:30:00Z",
    "CreatedAt": "2026-08-05T09:30:00Z",
    "UpdatedAt": "2026-08-05T09:30:00Z"
  }
]
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/loyalty/merchants/{merchantId}/loyalty-rulesCreate a new merchant loyalty ruleRequest & responses +
Request examplePOST /api/v2/loyalty/merchants/{merchantId}/loyalty-rules
application/jsonSchema: CreateMerchantLoyaltyRuleRequest
curl --request POST 'https://staging.hoppa.global/api/v2/loyalty/merchants/123/loyalty-rules' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "RuleName": "string",
  "PointsPerUnit": 100,
  "Multiplier": 100,
  "MinTransactionAmount": 100,
  "MaxTransactionAmount": 100,
  "IsActive": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z"
}'
Parameters
merchantIdpathintegerrequiredExample: 123
Example request body
{
  "RuleName": "string",
  "PointsPerUnit": 100,
  "Multiplier": 100,
  "MinTransactionAmount": 100,
  "MaxTransactionAmount": 100,
  "IsActive": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z"
}
Response examples5 documented statuses
201CreatedMerchantLoyaltyRuleResponse
{
  "Id": 123,
  "RuleName": "string",
  "PointsPerUnit": 100,
  "Multiplier": 100,
  "MinTransactionAmount": 100,
  "MaxTransactionAmount": 100,
  "IsActive": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/loyalty/merchants/{merchantId}/loyalty-rules/{ruleId}Update an existing merchant loyalty ruleRequest & responses +
Request examplePUT /api/v2/loyalty/merchants/{merchantId}/loyalty-rules/{ruleId}
application/jsonSchema: UpdateMerchantLoyaltyRuleRequest
curl --request PUT 'https://staging.hoppa.global/api/v2/loyalty/merchants/123/loyalty-rules/123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "RuleName": "string",
  "PointsPerUnit": 100,
  "Multiplier": 100,
  "MinTransactionAmount": 100,
  "MaxTransactionAmount": 100,
  "IsActive": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z"
}'
Parameters
merchantIdpathintegerrequiredExample: 123
ruleIdpathintegerrequiredExample: 123
Example request body
{
  "RuleName": "string",
  "PointsPerUnit": 100,
  "Multiplier": 100,
  "MinTransactionAmount": 100,
  "MaxTransactionAmount": 100,
  "IsActive": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z"
}
Response examples5 documented statuses
200OKMerchantLoyaltyRuleResponse
{
  "Id": 123,
  "RuleName": "string",
  "PointsPerUnit": 100,
  "Multiplier": 100,
  "MinTransactionAmount": 100,
  "MaxTransactionAmount": 100,
  "IsActive": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

DELETE/api/v2/loyalty/merchants/{merchantId}/loyalty-rules/{ruleId}Delete a merchant loyalty ruleRequest & responses +
Request exampleDELETE /api/v2/loyalty/merchants/{merchantId}/loyalty-rules/{ruleId}
No request body
curl --request DELETE 'https://staging.hoppa.global/api/v2/loyalty/merchants/123/loyalty-rules/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
merchantIdpathintegerrequiredExample: 123
ruleIdpathintegerrequiredExample: 123
Response examples4 documented statuses
204No Contentapplication/json
{}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/loyalty/auto-assign/card-transactionProcess automatic point assignment for a card transactionRequest & responses +
Request examplePOST /api/v2/loyalty/auto-assign/card-transaction
application/jsonSchema: ProcessCardTransactionRequest
curl --request POST 'https://staging.hoppa.global/api/v2/loyalty/auto-assign/card-transaction' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "TransactionId": "string",
  "TransactionAmount": 100,
  "Currency": "USD",
  "MerchantName": "string",
  "MerchantCategory": "string",
  "MerchantId": "string",
  "UserTier": "string",
  "Source": "string",
  "TransactionTimestamp": "2026-08-05T09:30:00Z",
  "Metadata": {}
}'
Example request body
{
  "UserId": 123,
  "TransactionId": "string",
  "TransactionAmount": 100,
  "Currency": "USD",
  "MerchantName": "string",
  "MerchantCategory": "string",
  "MerchantId": "string",
  "UserTier": "string",
  "Source": "string",
  "TransactionTimestamp": "2026-08-05T09:30:00Z",
  "Metadata": {}
}
Response examples4 documented statuses
200OKPointTransactionResponse
{
  "Id": 123,
  "TransactionType": "string",
  "Points": 1,
  "Description": "Example description",
  "Source": "string",
  "SourceTransactionId": "string",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "ProcessedAt": "2026-08-05T09:30:00Z",
  "Metadata": {}
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/loyalty/auto-assign/payment-requestProcess automatic point assignment for a payment requestRequest & responses +
Request examplePOST /api/v2/loyalty/auto-assign/payment-request
application/jsonSchema: ProcessPaymentRequestRequest
curl --request POST 'https://staging.hoppa.global/api/v2/loyalty/auto-assign/payment-request' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "PaymentRequestId": "string",
  "TransactionAmount": 100,
  "Currency": "USD",
  "PaymentMethod": "string",
  "MerchantName": "string",
  "MerchantCategory": "string",
  "MerchantId": "string",
  "UserTier": "string",
  "Source": "string",
  "TransactionTimestamp": "2026-08-05T09:30:00Z",
  "Metadata": {}
}'
Example request body
{
  "UserId": 123,
  "PaymentRequestId": "string",
  "TransactionAmount": 100,
  "Currency": "USD",
  "PaymentMethod": "string",
  "MerchantName": "string",
  "MerchantCategory": "string",
  "MerchantId": "string",
  "UserTier": "string",
  "Source": "string",
  "TransactionTimestamp": "2026-08-05T09:30:00Z",
  "Metadata": {}
}
Response examples4 documented statuses
200OKPointTransactionResponse
{
  "Id": 123,
  "TransactionType": "string",
  "Points": 1,
  "Description": "Example description",
  "Source": "string",
  "SourceTransactionId": "string",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "ProcessedAt": "2026-08-05T09:30:00Z",
  "Metadata": {}
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/loyalty/auto-assign/bulkProcess multiple transactions in bulk for automatic point assignmentRequest & responses +
Request examplePOST /api/v2/loyalty/auto-assign/bulk
application/jsonSchema: BulkProcessTransactionsRequest
curl --request POST 'https://staging.hoppa.global/api/v2/loyalty/auto-assign/bulk' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Transactions": [
    {
      "UserId": 123,
      "TransactionId": "string",
      "TransactionAmount": 100,
      "Currency": "USD",
      "MerchantName": "string",
      "MerchantCategory": "string",
      "MerchantId": "string",
      "UserTier": "string",
      "Source": "string",
      "TransactionTimestamp": "2026-08-05T09:30:00Z",
      "Metadata": {}
    }
  ],
  "Source": "string",
  "ContinueOnError": true
}'
Example request body
{
  "Transactions": [
    {
      "UserId": 123,
      "TransactionId": "string",
      "TransactionAmount": 100,
      "Currency": "USD",
      "MerchantName": "string",
      "MerchantCategory": "string",
      "MerchantId": "string",
      "UserTier": "string",
      "Source": "string",
      "TransactionTimestamp": "2026-08-05T09:30:00Z",
      "Metadata": {}
    }
  ],
  "Source": "string",
  "ContinueOnError": true
}
Response examples4 documented statuses
200OKBulkProcessingResponse
{
  "TotalTransactions": 1,
  "SuccessfulTransactions": 1,
  "FailedTransactions": 1,
  "TotalPointsAwarded": 1,
  "OverallSuccess": true,
  "ProcessingTimeMs": 1,
  "ProcessingTime": "string",
  "Errors": [
    "string"
  ],
  "SuccessfulResults": [
    {
      "TransactionId": "string",
      "UserId": 123,
      "PointsEarned": 1
    }
  ],
  "Results": [
    {
      "TransactionId": "string",
      "Success": true,
      "PointsEarned": 1,
      "PointsAwarded": 1,
      "UserId": 123,
      "ErrorMessage": "string",
      "Transaction": {
        "Id": 123,
        "TransactionType": "string",
        "Points": 1,
        "Description": "Example description",
        "Source": "string",
        "SourceTransactionId": "string",
        "CreatedAt": "2026-08-05T09:30:00Z",
        "ProcessedAt": "2026-08-05T09:30:00Z",
        "Metadata": {}
      }
    }
  ],
  "ProcessedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/auto-assign/stats/{loyaltyProgramId}Get point assignment statistics for a loyalty programRequest & responses +
Request exampleGET /api/v2/loyalty/auto-assign/stats/{loyaltyProgramId}
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/auto-assign/stats/123?startDate=2026-08-05T09%3A30%3A00Z&endDate=2026-08-05T09%3A30%3A00Z' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
loyaltyProgramIdpathintegerrequiredExample: 123
startDatequerystringoptionalExample: 2026-08-05T09:30:00Z
endDatequerystringoptionalExample: 2026-08-05T09:30:00Z
Response examples4 documented statuses
200OKPointAssignmentStatsResponse
{
  "LoyaltyProgramId": 123,
  "Period": "string",
  "StartDate": "2026-08-05T09:30:00Z",
  "EndDate": "2026-08-05T09:30:00Z",
  "TotalAssignments": 1,
  "TotalPointsAssigned": 1,
  "TotalReversals": 1,
  "TotalPointsReversed": 1,
  "AveragePointsPerTransaction": 100,
  "SourceBreakdown": [
    {
      "Source": "string",
      "TransactionCount": 1,
      "TotalPoints": 1,
      "Percentage": 100
    }
  ],
  "DailyStats": [
    {
      "Date": "2026-08-05T09:30:00Z",
      "TransactionCount": 1,
      "PointsAssigned": 1,
      "ReversalCount": 1,
      "PointsReversed": 1
    }
  ],
  "GeneratedAt": "2026-08-05T09:30:00Z"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/loyalty/auto-assign/reverseReverse a point assignment with audit trail supportRequest & responses +
Request examplePOST /api/v2/loyalty/auto-assign/reverse
application/jsonSchema: ReversePointAssignmentRequest
curl --request POST 'https://staging.hoppa.global/api/v2/loyalty/auto-assign/reverse' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "TransactionId": 123,
  "Reason": "string",
  "Source": "string",
  "Metadata": {}
}'
Example request body
{
  "TransactionId": 123,
  "Reason": "string",
  "Source": "string",
  "Metadata": {}
}
Response examples5 documented statuses
204No Contentapplication/json
{}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/statsGet comprehensive loyalty program statisticsRequest & responses +
Request exampleGET /api/v2/loyalty/stats
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/stats' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples3 documented statuses
200OKLoyaltyStatsResponse
{
  "TotalUsers": 1,
  "ActiveUsers": 1,
  "TotalPointsEarned": 1,
  "TotalPointsRedeemed": 1,
  "TotalTransactions": 1,
  "AveragePointsPerUser": 100,
  "TierDistribution": [
    {
      "TierLevel": "string",
      "UserCount": 1,
      "Percentage": 100
    }
  ],
  "MonthlyTrends": [
    {
      "Month": "string",
      "PointsEarned": 1,
      "PointsRedeemed": 1,
      "TransactionCount": 1
    }
  ]
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/geographic-analyticsGet geographic analytics with regional performance dataRequest & responses +
Request exampleGET /api/v2/loyalty/geographic-analytics
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/geographic-analytics?period=30d' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
periodquerystringoptionalExample: 30d
Response examples3 documented statuses
200OKGeographicAnalyticsResponse
{
  "RegionStats": [
    {
      "Region": "string",
      "Country": "GB",
      "City": "London",
      "UserCount": 1,
      "TransactionCount": 1,
      "TotalPoints": 1,
      "AveragePointsPerUser": 100,
      "GrowthRate": 100
    }
  ],
  "Period": "string",
  "GeneratedAt": "2026-08-05T09:30:00Z"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/location-insightsGet location insights with city and country performance rankingsRequest & responses +
Request exampleGET /api/v2/loyalty/location-insights
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/location-insights?period=30d&metric=transactions' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
periodquerystringoptionalExample: 30d
metricquerystringoptionalExample: transactions
Response examples3 documented statuses
200OKLocationInsightsResponse
{
  "TopLocations": [
    {
      "Location": "string",
      "Country": "GB",
      "City": "London",
      "Value": 1,
      "Rank": 1,
      "PercentageOfTotal": 100
    }
  ],
  "Period": "string",
  "Metric": "string",
  "GeneratedAt": "2026-08-05T09:30:00Z"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/geographic-analytics/exportExport geographic analytics data to CSV formatRequest & responses +
Request exampleGET /api/v2/loyalty/geographic-analytics/export
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/geographic-analytics/export?period=30d' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
periodquerystringoptionalExample: 30d
Response examples3 documented statuses
200OKFileContentResult
{
  "FileContents": "BASE64_ENCODED_DATA",
  "ContentType": "string",
  "FileDownloadName": "string",
  "LastModified": "2026-08-05T09:30:00Z",
  "EntityTag": {
    "Tag": {
      "Buffer": "string",
      "Offset": 1,
      "Length": 1,
      "Value": "string",
      "HasValue": true
    },
    "IsWeak": true
  },
  "EnableRangeProcessing": true
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/merchant-categoriesGet merchant categories for analytics filteringRequest & responses +
Request exampleGET /api/v2/loyalty/merchant-categories
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/merchant-categories' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples3 documented statuses
200OKapplication/json
[
  "string"
]
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/user/dashboardGet comprehensive user dashboard data with auto-enrollmentRequest & responses +
Request exampleGET /api/v2/loyalty/user/dashboard
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/user/dashboard' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples4 documented statuses
200OKUserDashboardResponse
{
  "PointBalance": {
    "UserId": 123,
    "ProgramId": 123,
    "CurrentBalance": 1,
    "TotalEarned": 1,
    "TotalRedeemed": 1,
    "TierLevel": "string",
    "LastActivity": "2026-08-05T09:30:00Z",
    "EnrolledAt": "2026-08-05T09:30:00Z",
    "MonthlyStats": {
      "CurrentMonthEarned": 1,
      "PreviousMonthEarned": 1,
      "GrowthPercentage": 100,
      "TransactionCount": 1
    }
  },
  "RecentTransactions": [
    {
      "Id": 123,
      "TransactionType": "string",
      "Points": 1,
      "Description": "Example description",
      "Source": "string",
      "SourceTransactionId": "string",
      "CreatedAt": "2026-08-05T09:30:00Z",
      "ProcessedAt": "2026-08-05T09:30:00Z",
      "Metadata": {}
    }
  ],
  "RedemptionOptions": [
    {
      "Id": 123,
      "Name": "string",
      "Description": "Example description",
      "PointsRequired": 1,
      "Category": "string",
      "IsAvailable": true,
      "ImageUrl": "https://example.com/callback",
      "CashValue": 100,
      "ExpiresAt": "2026-08-05T09:30:00Z",
      "IsLimitedTime": true,
      "QuantityAvailable": 1
    }
  ],
  "Stats": {
    "TotalTransactions": 1,
    "PointsEarnedThisMonth": 1,
    "PointsEarnedLastMonth": 1,
    "MonthlyGrowthPercentage": 100,
    "DaysActive": 1,
    "NextTierLevel": "string",
    "PointsToNextTier": 1,
    "MonthlyEarnings": [
      {
        "Month": "string",
        "Year": 1,
        "PointsEarned": 1,
        "TransactionCount": 1
      }
    ]
  },
  "Program": {
    "Id": 123,
    "Name": "string",
    "Description": "Example description",
    "IsActive": true,
    "PointValueRate": 100,
    "PointValueCurrency": "USD",
    "Rules": [
      {
        "Id": 123,
        "RuleName": "string",
        "RuleType": "string",
        "PointsPerUnit": 100,
        "MinTransactionAmount": 100,
        "MaxTransactionAmount": 100,
        "MerchantCategory": "string",
        "UserTier": "string",
        "Priority": 1,
        "IsActive": true,
        "ValidFrom": "2026-08-05T09:30:00Z",
        "ValidUntil": "2026-08-05T09:30:00Z",
        "Multiplier": 100,
        "CreatedAt": "2026-08-05T09:30:00Z",
        "UpdatedAt": "2026-08-05T09:30:00Z"
      }
    ],
    "CreatedAt": "2026-08-05T09:30:00Z",
    "UpdatedAt": "2026-08-05T09:30:00Z"
  },
  "GeneratedAt": "2026-08-05T09:30:00Z"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/user/transactionsGet user point transactions with advanced filteringRequest & responses +
Request exampleGET /api/v2/loyalty/user/transactions
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/user/transactions?transactionType=example&startDate=2026-08-05T09%3A30%3A00Z&endDate=2026-08-05T09%3A30%3A00Z&source=example&minPoints=1&maxPoints=1' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
transactionTypequerystringoptionalExample: example
startDatequerystringoptionalExample: 2026-08-05T09:30:00Z
endDatequerystringoptionalExample: 2026-08-05T09:30:00Z
sourcequerystringoptionalExample: example
minPointsqueryintegeroptionalExample: 1
maxPointsqueryintegeroptionalExample: 1
limitqueryintegeroptionalExample: 50
offsetqueryintegeroptionalExample: 0
Response examples4 documented statuses
200OKapplication/json
[
  {
    "Id": 123,
    "TransactionType": "string",
    "Points": 1,
    "Description": "Example description",
    "Source": "string",
    "SourceTransactionId": "string",
    "CreatedAt": "2026-08-05T09:30:00Z",
    "ProcessedAt": "2026-08-05T09:30:00Z",
    "Metadata": {}
  }
]
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/loyalty/user/redemption-optionsGet available redemption options for the authenticated userRequest & responses +
Request exampleGET /api/v2/loyalty/user/redemption-options
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/loyalty/user/redemption-options' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples4 documented statuses
200OKapplication/json
[
  {
    "Id": 123,
    "Name": "string",
    "Description": "Example description",
    "PointsRequired": 1,
    "Category": "string",
    "IsAvailable": true,
    "ImageUrl": "https://example.com/callback",
    "CashValue": 100,
    "ExpiresAt": "2026-08-05T09:30:00Z",
    "IsLimitedTime": true,
    "QuantityAvailable": 1
  }
]
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

MOR12 operations
POST/api/v2/mor/public/kybSubmit or resubmit KYB for the API key's MoR merchant.Request & responses +
Request examplePOST /api/v2/mor/public/kyb
application/jsonSchema: MorKybSubmissionRequest
curl --request POST 'https://staging.hoppa.global/api/v2/mor/public/kyb' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "CompanyName": "string",
  "RegistrationNumber": "string",
  "RegistrationCountry": "GB",
  "Industry": "string",
  "Website": "string",
  "IncorporationDate": "2026-08-05",
  "BusinessDescription": "Example description",
  "AddressLine1": "string",
  "AddressLine2": "string",
  "City": "London",
  "State": "string",
  "Country": "GB",
  "PostalCode": "SW1A 1AA",
  "PhoneNumber": "+447700900123",
  "PhoneCountryCode": "+447700900123",
  "UboInformation": {
    "UboFirstName": "Jane",
    "UboLastName": "Doe",
    "UboGender": "string",
    "UboCountryCode": "GB",
    "UboIdType": "string",
    "UboIdNumber": "string",
    "UboDob": "2026-08-05"
  },
  "Ubos": [
    {
      "FirstName": "Jane",
      "LastName": "Doe",
      "Dob": "2026-08-05",
      "Nationality": "string",
      "OwnershipPercentage": 100,
      "IdNumber": "string",
      "Gender": "string",
      "CountryCode": "GB",
      "IdType": "string"
    }
  ]
}'
Example request body
{
  "CompanyName": "string",
  "RegistrationNumber": "string",
  "RegistrationCountry": "GB",
  "Industry": "string",
  "Website": "string",
  "IncorporationDate": "2026-08-05",
  "BusinessDescription": "Example description",
  "AddressLine1": "string",
  "AddressLine2": "string",
  "City": "London",
  "State": "string",
  "Country": "GB",
  "PostalCode": "SW1A 1AA",
  "PhoneNumber": "+447700900123",
  "PhoneCountryCode": "+447700900123",
  "UboInformation": {
    "UboFirstName": "Jane",
    "UboLastName": "Doe",
    "UboGender": "string",
    "UboCountryCode": "GB",
    "UboIdType": "string",
    "UboIdNumber": "string",
    "UboDob": "2026-08-05"
  },
  "Ubos": [
    {
      "FirstName": "Jane",
      "LastName": "Doe",
      "Dob": "2026-08-05",
      "Nationality": "string",
      "OwnershipPercentage": 100,
      "IdNumber": "string",
      "Gender": "string",
      "CountryCode": "GB",
      "IdType": "string"
    }
  ]
}
Response examples1 documented status
200OKapplication/json
{}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/mor/public/onboarding-statusGet the merchant onboarding status; optionally refresh it from Interlace.Request & responses +
Request exampleGET /api/v2/mor/public/onboarding-status
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/mor/public/onboarding-status?refresh=false' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
refreshquerybooleanoptionalExample: false
Response examples1 documented status
200OKapplication/json
{}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/mor/public/cardholderCreate or return the merchant's company-level CORPORATE_MANAGED cardholder.Request & responses +
Request examplePOST /api/v2/mor/public/cardholder
application/json
curl --request POST 'https://staging.hoppa.global/api/v2/mor/public/cardholder' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Dob": "2026-08-05"
}'
Example request body
{
  "Dob": "2026-08-05"
}
Response examples1 documented status
200OKapplication/json
{}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/mor/public/usersAdd a user_simple to the API key's MoR company.Request & responses +
Request examplePOST /api/v2/mor/public/users
application/jsonSchema: MorCreateSimpleUserRequest
curl --request POST 'https://staging.hoppa.global/api/v2/mor/public/users' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Email": "user@example.com",
  "FirstName": "Jane",
  "LastName": "Doe",
  "Password": "string"
}'
Example request body
{
  "Email": "user@example.com",
  "FirstName": "Jane",
  "LastName": "Doe",
  "Password": "string"
}
Response examples1 documented status
200OKapplication/json
{}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/mor/public/cards/batchOrder 1-20 prepaid cards in a batch.Request & responses +
Request examplePOST /api/v2/mor/public/cards/batch
application/jsonSchema: MorOrderCardsRequest
curl --request POST 'https://staging.hoppa.global/api/v2/mor/public/cards/batch' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "CardTypeId": 123,
  "Quantity": 1,
  "AutoLockEnabled": true,
  "LabelPrefix": "string"
}'
Example request body
{
  "CardTypeId": 123,
  "Quantity": 1,
  "AutoLockEnabled": true,
  "LabelPrefix": "string"
}
Response examples1 documented status
200OKapplication/json
{}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/mor/public/cards/{cardId}/assignAssign a merchant-owned card to a user_simple in the same company.Request & responses +
Request examplePOST /api/v2/mor/public/cards/{cardId}/assign
application/jsonSchema: MorAssignCardRequest
curl --request POST 'https://staging.hoppa.global/api/v2/mor/public/cards/123/assign' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "AssignedUserId": 123
}'
Parameters
cardIdpathintegerrequiredExample: 123
Example request body
{
  "AssignedUserId": 123
}
Response examples1 documented status
200OKapplication/json
{}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/mor/public/cards/{cardId}/loadLoad a merchant-owned card from the merchant's Interlace account.Request & responses +
Request examplePOST /api/v2/mor/public/cards/{cardId}/load
application/jsonSchema: MorPublicCardFundingRequest
curl --request POST 'https://staging.hoppa.global/api/v2/mor/public/cards/123/load' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Amount": 100
}'
Parameters
cardIdpathintegerrequiredExample: 123
Example request body
{
  "Amount": 100
}
Response examples1 documented status
200OKapplication/json
{}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/mor/public/cards/{cardId}/unloadUnload a merchant-owned card to the merchant's Interlace account.Request & responses +
Request examplePOST /api/v2/mor/public/cards/{cardId}/unload
application/jsonSchema: MorPublicCardFundingRequest
curl --request POST 'https://staging.hoppa.global/api/v2/mor/public/cards/123/unload' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Amount": 100
}'
Parameters
cardIdpathintegerrequiredExample: 123
Example request body
{
  "Amount": 100
}
Response examples1 documented status
200OKapplication/json
{}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/mor/public/cardsGet all merchant cards with their current available and pending balances.Request & responses +
Request exampleGET /api/v2/mor/public/cards
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/mor/public/cards' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples1 documented status
200OKapplication/json
{}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/mor/public/users/{userId}/cardsGet one user_simple's assigned cards and aggregate card balances.Request & responses +
Request exampleGET /api/v2/mor/public/users/{userId}/cards
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/mor/public/users/123/cards' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdpathintegerrequiredExample: 123
Response examples1 documented status
200OKapplication/json
{}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/mor/public/cards/{cardId}/secure-widgetGet a secure hosted card-information widget.Request & responses +
Request exampleGET /api/v2/mor/public/cards/{cardId}/secure-widget
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/mor/public/cards/123/secure-widget' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
cardIdpathintegerrequiredExample: 123
Response examples1 documented status
200OKapplication/json
{}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/mor/public/walletsGet merchant wallets, deposit addresses, and fiat/crypto balances.Request & responses +
Request exampleGET /api/v2/mor/public/wallets
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/mor/public/wallets' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples1 documented status
200OKapplication/json
{}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

Onboarding6 operations
GET/api/v2/onboarding/configOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/onboarding/config
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/onboarding/config?companyId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
companyIdqueryintegeroptionalExample: 123
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/onboarding/statusOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/onboarding/status
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/onboarding/status' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/onboarding/tierOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/onboarding/tier
application/jsonSchema: SelectOnboardingTierRequest
curl --request POST 'https://staging.hoppa.global/api/v2/onboarding/tier' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "TierId": 123
}'
Example request body
{
  "TierId": 123
}
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/onboarding/gates/{gateNumber}/checkoutOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/onboarding/gates/{gateNumber}/checkout
application/json
curl --request POST 'https://staging.hoppa.global/api/v2/onboarding/gates/1/checkout' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "TermsAccepted": false
}'
Parameters
gateNumberpathintegerrequiredExample: 1
Example request body
{
  "TermsAccepted": false
}
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/onboarding/kyc1/sessionOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/onboarding/kyc1/session
application/json
curl --request POST 'https://staging.hoppa.global/api/v2/onboarding/kyc1/session' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "FirstName": "Jane",
  "LastName": "Doe",
  "Email": "user@example.com",
  "Country": "GB",
  "Phone": "+447700900123"
}'
Example request body
{
  "FirstName": "Jane",
  "LastName": "Doe",
  "Email": "user@example.com",
  "Country": "GB",
  "Phone": "+447700900123"
}
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/onboarding/kyc2/sessionOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/onboarding/kyc2/session
No request body
curl --request POST 'https://staging.hoppa.global/api/v2/onboarding/kyc2/session' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

Payments13 operations
POST/api/v2/payments/createCreate a payment with automatic currency exchange and transferRequest & responses +
Request examplePOST /api/v2/payments/create
application/jsonSchema: CreatePaymentRequestV2
curl --request POST 'https://staging.hoppa.global/api/v2/payments/create' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "Description": "Example description",
  "MerchantReferenceId": "external_reference_123",
  "MandateId": 123,
  "Metadata": {}
}'
Example request body
{
  "UserId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "Description": "Example description",
  "MerchantReferenceId": "external_reference_123",
  "MandateId": 123,
  "Metadata": {}
}
Response examples4 documented statuses
200OKPaymentResponseV2
{
  "Id": 123,
  "Status": "PENDING",
  "Message": "string",
  "TransactionId": 123,
  "TransferId": "string",
  "ExchangeQuote": {
    "FromCurrency": "USD",
    "ToCurrency": "USD",
    "FromAmount": "100.00",
    "ToAmount": "100.00",
    "ExchangeRate": "string",
    "Fee": "100.00"
  },
  "ExchangeTradeId": "string",
  "RequiredAmount": "100.00",
  "AvailableAmount": "100.00",
  "Shortfall": "string",
  "TransakOrder": {
    "OrderId": "string",
    "RedirectUrl": "https://example.com/callback",
    "WidgetUrl": "https://example.com/callback",
    "Status": "PENDING",
    "Amount": "100.00",
    "Currency": "USD",
    "CryptoAmount": "100.00",
    "CryptoCurrency": "USDC"
  },
  "Amount": "100.00",
  "Currency": "USD",
  "UserId": 123,
  "CompanyId": 123,
  "MandateId": 123,
  "CreatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/payments/mandatesList payment mandates with filtering and paginationRequest & responses +
Request exampleGET /api/v2/payments/mandates
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/payments/mandates?pageNumber=1&pageSize=10&userId=123&status=PENDING&currency=USD&dateFrom=2026-08-05' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
pageNumberqueryintegeroptionalExample: 1
pageSizequeryintegeroptionalExample: 10
userIdqueryintegeroptionalExample: 123
statusqueryMandateStatusV2optionalExample: PENDING
currencyquerystringoptionalExample: USD
dateFromquerystringoptionalExample: 2026-08-05
dateToquerystringoptionalExample: 2026-08-05
Response examples2 documented statuses
200OKPaymentMandateListResponseV2
{
  "Mandates": [
    {
      "Id": 123,
      "UserId": 123,
      "CompanyId": 123,
      "MaxAmount": "100.00",
      "Currency": "USD",
      "Frequency": "ONE_TIME",
      "Status": "PENDING",
      "Description": "Example description",
      "ExternalReferenceId": "external_reference_123",
      "StartDate": "2026-08-05",
      "EndDate": "2026-08-05",
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "Total": 1,
  "PageNumber": 1,
  "PageSize": 1,
  "TotalPages": 1
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/payments/mandatesCreate a payment mandateRequest & responses +
Request examplePOST /api/v2/payments/mandates
application/jsonSchema: PaymentMandateCreateV2
curl --request POST 'https://staging.hoppa.global/api/v2/payments/mandates' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "MaxAmount": "100.00",
  "Currency": "USD",
  "Frequency": "ONE_TIME",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "StartDate": "2026-08-05",
  "EndDate": "2026-08-05",
  "Metadata": {}
}'
Example request body
{
  "UserId": 123,
  "MaxAmount": "100.00",
  "Currency": "USD",
  "Frequency": "ONE_TIME",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "StartDate": "2026-08-05",
  "EndDate": "2026-08-05",
  "Metadata": {}
}
Response examples4 documented statuses
201CreatedPaymentMandateResponseV2
{
  "Id": 123,
  "UserId": 123,
  "CompanyId": 123,
  "MaxAmount": "100.00",
  "Currency": "USD",
  "Frequency": "ONE_TIME",
  "Status": "PENDING",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "StartDate": "2026-08-05",
  "EndDate": "2026-08-05",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/payments/mandates/{mandateId}Get payment mandate by IDRequest & responses +
Request exampleGET /api/v2/payments/mandates/{mandateId}
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/payments/mandates/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
mandateIdpathintegerrequiredExample: 123
Response examples3 documented statuses
200OKPaymentMandateResponseV2
{
  "Id": 123,
  "UserId": 123,
  "CompanyId": 123,
  "MaxAmount": "100.00",
  "Currency": "USD",
  "Frequency": "ONE_TIME",
  "Status": "PENDING",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "StartDate": "2026-08-05",
  "EndDate": "2026-08-05",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/payments/mandates/{mandateId}/revokeRevoke a payment mandateRequest & responses +
Request examplePUT /api/v2/payments/mandates/{mandateId}/revoke
application/jsonSchema: PaymentMandateRevokeV2
curl --request PUT 'https://staging.hoppa.global/api/v2/payments/mandates/123/revoke' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Reason": "string"
}'
Parameters
mandateIdpathintegerrequiredExample: 123
Example request body
{
  "Reason": "string"
}
Response examples3 documented statuses
200OKPaymentMandateResponseV2
{
  "Id": 123,
  "UserId": 123,
  "CompanyId": 123,
  "MaxAmount": "100.00",
  "Currency": "USD",
  "Frequency": "ONE_TIME",
  "Status": "PENDING",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "StartDate": "2026-08-05",
  "EndDate": "2026-08-05",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/payments/requestsList payment requests with filtering and paginationRequest & responses +
Request exampleGET /api/v2/payments/requests
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/payments/requests?pageNumber=1&pageSize=10&userId=123&status=PENDING&currency=USD&dateFrom=2026-08-05' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
pageNumberqueryintegeroptionalExample: 1
pageSizequeryintegeroptionalExample: 10
userIdqueryintegeroptionalExample: 123
statusqueryPaymentStatusV2optionalExample: PENDING
currencyquerystringoptionalExample: USD
dateFromquerystringoptionalExample: 2026-08-05
dateToquerystringoptionalExample: 2026-08-05
Response examples2 documented statuses
200OKPaymentRequestListResponseV2
{
  "PaymentRequests": [
    {
      "Id": 123,
      "UserId": 123,
      "CompanyId": 123,
      "Amount": "100.00",
      "Currency": "USD",
      "Status": "PENDING",
      "Description": "Example description",
      "ExternalReferenceId": "external_reference_123",
      "CallbackUrl": "https://example.com/callback",
      "SuccessUrl": "https://example.com/callback",
      "FailureUrl": "https://example.com/callback",
      "PaymentUrl": "https://example.com/callback",
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z",
      "CompletedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "Total": 1,
  "PageNumber": 1,
  "PageSize": 1,
  "TotalPages": 1
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/payments/requestsCreate a payment requestRequest & responses +
Request examplePOST /api/v2/payments/requests
application/jsonSchema: PaymentRequestCreateV2
curl --request POST 'https://staging.hoppa.global/api/v2/payments/requests' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "CallbackUrl": "https://example.com/callback",
  "SuccessUrl": "https://example.com/callback",
  "FailureUrl": "https://example.com/callback",
  "Metadata": {}
}'
Example request body
{
  "UserId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "CallbackUrl": "https://example.com/callback",
  "SuccessUrl": "https://example.com/callback",
  "FailureUrl": "https://example.com/callback",
  "Metadata": {}
}
Response examples4 documented statuses
201CreatedPaymentRequestResponseV2
{
  "Id": 123,
  "UserId": 123,
  "CompanyId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "Status": "PENDING",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "CallbackUrl": "https://example.com/callback",
  "SuccessUrl": "https://example.com/callback",
  "FailureUrl": "https://example.com/callback",
  "PaymentUrl": "https://example.com/callback",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/payments/requests/{requestId}Get payment request by IDRequest & responses +
Request exampleGET /api/v2/payments/requests/{requestId}
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/payments/requests/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
requestIdpathintegerrequiredExample: 123
Response examples3 documented statuses
200OKPaymentRequestResponseV2
{
  "Id": 123,
  "UserId": 123,
  "CompanyId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "Status": "PENDING",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "CallbackUrl": "https://example.com/callback",
  "SuccessUrl": "https://example.com/callback",
  "FailureUrl": "https://example.com/callback",
  "PaymentUrl": "https://example.com/callback",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/payments/requests/{requestId}/cancelCancel a payment requestRequest & responses +
Request examplePUT /api/v2/payments/requests/{requestId}/cancel
application/jsonSchema: PaymentRequestCancelV2
curl --request PUT 'https://staging.hoppa.global/api/v2/payments/requests/123/cancel' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Reason": "string"
}'
Parameters
requestIdpathintegerrequiredExample: 123
Example request body
{
  "Reason": "string"
}
Response examples3 documented statuses
200OKPaymentRequestResponseV2
{
  "Id": 123,
  "UserId": 123,
  "CompanyId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "Status": "PENDING",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "CallbackUrl": "https://example.com/callback",
  "SuccessUrl": "https://example.com/callback",
  "FailureUrl": "https://example.com/callback",
  "PaymentUrl": "https://example.com/callback",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/payments/payoutsCreate a payoutRequest & responses +
Request examplePOST /api/v2/payments/payouts
application/jsonSchema: PayoutRequestCreateV2
curl --request POST 'https://staging.hoppa.global/api/v2/payments/payouts' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "DestinationAddress": "0x1111111111111111111111111111111111111111",
  "DestinationTag": "string",
  "Network": "string",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "Metadata": {}
}'
Example request body
{
  "UserId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "DestinationAddress": "0x1111111111111111111111111111111111111111",
  "DestinationTag": "string",
  "Network": "string",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "Metadata": {}
}
Response examples4 documented statuses
201CreatedPayoutResponseV2
{
  "Id": 123,
  "UserId": 123,
  "CompanyId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "DestinationAddress": "0x1111111111111111111111111111111111111111",
  "DestinationTag": "string",
  "Network": "string",
  "Status": "PENDING",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "TransactionId": "string",
  "TransactionHash": "string",
  "Fee": "100.00",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
501Not ImplementedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/payments/withdrawals/feeGet withdrawal fee estimateRequest & responses +
Request examplePOST /api/v2/payments/withdrawals/fee
application/jsonSchema: WithdrawalFeeRequestV2
curl --request POST 'https://staging.hoppa.global/api/v2/payments/withdrawals/fee' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Currency": "USD",
  "Amount": "100.00",
  "Chain": "string",
  "Network": "string",
  "DestinationAddress": "0x1111111111111111111111111111111111111111"
}'
Example request body
{
  "Currency": "USD",
  "Amount": "100.00",
  "Chain": "string",
  "Network": "string",
  "DestinationAddress": "0x1111111111111111111111111111111111111111"
}
Response examples3 documented statuses
200OKWithdrawalFeeResponseV2
{
  "Currency": "USD",
  "Amount": "100.00",
  "Fee": "100.00",
  "NetAmount": "100.00",
  "Network": "string",
  "EstimatedConfirmationTime": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
501Not ImplementedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/payments/withdrawalsCreate a withdrawalRequest & responses +
Request examplePOST /api/v2/payments/withdrawals
application/jsonSchema: WithdrawalCreateV2
curl --request POST 'https://staging.hoppa.global/api/v2/payments/withdrawals' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Amount": "100.00",
  "Currency": "USD",
  "Chain": "string",
  "DestinationAddress": "0x1111111111111111111111111111111111111111",
  "UserId": 123,
  "DestinationTag": "string",
  "Network": "string",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "Metadata": {}
}'
Example request body
{
  "Amount": "100.00",
  "Currency": "USD",
  "Chain": "string",
  "DestinationAddress": "0x1111111111111111111111111111111111111111",
  "UserId": 123,
  "DestinationTag": "string",
  "Network": "string",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "Metadata": {}
}
Response examples4 documented statuses
201CreatedPayoutResponseV2
{
  "Id": 123,
  "UserId": 123,
  "CompanyId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "DestinationAddress": "0x1111111111111111111111111111111111111111",
  "DestinationTag": "string",
  "Network": "string",
  "Status": "PENDING",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "TransactionId": "string",
  "TransactionHash": "string",
  "Fee": "100.00",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
501Not ImplementedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/payments/assets/co-brandGet co-brand assetsRequest & responses +
Request exampleGET /api/v2/payments/assets/co-brand
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/payments/assets/co-brand?companyId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
companyIdqueryintegeroptionalExample: 123
Response examples3 documented statuses
200OKUserAssetsResponseV2
{
  "UserId": 123,
  "Assets": [
    {
      "Id": 123,
      "Currency": "USD",
      "Balance": "100.00",
      "AvailableBalance": "100.00",
      "FrozenBalance": "100.00",
      "PendingBalance": "100.00",
      "Network": "string",
      "AssetType": "string",
      "BalanceType": "100.00",
      "BalanceId": "100.00",
      "CreatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "RetrievedAt": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
501Not ImplementedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PublicVouchers41 operations
GET/api/v2/vouchers/settingsOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers/settings
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers/settings' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples1 documented status
200OKVoucherModuleStatusResponse
{
  "GlobalEnabled": true,
  "CompanyEnabled": true,
  "InterlaceEnabled": true,
  "EffectiveEnabled": true,
  "ShutdownMode": "string",
  "LowBalanceWarningPercentage": 100,
  "VerificationTtlMinutes": 1,
  "DefaultRequiresApproval": true,
  "DailyReportRecipients": [
    "string"
  ],
  "MaximumBatchSize": 1,
  "MaximumImportRows": 1,
  "MaximumMassAssignmentSize": 1
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/vouchers/settingsOpen request and response documentationRequest & responses +
Request examplePUT /api/v2/vouchers/settings
application/jsonSchema: UpdateVoucherSettingsRequest
curl --request PUT 'https://staging.hoppa.global/api/v2/vouchers/settings' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001' \
  -H 'Content-Type: application/json' \
  --data '{
  "Enabled": true,
  "ShutdownMode": "string",
  "LowBalanceWarningPercentage": 100,
  "VerificationTtlMinutes": 1,
  "DefaultRequiresApproval": true,
  "DailyReportRecipients": [
    "string"
  ],
  "MaximumBatchSize": 1,
  "MaximumImportRows": 1,
  "MaximumMassAssignmentSize": 1
}'
Parameters
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Example request body
{
  "Enabled": true,
  "ShutdownMode": "string",
  "LowBalanceWarningPercentage": 100,
  "VerificationTtlMinutes": 1,
  "DefaultRequiresApproval": true,
  "DailyReportRecipients": [
    "string"
  ],
  "MaximumBatchSize": 1,
  "MaximumImportRows": 1,
  "MaximumMassAssignmentSize": 1
}
Response examples1 documented status
200OKVoucherModuleStatusResponse
{
  "GlobalEnabled": true,
  "CompanyEnabled": true,
  "InterlaceEnabled": true,
  "EffectiveEnabled": true,
  "ShutdownMode": "string",
  "LowBalanceWarningPercentage": 100,
  "VerificationTtlMinutes": 1,
  "DefaultRequiresApproval": true,
  "DailyReportRecipients": [
    "string"
  ],
  "MaximumBatchSize": 1,
  "MaximumImportRows": 1,
  "MaximumMassAssignmentSize": 1
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/vouchers/groupsOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers/groups
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers/groups' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples1 documented status
200OKapplication/json
[
  {
    "Id": "00000000-0000-4000-8000-000000000123",
    "Name": "string",
    "Description": "Example description",
    "Status": "PENDING",
    "DefaultType": "string",
    "DefaultValue": 100,
    "DefaultCurrency": "USD",
    "DefaultPerUserLimit": 1,
    "DefaultTotalUseLimit": 1,
    "DefaultAggregateCap": 100,
    "DefaultRequiresApproval": true,
    "DefaultRequiresEmail2Fa": true,
    "DefaultValidFrom": "2026-08-05T09:30:00Z",
    "DefaultValidUntil": "2026-08-05T09:30:00Z",
    "CampaignReference": "external_reference_123",
    "CostCentre": "string",
    "Tags": [
      "string"
    ],
    "CreatedAt": "2026-08-05T09:30:00Z"
  }
]

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/groupsOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/groups
application/jsonSchema: CreateVoucherGroupRequest
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/groups' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001' \
  -H 'Content-Type: application/json' \
  --data '{
  "Name": "string",
  "Description": "Example description",
  "DefaultType": "string",
  "DefaultValue": 100,
  "DefaultCurrency": "USD",
  "DefaultPerUserLimit": 1,
  "DefaultTotalUseLimit": 1,
  "DefaultAggregateCap": 100,
  "DefaultRequiresApproval": true,
  "DefaultRequiresEmail2Fa": true,
  "DefaultValidFrom": "2026-08-05T09:30:00Z",
  "DefaultValidUntil": "2026-08-05T09:30:00Z",
  "CampaignReference": "external_reference_123",
  "CostCentre": "string",
  "Tags": [
    "string"
  ]
}'
Parameters
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Example request body
{
  "Name": "string",
  "Description": "Example description",
  "DefaultType": "string",
  "DefaultValue": 100,
  "DefaultCurrency": "USD",
  "DefaultPerUserLimit": 1,
  "DefaultTotalUseLimit": 1,
  "DefaultAggregateCap": 100,
  "DefaultRequiresApproval": true,
  "DefaultRequiresEmail2Fa": true,
  "DefaultValidFrom": "2026-08-05T09:30:00Z",
  "DefaultValidUntil": "2026-08-05T09:30:00Z",
  "CampaignReference": "external_reference_123",
  "CostCentre": "string",
  "Tags": [
    "string"
  ]
}
Response examples1 documented status
200OKVoucherGroupResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "Name": "string",
  "Description": "Example description",
  "Status": "PENDING",
  "DefaultType": "string",
  "DefaultValue": 100,
  "DefaultCurrency": "USD",
  "DefaultPerUserLimit": 1,
  "DefaultTotalUseLimit": 1,
  "DefaultAggregateCap": 100,
  "DefaultRequiresApproval": true,
  "DefaultRequiresEmail2Fa": true,
  "DefaultValidFrom": "2026-08-05T09:30:00Z",
  "DefaultValidUntil": "2026-08-05T09:30:00Z",
  "CampaignReference": "external_reference_123",
  "CostCentre": "string",
  "Tags": [
    "string"
  ],
  "CreatedAt": "2026-08-05T09:30:00Z"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/vouchers/groups/{id}/status/{status}Open request and response documentationRequest & responses +
Request examplePUT /api/v2/vouchers/groups/{id}/status/{status}
No request body
curl --request PUT 'https://staging.hoppa.global/api/v2/vouchers/groups/00000000-0000-4000-8000-000000000123/status/PENDING' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001'
Parameters
idpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
statuspathstringrequiredExample: PENDING
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Response examples1 documented status
200OKVoucherGroupResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "Name": "string",
  "Description": "Example description",
  "Status": "PENDING",
  "DefaultType": "string",
  "DefaultValue": 100,
  "DefaultCurrency": "USD",
  "DefaultPerUserLimit": 1,
  "DefaultTotalUseLimit": 1,
  "DefaultAggregateCap": 100,
  "DefaultRequiresApproval": true,
  "DefaultRequiresEmail2Fa": true,
  "DefaultValidFrom": "2026-08-05T09:30:00Z",
  "DefaultValidUntil": "2026-08-05T09:30:00Z",
  "CampaignReference": "external_reference_123",
  "CostCentre": "string",
  "Tags": [
    "string"
  ],
  "CreatedAt": "2026-08-05T09:30:00Z"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/vouchersOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers?page=1&pageSize=50' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
pagequeryintegeroptionalExample: 1
pageSizequeryintegeroptionalExample: 50
Response examples1 documented status
200OKapplication/json
[
  {
    "Id": "00000000-0000-4000-8000-000000000123",
    "GroupId": "00000000-0000-4000-8000-000000000123",
    "Name": "string",
    "Description": "Example description",
    "MaskedCode": "string",
    "Type": "string",
    "Value": 100,
    "Currency": "USD",
    "Status": "PENDING",
    "SuccessfulUses": 1,
    "ReservedUses": 1,
    "PerUserLimit": 1,
    "MaximumTotalUses": 1,
    "RedeemedValue": 100,
    "ReservedValue": 100,
    "MaximumAggregateValue": 100,
    "RequiresWhitelabelApproval": true,
    "RequiresEmail2Fa": true,
    "ValidFrom": "2026-08-05T09:30:00Z",
    "ValidUntil": "2026-08-05T09:30:00Z",
    "CreatedAt": "2026-08-05T09:30:00Z",
    "PlaintextCode": "string"
  }
]

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchersOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers
application/jsonSchema: CreateVoucherRequest
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001' \
  -H 'Content-Type: application/json' \
  --data '{
  "Name": "string",
  "Description": "Example description",
  "GroupPublicId": "00000000-0000-4000-8000-000000000123",
  "TargetUserId": 123,
  "CustomCode": "string",
  "Prefix": "string",
  "Type": "string",
  "Value": 100,
  "Currency": "USD",
  "PerUserLimit": 1,
  "MaximumTotalUses": 1,
  "MaximumAggregateValue": 100,
  "RequiresWhitelabelApproval": true,
  "RequiresEmail2Fa": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "InitialStatus": "PENDING",
  "ExternalReference": "external_reference_123",
  "AcceptUnboundedLiability": true
}'
Parameters
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Example request body
{
  "Name": "string",
  "Description": "Example description",
  "GroupPublicId": "00000000-0000-4000-8000-000000000123",
  "TargetUserId": 123,
  "CustomCode": "string",
  "Prefix": "string",
  "Type": "string",
  "Value": 100,
  "Currency": "USD",
  "PerUserLimit": 1,
  "MaximumTotalUses": 1,
  "MaximumAggregateValue": 100,
  "RequiresWhitelabelApproval": true,
  "RequiresEmail2Fa": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "InitialStatus": "PENDING",
  "ExternalReference": "external_reference_123",
  "AcceptUnboundedLiability": true
}
Response examples1 documented status
200OKVoucherResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "GroupId": "00000000-0000-4000-8000-000000000123",
  "Name": "string",
  "Description": "Example description",
  "MaskedCode": "string",
  "Type": "string",
  "Value": 100,
  "Currency": "USD",
  "Status": "PENDING",
  "SuccessfulUses": 1,
  "ReservedUses": 1,
  "PerUserLimit": 1,
  "MaximumTotalUses": 1,
  "RedeemedValue": 100,
  "ReservedValue": 100,
  "MaximumAggregateValue": 100,
  "RequiresWhitelabelApproval": true,
  "RequiresEmail2Fa": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "PlaintextCode": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/batchOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/batch
application/jsonSchema: CreateVoucherBatchRequest
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/batch' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001' \
  -H 'Content-Type: application/json' \
  --data '{
  "Name": "string",
  "Count": 1,
  "SharedCode": true,
  "Description": "Example description",
  "GroupPublicId": "00000000-0000-4000-8000-000000000123",
  "TargetUserId": 123,
  "CustomCode": "string",
  "Prefix": "string",
  "Type": "string",
  "Value": 100,
  "Currency": "USD",
  "PerUserLimit": 1,
  "MaximumTotalUses": 1,
  "MaximumAggregateValue": 100,
  "RequiresWhitelabelApproval": true,
  "RequiresEmail2Fa": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "InitialStatus": "PENDING",
  "ExternalReference": "external_reference_123",
  "AcceptUnboundedLiability": true
}'
Parameters
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Example request body
{
  "Name": "string",
  "Count": 1,
  "SharedCode": true,
  "Description": "Example description",
  "GroupPublicId": "00000000-0000-4000-8000-000000000123",
  "TargetUserId": 123,
  "CustomCode": "string",
  "Prefix": "string",
  "Type": "string",
  "Value": 100,
  "Currency": "USD",
  "PerUserLimit": 1,
  "MaximumTotalUses": 1,
  "MaximumAggregateValue": 100,
  "RequiresWhitelabelApproval": true,
  "RequiresEmail2Fa": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "InitialStatus": "PENDING",
  "ExternalReference": "external_reference_123",
  "AcceptUnboundedLiability": true
}
Response examples1 documented status
200OKVoucherJobResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "Kind": "string",
  "Status": "PENDING",
  "TotalItems": 1,
  "SuccessfulItems": 1,
  "FailedItems": 1,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/assignmentsOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/assignments
application/jsonSchema: AssignVoucherRequest
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/assignments' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001' \
  -H 'Content-Type: application/json' \
  --data '{
  "VoucherId": "00000000-0000-4000-8000-000000000123",
  "UserId": 123
}'
Parameters
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Example request body
{
  "VoucherId": "00000000-0000-4000-8000-000000000123",
  "UserId": 123
}
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/assignments/from-groupOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/assignments/from-group
application/jsonSchema: AssignVoucherFromGroupRequest
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/assignments/from-group' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001' \
  -H 'Content-Type: application/json' \
  --data '{
  "GroupId": "00000000-0000-4000-8000-000000000123",
  "UserId": 123
}'
Parameters
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Example request body
{
  "GroupId": "00000000-0000-4000-8000-000000000123",
  "UserId": 123
}
Response examples1 documented status
200OKVoucherResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "GroupId": "00000000-0000-4000-8000-000000000123",
  "Name": "string",
  "Description": "Example description",
  "MaskedCode": "string",
  "Type": "string",
  "Value": 100,
  "Currency": "USD",
  "Status": "PENDING",
  "SuccessfulUses": 1,
  "ReservedUses": 1,
  "PerUserLimit": 1,
  "MaximumTotalUses": 1,
  "RedeemedValue": 100,
  "ReservedValue": 100,
  "MaximumAggregateValue": 100,
  "RequiresWhitelabelApproval": true,
  "RequiresEmail2Fa": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "PlaintextCode": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/vouchers/{id}/status/{status}Open request and response documentationRequest & responses +
Request examplePUT /api/v2/vouchers/{id}/status/{status}
No request body
curl --request PUT 'https://staging.hoppa.global/api/v2/vouchers/00000000-0000-4000-8000-000000000123/status/PENDING' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001'
Parameters
idpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
statuspathstringrequiredExample: PENDING
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Response examples1 documented status
200OKVoucherResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "GroupId": "00000000-0000-4000-8000-000000000123",
  "Name": "string",
  "Description": "Example description",
  "MaskedCode": "string",
  "Type": "string",
  "Value": 100,
  "Currency": "USD",
  "Status": "PENDING",
  "SuccessfulUses": 1,
  "ReservedUses": 1,
  "PerUserLimit": 1,
  "MaximumTotalUses": 1,
  "RedeemedValue": 100,
  "ReservedValue": 100,
  "MaximumAggregateValue": 100,
  "RequiresWhitelabelApproval": true,
  "RequiresEmail2Fa": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "PlaintextCode": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/{id}/revealOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/{id}/reveal
No request body
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/00000000-0000-4000-8000-000000000123/reveal' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001'
Parameters
idpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/redemptionsOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/redemptions
application/jsonSchema: RedeemVoucherForUserRequest
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/redemptions' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "Code": "string"
}'
Parameters
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Example request body
{
  "UserId": 123,
  "Code": "string"
}
Response examples1 documented status
200OKVoucherRedemptionResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "VoucherId": "00000000-0000-4000-8000-000000000123",
  "VoucherName": "string",
  "Amount": 100,
  "Currency": "USD",
  "Status": "PENDING",
  "TransactionReference": "external_reference_123",
  "ErrorCode": "string",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/validateOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/validate
application/jsonSchema: RedeemVoucherForUserRequest
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/validate' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "Code": "string"
}'
Example request body
{
  "UserId": 123,
  "Code": "string"
}
Response examples1 documented status
200OKVoucherValidationResponse
{
  "Valid": true,
  "Amount": 100,
  "Currency": "USD",
  "RequiresEmailVerification": true,
  "RequiresApproval": true
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/redemptions/{id}/verification/resendOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/redemptions/{id}/verification/resend
No request body
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/redemptions/00000000-0000-4000-8000-000000000123/verification/resend?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001'
Parameters
idpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
userIdqueryintegeroptionalExample: 123
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/redemptions/{id}/verifyOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/redemptions/{id}/verify
application/jsonSchema: VerifyVoucherRedemptionRequest
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/redemptions/00000000-0000-4000-8000-000000000123/verify?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001' \
  -H 'Content-Type: application/json' \
  --data '{
  "Code": "string"
}'
Parameters
idpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
userIdqueryintegeroptionalExample: 123
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Example request body
{
  "Code": "string"
}
Response examples1 documented status
200OKVoucherRedemptionResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "VoucherId": "00000000-0000-4000-8000-000000000123",
  "VoucherName": "string",
  "Amount": 100,
  "Currency": "USD",
  "Status": "PENDING",
  "TransactionReference": "external_reference_123",
  "ErrorCode": "string",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/vouchers/redemptions/{id}Open request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers/redemptions/{id}
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers/redemptions/00000000-0000-4000-8000-000000000123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
idpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
Response examples1 documented status
200OKVoucherRedemptionResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "VoucherId": "00000000-0000-4000-8000-000000000123",
  "VoucherName": "string",
  "Amount": 100,
  "Currency": "USD",
  "Status": "PENDING",
  "TransactionReference": "external_reference_123",
  "ErrorCode": "string",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

DELETE/api/v2/vouchers/redemptions/{id}Open request and response documentationRequest & responses +
Request exampleDELETE /api/v2/vouchers/redemptions/{id}
No request body
curl --request DELETE 'https://staging.hoppa.global/api/v2/vouchers/redemptions/00000000-0000-4000-8000-000000000123?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001'
Parameters
idpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
userIdqueryintegeroptionalExample: 123
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Response examples1 documented status
200OKVoucherRedemptionResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "VoucherId": "00000000-0000-4000-8000-000000000123",
  "VoucherName": "string",
  "Amount": 100,
  "Currency": "USD",
  "Status": "PENDING",
  "TransactionReference": "external_reference_123",
  "ErrorCode": "string",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/vouchers/approvalsOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers/approvals
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers/approvals' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples1 documented status
200OKapplication/json
[
  {
    "Id": "00000000-0000-4000-8000-000000000123",
    "VoucherId": "00000000-0000-4000-8000-000000000123",
    "VoucherName": "string",
    "Amount": 100,
    "Currency": "USD",
    "Status": "PENDING",
    "TransactionReference": "external_reference_123",
    "ErrorCode": "string",
    "CreatedAt": "2026-08-05T09:30:00Z",
    "CompletedAt": "2026-08-05T09:30:00Z"
  }
]

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/approvals/{id}Open request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/approvals/{id}
application/jsonSchema: DecideVoucherRedemptionRequest
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/approvals/00000000-0000-4000-8000-000000000123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001' \
  -H 'Content-Type: application/json' \
  --data '{
  "Reason": "string",
  "Approve": true,
  "Notes": "string"
}'
Parameters
idpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Example request body
{
  "Reason": "string",
  "Approve": true,
  "Notes": "string"
}
Response examples1 documented status
200OKVoucherRedemptionResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "VoucherId": "00000000-0000-4000-8000-000000000123",
  "VoucherName": "string",
  "Amount": 100,
  "Currency": "USD",
  "Status": "PENDING",
  "TransactionReference": "external_reference_123",
  "ErrorCode": "string",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/vouchers/liabilityOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers/liability
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers/liability' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples1 documented status
200OKapplication/json
[
  {
    "Currency": "USD",
    "Outstanding": 100,
    "Reserved": 100,
    "Unbounded": true
  }
]

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/liability/previewOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/liability/preview
application/jsonSchema: CreateVoucherRequest
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/liability/preview' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Name": "string",
  "Description": "Example description",
  "GroupPublicId": "00000000-0000-4000-8000-000000000123",
  "TargetUserId": 123,
  "CustomCode": "string",
  "Prefix": "string",
  "Type": "string",
  "Value": 100,
  "Currency": "USD",
  "PerUserLimit": 1,
  "MaximumTotalUses": 1,
  "MaximumAggregateValue": 100,
  "RequiresWhitelabelApproval": true,
  "RequiresEmail2Fa": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "InitialStatus": "PENDING",
  "ExternalReference": "external_reference_123",
  "AcceptUnboundedLiability": true
}'
Example request body
{
  "Name": "string",
  "Description": "Example description",
  "GroupPublicId": "00000000-0000-4000-8000-000000000123",
  "TargetUserId": 123,
  "CustomCode": "string",
  "Prefix": "string",
  "Type": "string",
  "Value": 100,
  "Currency": "USD",
  "PerUserLimit": 1,
  "MaximumTotalUses": 1,
  "MaximumAggregateValue": 100,
  "RequiresWhitelabelApproval": true,
  "RequiresEmail2Fa": true,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "InitialStatus": "PENDING",
  "ExternalReference": "external_reference_123",
  "AcceptUnboundedLiability": true
}
Response examples1 documented status
200OKapplication/json
[
  {
    "Currency": "USD",
    "Outstanding": 100,
    "Reserved": 100,
    "Unbounded": true
  }
]

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/redemptions/{id}/retryOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/redemptions/{id}/retry
No request body
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/redemptions/00000000-0000-4000-8000-000000000123/retry' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001'
Parameters
idpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Response examples1 documented status
200OKVoucherRedemptionResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "VoucherId": "00000000-0000-4000-8000-000000000123",
  "VoucherName": "string",
  "Amount": 100,
  "Currency": "USD",
  "Status": "PENDING",
  "TransactionReference": "external_reference_123",
  "ErrorCode": "string",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/vouchers/rulesOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers/rules
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers/rules' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples1 documented status
200OKapplication/json
[
  {
    "Id": "00000000-0000-4000-8000-000000000123",
    "Name": "string",
    "TriggerType": "string",
    "CampaignMode": "string",
    "Enabled": true,
    "AssignmentCount": 1,
    "AssignedValue": 100
  }
]

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/rulesOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/rules
application/jsonSchema: CreateVoucherRuleRequest
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/rules' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001' \
  -H 'Content-Type: application/json' \
  --data '{
  "Name": "string",
  "TriggerType": "string",
  "CampaignMode": "string",
  "VoucherGroupId": "00000000-0000-4000-8000-000000000123",
  "SharedVoucherId": "00000000-0000-4000-8000-000000000123",
  "ThresholdAmount": 100,
  "ThresholdCurrency": "USD",
  "MaximumAssignments": 1,
  "MaximumAssignedValue": 100,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "Criteria": {},
  "VoucherTemplate": {}
}'
Parameters
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Example request body
{
  "Name": "string",
  "TriggerType": "string",
  "CampaignMode": "string",
  "VoucherGroupId": "00000000-0000-4000-8000-000000000123",
  "SharedVoucherId": "00000000-0000-4000-8000-000000000123",
  "ThresholdAmount": 100,
  "ThresholdCurrency": "USD",
  "MaximumAssignments": 1,
  "MaximumAssignedValue": 100,
  "ValidFrom": "2026-08-05T09:30:00Z",
  "ValidUntil": "2026-08-05T09:30:00Z",
  "Criteria": {},
  "VoucherTemplate": {}
}
Response examples1 documented status
200OKVoucherRuleResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "Name": "string",
  "TriggerType": "string",
  "CampaignMode": "string",
  "Enabled": true,
  "AssignmentCount": 1,
  "AssignedValue": 100
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/vouchers/rules/{id}/enabled/{enabled}Open request and response documentationRequest & responses +
Request examplePUT /api/v2/vouchers/rules/{id}/enabled/{enabled}
No request body
curl --request PUT 'https://staging.hoppa.global/api/v2/vouchers/rules/00000000-0000-4000-8000-000000000123/enabled/true' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001'
Parameters
idpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
enabledpathbooleanrequiredExample: true
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/imports/previewOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/imports/preview
application/x-www-form-urlencoded
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/imports/preview' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data '{
  "ContentType": "string",
  "ContentDisposition": "string",
  "Headers": {},
  "Length": 1,
  "Name": "string",
  "FileName": "string"
}'
Parameters
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Example request body
{
  "ContentType": "string",
  "ContentDisposition": "string",
  "Headers": {},
  "Length": 1,
  "Name": "string",
  "FileName": "string"
}
Response examples1 documented status
200OKVoucherImportPreviewResponse
{
  "JobId": "00000000-0000-4000-8000-000000000123",
  "Status": "PENDING",
  "TotalRows": 1,
  "ValidRows": 1,
  "InvalidRows": 1,
  "Rows": [
    {
      "Row": 1,
      "Valid": true,
      "ErrorCode": "string",
      "ErrorMessage": "string",
      "Name": "string",
      "Value": 100,
      "Currency": "USD",
      "Type": "string",
      "UserId": 123
    }
  ]
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/vouchers/imports/templateOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers/imports/template
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers/imports/template' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/imports/{id}/confirmOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/imports/{id}/confirm
application/jsonSchema: ConfirmVoucherImportRequest
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/imports/00000000-0000-4000-8000-000000000123/confirm' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001' \
  -H 'Content-Type: application/json' \
  --data '{
  "Mode": "string"
}'
Parameters
idpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Example request body
{
  "Mode": "string"
}
Response examples1 documented status
200OKVoucherJobResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "Kind": "string",
  "Status": "PENDING",
  "TotalItems": 1,
  "SuccessfulItems": 1,
  "FailedItems": 1,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/assignments/massOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/assignments/mass
application/jsonSchema: MassAssignVoucherRequest
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/assignments/mass' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001' \
  -H 'Content-Type: application/json' \
  --data '{
  "VoucherId": "00000000-0000-4000-8000-000000000123",
  "UserIds": [
    1
  ],
  "UserIdentifiers": [
    "string"
  ],
  "TierIds": [
    1
  ],
  "CardTypes": [
    "string"
  ],
  "TransactionTypes": [
    "string"
  ],
  "TransactionFrom": "2026-08-05T09:30:00Z",
  "TransactionTo": "2026-08-05T09:30:00Z",
  "MinimumCompletedTransactionVolume": 100,
  "TransactionCurrency": "USD"
}'
Parameters
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Example request body
{
  "VoucherId": "00000000-0000-4000-8000-000000000123",
  "UserIds": [
    1
  ],
  "UserIdentifiers": [
    "string"
  ],
  "TierIds": [
    1
  ],
  "CardTypes": [
    "string"
  ],
  "TransactionTypes": [
    "string"
  ],
  "TransactionFrom": "2026-08-05T09:30:00Z",
  "TransactionTo": "2026-08-05T09:30:00Z",
  "MinimumCompletedTransactionVolume": 100,
  "TransactionCurrency": "USD"
}
Response examples1 documented status
200OKVoucherJobResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "Kind": "string",
  "Status": "PENDING",
  "TotalItems": 1,
  "SuccessfulItems": 1,
  "FailedItems": 1,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/vouchers/jobsOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers/jobs
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers/jobs' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples1 documented status
200OKapplication/json
[
  {
    "Id": "00000000-0000-4000-8000-000000000123",
    "Kind": "string",
    "Status": "PENDING",
    "TotalItems": 1,
    "SuccessfulItems": 1,
    "FailedItems": 1,
    "CreatedAt": "2026-08-05T09:30:00Z",
    "CompletedAt": "2026-08-05T09:30:00Z"
  }
]

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/vouchers/jobs/{id}Open request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers/jobs/{id}
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers/jobs/00000000-0000-4000-8000-000000000123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
idpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
Response examples1 documented status
200OKVoucherJobResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "Kind": "string",
  "Status": "PENDING",
  "TotalItems": 1,
  "SuccessfulItems": 1,
  "FailedItems": 1,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/vouchers/jobs/{id}/itemsOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers/jobs/{id}/items
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers/jobs/00000000-0000-4000-8000-000000000123/items' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
idpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
Response examples1 documented status
200OKapplication/json
[
  {
    "ItemIndex": 1,
    "Status": "PENDING",
    "ExternalKey": "string",
    "ErrorCode": "string",
    "ErrorMessage": "string",
    "Result": "string"
  }
]

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/jobs/{id}/retryOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/jobs/{id}/retry
No request body
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/jobs/00000000-0000-4000-8000-000000000123/retry' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001'
Parameters
idpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Response examples1 documented status
200OKVoucherJobResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "Kind": "string",
  "Status": "PENDING",
  "TotalItems": 1,
  "SuccessfulItems": 1,
  "FailedItems": 1,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/vouchers/jobs/{id}/codes/exportOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers/jobs/{id}/codes/export
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers/jobs/00000000-0000-4000-8000-000000000123/codes/export' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
idpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/vouchers/redemptions/{id}/reversalOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/vouchers/redemptions/{id}/reversal
application/jsonSchema: ReverseVoucherRedemptionRequest
curl --request POST 'https://staging.hoppa.global/api/v2/vouchers/redemptions/00000000-0000-4000-8000-000000000123/reversal' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Idempotency-Key: operation-customer-1042-001' \
  -H 'Content-Type: application/json' \
  --data '{
  "Reason": "string",
  "RestoreUse": true,
  "DryRun": true,
  "Confirm": true
}'
Parameters
idpathstringrequiredExample: 00000000-0000-4000-8000-000000000123
Idempotency-KeyheaderstringoptionalExample: operation-customer-1042-001
Example request body
{
  "Reason": "string",
  "RestoreUse": true,
  "DryRun": true,
  "Confirm": true
}
Response examples1 documented status
200OKVoucherReversalResponse
{
  "Id": "00000000-0000-4000-8000-000000000123",
  "RedemptionId": "00000000-0000-4000-8000-000000000123",
  "Amount": 100,
  "Currency": "USD",
  "Status": "PENDING",
  "RestoreUse": true,
  "DryRun": true,
  "TransactionReference": "external_reference_123"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/vouchers/reports/redemptionsOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers/reports/redemptions
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers/reports/redemptions?from=2026-08-05T09%3A30%3A00Z&to=2026-08-05T09%3A30%3A00Z&status=PENDING&currency=USD' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
fromquerystringoptionalExample: 2026-08-05T09:30:00Z
toquerystringoptionalExample: 2026-08-05T09:30:00Z
statusquerystringoptionalExample: PENDING
currencyquerystringoptionalExample: USD
Response examples1 documented status
200OKapplication/json
[
  {
    "RedemptionId": "00000000-0000-4000-8000-000000000123",
    "VoucherId": "00000000-0000-4000-8000-000000000123",
    "VoucherName": "string",
    "UserId": 123,
    "Amount": 100,
    "Currency": "USD",
    "Status": "PENDING",
    "ErrorCode": "string",
    "CreatedAt": "2026-08-05T09:30:00Z",
    "CompletedAt": "2026-08-05T09:30:00Z"
  }
]

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/vouchers/reports/daily-statisticsOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers/reports/daily-statistics
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers/reports/daily-statistics?from=2026-08-05&to=2026-08-05' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
fromquerystringoptionalExample: 2026-08-05
toquerystringoptionalExample: 2026-08-05
Response examples1 documented status
200OKapplication/json
[
  {
    "Date": "2026-08-05",
    "Currency": "USD",
    "IssuedCount": 1,
    "IssuedValue": 100,
    "RedeemedCount": 1,
    "RedeemedValue": 100,
    "FailedCount": 1,
    "ReversedCount": 1
  }
]

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/vouchers/reports/liability-snapshotsOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers/reports/liability-snapshots
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers/reports/liability-snapshots?from=2026-08-05&to=2026-08-05' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
fromquerystringoptionalExample: 2026-08-05
toquerystringoptionalExample: 2026-08-05
Response examples1 documented status
200OKapplication/json
[
  {
    "Date": "2026-08-05",
    "Currency": "USD",
    "Outstanding": 100,
    "Reserved": 100,
    "Unbounded": true
  }
]

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/vouchers/reports/{report}/exportOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers/reports/{report}/export
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers/reports/example/export' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
reportpathstringrequiredExample: example
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/vouchers/auditOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/vouchers/audit
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/vouchers/audit?page=1&pageSize=100' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
pagequeryintegeroptionalExample: 1
pageSizequeryintegeroptionalExample: 100
Response examples1 documented status
200OKapplication/json
[
  {
    "Id": 123,
    "UserId": 123,
    "ApiKeyId": 123,
    "ActorType": "string",
    "Action": "string",
    "TargetType": "string",
    "TargetId": "string",
    "Status": "PENDING",
    "CorrelationId": "string",
    "Timestamp": "2026-08-05T09:30:00Z"
  }
]

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

Support1 operations
POST/api/v2/admin/support/messages/report-transactionOpen request and response documentationadminRequest & responses +
Request examplePOST /api/v2/admin/support/messages/report-transaction
application/jsonSchema: ReportTransactionRequest
curl --request POST 'https://staging.hoppa.global/api/v2/admin/support/messages/report-transaction' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "TargetUserId": 123,
  "TransactionId": 123,
  "Message": "string"
}'
Example request body
{
  "TargetUserId": 123,
  "TransactionId": 123,
  "Message": "string"
}
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

Swap2 operations
POST/api/v2/swaptokens/swapOpen request and response documentationRequest & responses +
Request examplePOST /api/v2/swaptokens/swap
application/jsonSchema: SwapRequest
curl --request POST 'https://staging.hoppa.global/api/v2/swaptokens/swap' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "TokenIn": "USDC",
  "TokenOut": "USDC",
  "AmountIn": "100.00",
  "Slippage": 100,
  "ChainIdIn": 1,
  "ChainIdOut": 1,
  "FromAddress": "0x1111111111111111111111111111111111111111",
  "ToAddress": "0x1111111111111111111111111111111111111111"
}'
Example request body
{
  "UserId": 123,
  "TokenIn": "USDC",
  "TokenOut": "USDC",
  "AmountIn": "100.00",
  "Slippage": 100,
  "ChainIdIn": 1,
  "ChainIdOut": 1,
  "FromAddress": "0x1111111111111111111111111111111111111111",
  "ToAddress": "0x1111111111111111111111111111111111111111"
}
Response examples1 documented status
200OKSwapResponse
{
  "Transaction": {
    "to": "string",
    "data": "string",
    "value": "string",
    "abi": "string",
    "args": [
      {}
    ]
  },
  "Route": {
    "query": {
      "params": {
        "chainIdIn": 1,
        "chainIdOut": 1,
        "tokenIn": "USDC",
        "tokenOut": "USDC",
        "amountIn": "100.00"
      },
      "slippage": 100,
      "from": "string",
      "recipient": "string"
    },
    "route": [
      {
        "pool": {
          "lp": {
            "chainId": {},
            "address": {},
            "name": {},
            "symbol": {},
            "decimals": {},
            "tags": {},
            "permit": {}
          },
          "decimals": [
            {}
          ],
          "coins": [
            {}
          ],
          "address": "string",
          "underlyingCoins": [
            {}
          ],
          "type": "string"
        },
        "fees": [
          {
            "type": {},
            "token": {},
            "percent": {},
            "amount": {}
          }
        ],
        "priceImpact": "string",
        "params": {
          "tokenIn": {
            "chainId": {},
            "address": {},
            "name": {},
            "symbol": {},
            "decimals": {},
            "chainName": {},
            "originalName": {},
            "originalSymbol": {},
            "tags": {},
            "synthTags": {},
            "permit": {}
          },
          "chainIdIn": 1,
          "tokenOut": {
            "chainId": {},
            "address": {},
            "name": {},
            "symbol": {},
            "decimals": {},
            "chainName": {},
            "originalName": {},
            "originalSymbol": {},
            "tags": {},
            "synthTags": {},
            "permit": {}
          },
          "chainIdOut": 1,
          "amountIn": "100.00",
          "amountInWithoutSlippage": "100.00",
          "amountOut": "100.00",
          "amountOutWithoutSlippage": "100.00",
          "slippage": 100
        },
        "type": "string",
        "chainId": 123
      }
    ],
    "amountIn": "100.00",
    "amountInWithoutSlippage": "100.00",
    "amountOut": "100.00",
    "amountOutWithoutSlippage": "100.00",
    "tokenInPrice": 100,
    "tokenOutPrice": 100,
    "priceImpact": 100,
    "totalFee": {
      "type": "string",
      "amount": "100.00",
      "percent": "string"
    },
    "signature": "string"
  },
  "TransactionId": 123
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/swaptokens/historyOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/swaptokens/history
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/swaptokens/history?userId=123&page=1&pageSize=20' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
pagequeryintegeroptionalExample: 1
pageSizequeryintegeroptionalExample: 20
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

Tiers2 operations
GET/api/v2/tiersGet company tiers for the authenticated companyRequest & responses +
Request exampleGET /api/v2/tiers
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/tiers' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples5 documented statuses
200OKGetTiersResponseV2
{
  "Tiers": [
    {
      "Id": 123,
      "Name": "string",
      "Description": "Example description",
      "TierLevel": 1,
      "AccountType": "string",
      "MonthlyFee": 100,
      "YearlyFee": 100,
      "Features": [
        "string"
      ],
      "Limits": {},
      "IsDefault": true,
      "IsActive": true,
      "StripeAccountOwnerOverride": "string",
      "IncludesEqualsCards": true,
      "IncludesEqualsIban": true,
      "EuPriceTableId": "string",
      "UkPriceTableId": "string",
      "UsPriceTableId": "string",
      "UpPriceTableId": "string",
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z"
    }
  ]
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
403ForbiddenErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/tiers/card-tier/{cardTierId}Get all card type tiers for a specific tier ID for the authenticated companyRequest & responses +
Request exampleGET /api/v2/tiers/card-tier/{cardTierId}
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/tiers/card-tier/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
cardTierIdpathintegerrequiredExample: 123
Response examples5 documented statuses
200OKGetCardTypeTierResponseV2
{
  "CardTypeTiers": [
    {
      "CardTypeSecondaryId": 123,
      "CardTypeId": 123,
      "TierId": 123,
      "BinRangeOverrideId": 123,
      "EffectiveBinRangeId": 123,
      "FreeCardsIncluded": 1,
      "FreeCardsPeriod": "string",
      "MonthlySubscriptionFee": 100,
      "YearlySubscriptionFee": 100,
      "MaxCards": 1,
      "IsActive": true,
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z",
      "CardType": {
        "Id": 123,
        "Name": "string",
        "Code": "string",
        "Description": "Example description",
        "Features": [
          "string"
        ],
        "MonthlyFee": 100,
        "IssuanceFee": 100,
        "CurrencyCode": "USD",
        "Limits": {},
        "Benefits": [
          "string"
        ],
        "AvailableDesigns": [
          "string"
        ],
        "IssuanceTime": "string",
        "IsEnabled": true,
        "CompanyId": 123,
        "RequiresKycLevel": "string",
        "MonthlySubscriptionFee": 100,
        "YearlySubscriptionFee": 100,
        "SubscriptionFeatures": [
          "string"
        ],
        "BaseFeatures": [
          "string"
        ],
        "LoadOptions": [
          "string"
        ],
        "ReplacementFee": 100,
        "AtmWithdrawalFee": 100,
        "IsVirtual": true,
        "IsPhysical": true,
        "CardNetwork": "string",
        "Provider": "string",
        "CreatedAt": "2026-08-05T09:30:00Z",
        "UpdatedAt": "2026-08-05T09:30:00Z"
      }
    }
  ]
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
403ForbiddenErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

Transactions7 operations
GET/api/v2/transactionsGet paginated transactions with advanced filteringRequest & responses +
Request exampleGET /api/v2/transactions
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/transactions?page=1&pageSize=20&types=example&statuses=example&startDate=2026-08-05T09%3A30%3A00Z&endDate=2026-08-05T09%3A30%3A00Z' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
pagequeryintegeroptionalExample: 1
pageSizequeryintegeroptionalExample: 20
typesqueryarrayoptionalExample: example
statusesqueryarrayoptionalExample: example
startDatequerystringoptionalExample: 2026-08-05T09:30:00Z
endDatequerystringoptionalExample: 2026-08-05T09:30:00Z
searchquerystringoptionalExample: example
minAmountquerynumberoptionalExample: 100
maxAmountquerynumberoptionalExample: 100
sourcesqueryarrayoptionalExample: example
cardIdsqueryarrayoptionalExample: 789
walletIdsqueryarrayoptionalExample: 123
sortByquerystringoptionalExample: date
sortOrderquerystringoptionalExample: desc
userIdqueryintegeroptionalExample: 123
Response examples4 documented statuses
200OKPaginatedTransactionResponse
{
  "Data": [
    {
      "Id": 123,
      "ExternalTransactionId": "external_reference_123",
      "RelatedCardTransactionId": "string",
      "Type": "string",
      "Description": "Example description",
      "Amount": 100,
      "Currency": "USD",
      "Status": "PENDING",
      "TransactionDate": "2026-08-05T09:30:00Z",
      "MerchantName": "string",
      "MerchantCategory": "string",
      "Category": "string",
      "CardId": 123,
      "WalletId": 123,
      "Source": "string",
      "FeeAmount": 100,
      "FeeCurrency": "USD",
      "Metadata": {}
    }
  ],
  "Pagination": {
    "Page": 1,
    "PageSize": 1,
    "Total": 1,
    "TotalPages": 1,
    "HasPrevious": true,
    "HasNext": true
  },
  "Stats": {
    "TotalCount": 1,
    "TotalAmount": 100,
    "AmountByCurrency": {},
    "CountByType": {},
    "AmountByType": {},
    "CountByStatus": {}
  }
}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
401UnauthorizedProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
500Internal Server ErrorNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/transactions/syncSync current user's transactions with Interlace (Quantum Account). Adds any missing transactions by external_id.Request & responses +
Request examplePOST /api/v2/transactions/sync
No request body
curl --request POST 'https://staging.hoppa.global/api/v2/transactions/sync?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
Response examples3 documented statuses
200OKapplication/json
{}
401UnauthorizedProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
500Internal Server ErrorNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/transactions/{id}Get transaction by IDRequest & responses +
Request exampleGET /api/v2/transactions/{id}
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/transactions/123?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
idpathintegerrequiredExample: 123
userIdqueryintegeroptionalExample: 123
Response examples4 documented statuses
200OKTransactionDetailResponse
{
  "UserId": 123,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "AccountId": 123,
  "Id": 123,
  "ExternalTransactionId": "external_reference_123",
  "RelatedCardTransactionId": "string",
  "Type": "string",
  "Description": "Example description",
  "Amount": 100,
  "Currency": "USD",
  "Status": "PENDING",
  "TransactionDate": "2026-08-05T09:30:00Z",
  "MerchantName": "string",
  "MerchantCategory": "string",
  "Category": "string",
  "CardId": 123,
  "WalletId": 123,
  "Source": "string",
  "FeeAmount": 100,
  "FeeCurrency": "USD",
  "Metadata": {}
}
401UnauthorizedProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
404Not FoundProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
500Internal Server ErrorNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/transactions/{id}/equals-money/payment-confirmationOpen request and response documentationRequest & responses +
Request exampleGET /api/v2/transactions/{id}/equals-money/payment-confirmation
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/transactions/123/equals-money/payment-confirmation?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
idpathintegerrequiredExample: 123
userIdqueryintegeroptionalExample: 123
Response examples4 documented statuses
200OKFileResult
{
  "ContentType": "string",
  "FileDownloadName": "string",
  "LastModified": "2026-08-05T09:30:00Z",
  "EntityTag": {
    "Tag": {
      "Buffer": "string",
      "Offset": 1,
      "Length": 1,
      "Value": "string",
      "HasValue": true
    },
    "IsWeak": true
  },
  "EnableRangeProcessing": true
}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
401UnauthorizedProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
404Not FoundProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/transactions/statsGet transaction statisticsRequest & responses +
Request exampleGET /api/v2/transactions/stats
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/transactions/stats?startDate=2026-08-05T09%3A30%3A00Z&endDate=2026-08-05T09%3A30%3A00Z&userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
startDatequerystringoptionalExample: 2026-08-05T09:30:00Z
endDatequerystringoptionalExample: 2026-08-05T09:30:00Z
userIdqueryintegeroptionalExample: 123
Response examples3 documented statuses
200OKTransactionStatisticsResponse
{
  "TotalTransactions": 1,
  "TotalAmount": 100,
  "AverageAmount": 100,
  "AmountByCurrency": {},
  "CountByType": {},
  "CountByStatus": {},
  "DailyVolume": [
    {
      "Date": "2026-08-05T09:30:00Z",
      "Volume": 100,
      "Count": 1
    }
  ],
  "TopMerchants": [
    {
      "MerchantName": "string",
      "TotalAmount": 100,
      "TransactionCount": 1
    }
  ]
}
401UnauthorizedProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
500Internal Server ErrorNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/transactions/exportExport transactions in CSV or PDF formatRequest & responses +
Request exampleGET /api/v2/transactions/export
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/transactions/export?format=csv&types=example&statuses=example&startDate=2026-08-05T09%3A30%3A00Z&endDate=2026-08-05T09%3A30%3A00Z&search=example' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
formatquerystringoptionalExample: csv
typesqueryarrayoptionalExample: example
statusesqueryarrayoptionalExample: example
startDatequerystringoptionalExample: 2026-08-05T09:30:00Z
endDatequerystringoptionalExample: 2026-08-05T09:30:00Z
searchquerystringoptionalExample: example
minAmountquerynumberoptionalExample: 100
maxAmountquerynumberoptionalExample: 100
sourcesqueryarrayoptionalExample: example
cardIdsqueryarrayoptionalExample: 789
walletIdsqueryarrayoptionalExample: 123
userIdqueryintegeroptionalExample: 123
Response examples4 documented statuses
200OKFileResult
{
  "ContentType": "string",
  "FileDownloadName": "string",
  "LastModified": "2026-08-05T09:30:00Z",
  "EntityTag": {
    "Tag": {
      "Buffer": "string",
      "Offset": 1,
      "Length": 1,
      "Value": "string",
      "HasValue": true
    },
    "IsWeak": true
  },
  "EnableRangeProcessing": true
}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
401UnauthorizedProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
500Internal Server ErrorNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/transactions/top-upProcesses a wallet top-up operation using external payment methods.Request & responses +
Request examplePOST /api/v2/transactions/top-up
application/jsonSchema: WalletTopUpRequest
curl --request POST 'https://staging.hoppa.global/api/v2/transactions/top-up' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Token": "USDC",
  "WalletAddress": "0x1111111111111111111111111111111111111111",
  "Value": 100
}'
Example request body
{
  "Token": "USDC",
  "WalletAddress": "0x1111111111111111111111111111111111111111",
  "Value": 100
}
Response examples4 documented statuses
200OKTopUpResponse
{
  "Success": true,
  "TransakUrl": "https://example.com/callback",
  "OrderId": "string",
  "Token": "USDC",
  "Value": 100,
  "WalletAddress": "0x1111111111111111111111111111111111111111",
  "Message": "string",
  "ErrorCode": "string",
  "ErrorMessage": "string",
  "Fee": 100,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "Configuration": {
    "FiatCurrency": "USD",
    "CryptoCurrency": "USDC",
    "Network": "string",
    "MinAmount": 100,
    "MaxAmount": 100,
    "IsTestMode": true
  }
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

Transfers17 operations
GET/api/v2/transfers/{transferId}Get transfer by IDRequest & responses +
Request exampleGET /api/v2/transfers/{transferId}
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/transfers/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
transferIdpathintegerrequiredExample: 123
Response examples3 documented statuses
200OKTransferResponseV2
{
  "Id": 123,
  "UserId": 123,
  "Status": "PENDING",
  "Amount": "100.00",
  "Currency": "USD",
  "SourceType": "CRYPTO_ASSETS",
  "DestinationType": "CRYPTO_ASSETS",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "Metadata": {},
  "TransferType": "string",
  "Message": "string",
  "ErrorCode": "string",
  "FeeAmount": "100.00",
  "FeeCurrency": "USD",
  "FeeType": "None",
  "NetAmount": "100.00"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/transfers/user-to-masterCreate a transfer from user to master accountRequest & responses +
Request examplePOST /api/v2/transfers/user-to-master
application/jsonSchema: UserToMasterTransferPayloadV2
curl --request POST 'https://staging.hoppa.global/api/v2/transfers/user-to-master' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "Metadata": {}
}'
Example request body
{
  "UserId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "Metadata": {}
}
Response examples5 documented statuses
201CreatedTransferResponseV2
{
  "Id": 123,
  "UserId": 123,
  "Status": "PENDING",
  "Amount": "100.00",
  "Currency": "USD",
  "SourceType": "CRYPTO_ASSETS",
  "DestinationType": "CRYPTO_ASSETS",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "Metadata": {},
  "TransferType": "string",
  "Message": "string",
  "ErrorCode": "string",
  "FeeAmount": "100.00",
  "FeeCurrency": "USD",
  "FeeType": "None",
  "NetAmount": "100.00"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/transfers/master-to-userCreate a transfer from master account to userRequest & responses +
Request examplePOST /api/v2/transfers/master-to-user
application/jsonSchema: MasterToUserTransferPayloadV2
curl --request POST 'https://staging.hoppa.global/api/v2/transfers/master-to-user' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "Metadata": {}
}'
Example request body
{
  "UserId": 123,
  "Amount": "100.00",
  "Currency": "USD",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "Metadata": {}
}
Response examples4 documented statuses
201CreatedTransferResponseV2
{
  "Id": 123,
  "UserId": 123,
  "Status": "PENDING",
  "Amount": "100.00",
  "Currency": "USD",
  "SourceType": "CRYPTO_ASSETS",
  "DestinationType": "CRYPTO_ASSETS",
  "Description": "Example description",
  "ExternalReferenceId": "external_reference_123",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "Metadata": {},
  "TransferType": "string",
  "Message": "string",
  "ErrorCode": "string",
  "FeeAmount": "100.00",
  "FeeCurrency": "USD",
  "FeeType": "None",
  "NetAmount": "100.00"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/transfersList transfers with filtering and paginationRequest & responses +
Request exampleGET /api/v2/transfers
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/transfers?pageNumber=1&pageSize=10&userId=123&status=PENDING&currency=USD&dateFrom=2026-08-05' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
pageNumberqueryintegeroptionalExample: 1
pageSizequeryintegeroptionalExample: 10
userIdqueryintegeroptionalExample: 123
statusqueryTransferStatusV2optionalExample: PENDING
currencyquerystringoptionalExample: USD
dateFromquerystringoptionalExample: 2026-08-05
dateToquerystringoptionalExample: 2026-08-05
Response examples2 documented statuses
200OKTransferListResponseV2
{
  "Transfers": [
    {
      "Id": 123,
      "UserId": 123,
      "Status": "PENDING",
      "Amount": "100.00",
      "Currency": "USD",
      "SourceType": "CRYPTO_ASSETS",
      "DestinationType": "CRYPTO_ASSETS",
      "Description": "Example description",
      "ExternalReferenceId": "external_reference_123",
      "CreatedAt": "2026-08-05T09:30:00Z",
      "CompletedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z",
      "Metadata": {},
      "TransferType": "string",
      "Message": "string",
      "ErrorCode": "string",
      "FeeAmount": "100.00",
      "FeeCurrency": "USD",
      "FeeType": "None",
      "NetAmount": "100.00"
    }
  ],
  "Total": 1,
  "PageNumber": 1,
  "PageSize": 1,
  "TotalPages": 1
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/transfers/wallet-topupRequest a wallet top-up via TransakRequest & responses +
Request examplePOST /api/v2/transfers/wallet-topup
application/jsonSchema: WalletTopUpRequest
curl --request POST 'https://staging.hoppa.global/api/v2/transfers/wallet-topup?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Token": "USDC",
  "WalletAddress": "0x1111111111111111111111111111111111111111",
  "Value": 100
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "Token": "USDC",
  "WalletAddress": "0x1111111111111111111111111111111111111111",
  "Value": 100
}
Response examples4 documented statuses
200OKTopUpResponse
{
  "Success": true,
  "TransakUrl": "https://example.com/callback",
  "OrderId": "string",
  "Token": "USDC",
  "Value": 100,
  "WalletAddress": "0x1111111111111111111111111111111111111111",
  "Message": "string",
  "ErrorCode": "string",
  "ErrorMessage": "string",
  "Fee": 100,
  "CreatedAt": "2026-08-05T09:30:00Z",
  "Configuration": {
    "FiatCurrency": "USD",
    "CryptoCurrency": "USDC",
    "Network": "string",
    "MinAmount": 100,
    "MaxAmount": 100,
    "IsTestMode": true
  }
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/transfers/crypto-to-quantum-transferCreate a crypto-to-quantum transfer for internal account transfers (destination is always USD)Request & responses +
Request examplePOST /api/v2/transfers/crypto-to-quantum-transfer
application/jsonSchema: CryptoToQuantumTransferBodyRequestV2
curl --request POST 'https://staging.hoppa.global/api/v2/transfers/crypto-to-quantum-transfer?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "SourceCurrency": "USD",
  "Amount": 100,
  "DestinationCurrency": "USD"
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "SourceCurrency": "USD",
  "Amount": 100,
  "DestinationCurrency": "USD"
}
Response examples5 documented statuses
200OKCryptoToQuantumTransferResponse
{
  "Success": true,
  "TransferId": "string",
  "Message": "string",
  "ErrorCode": "string",
  "ErrorMessage": "string",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "Details": {
    "SourceCurrency": "USD",
    "DestinationCurrency": "USD",
    "Amount": 100,
    "Status": "PENDING",
    "InterlaceAccountId": "string",
    "TransferPath": "string",
    "RequiresExchange": true,
    "ExchangeRate": 100,
    "AvailableBalances": {},
    "RequiredAmount": 100,
    "TotalAvailableValue": 100
  }
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/transfers/quantum-usd-to-crypto-exchangeExchange Quantum USD to Crypto (USDC/USDT)Request & responses +
Request examplePOST /api/v2/transfers/quantum-usd-to-crypto-exchange
application/jsonSchema: QuantumToCryptoExchangeRequest
curl --request POST 'https://staging.hoppa.global/api/v2/transfers/quantum-usd-to-crypto-exchange?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Currency": "USD",
  "Amount": 100
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "Currency": "USD",
  "Amount": 100
}
Response examples5 documented statuses
200OKQuantumToCryptoExchangeResponse
{
  "Success": true,
  "Message": "string",
  "ErrorCode": "string",
  "SourceAmount": 100,
  "TargetCurrency": "USD",
  "CryptoAmountReceived": 100,
  "Rate": 100,
  "Fee": 100,
  "TradeId": "string",
  "Status": "PENDING",
  "InitiatedAt": "2026-08-05T09:30:00Z",
  "Details": {
    "FinalCryptoBalance": 100,
    "FinalQuantumBalance": 100
  }
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/transfers/withdrawals/fee-and-quotaGet withdrawal fee and quota informationRequest & responses +
Request exampleGET /api/v2/transfers/withdrawals/fee-and-quota
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/transfers/withdrawals/fee-and-quota?userId=123&chain=example&address=example&currency=USD&amount=100.00' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
chainquerystringoptionalExample: example
addressquerystringoptionalExample: example
currencyquerystringoptionalExample: USD
amountquerystringoptionalExample: 100.00
Response examples4 documented statuses
200OKFeeAndQuotaResponse
{
  "Code": "string",
  "Message": "string",
  "Data": {
    "CrossChainQuota": "string",
    "CrossChainFeeRate": "100.00",
    "CrossChainAmount": "100.00",
    "Fees": [
      {
        "Amount": "100.00",
        "Currency": "USD",
        "Type": "string"
      }
    ]
  }
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/transfers/withdrawals/available-balanceGet available withdrawal balance for a userRequest & responses +
Request exampleGET /api/v2/transfers/withdrawals/available-balance
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/transfers/withdrawals/available-balance?userId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
Response examples5 documented statuses
200OKAvailableWithdrawalBalanceResponse
{
  "TotalAvailableUSDT": 100,
  "TotalAvailableUSDC": 100,
  "WalletBreakdown": [
    {
      "WalletType": "string",
      "Currency": "USD",
      "Balance": 100,
      "USDValue": 100,
      "USDTEquivalent": 100,
      "USDCEquivalent": 100
    }
  ],
  "ExchangeRateUSDToUSDT": 100,
  "ExchangeRateUSDToUSDC": 100
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/transfers/withdrawals/cryptoCreate an external crypto withdrawal (to blockchain address)Request & responses +
Request examplePOST /api/v2/transfers/withdrawals/crypto
application/jsonSchema: ExternalCryptoWithdrawalRequest
curl --request POST 'https://staging.hoppa.global/api/v2/transfers/withdrawals/crypto' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "UserId": 123,
  "Currency": "USD",
  "Chain": "string",
  "Amount": "100.00",
  "DestinationAddress": "0x1111111111111111111111111111111111111111",
  "ConfirmExchangeRate": true,
  "Description": "Example description",
  "Metadata": {}
}'
Example request body
{
  "UserId": 123,
  "Currency": "USD",
  "Chain": "string",
  "Amount": "100.00",
  "DestinationAddress": "0x1111111111111111111111111111111111111111",
  "ConfirmExchangeRate": true,
  "Description": "Example description",
  "Metadata": {}
}
Response examples6 documented statuses
201CreatedExternalCryptoWithdrawalResponse
{
  "Success": true,
  "TransactionId": "string",
  "InterlaceTransferId": "string",
  "WithdrawalRequestId": 123,
  "Status": "PENDING",
  "ActualAmount": 100,
  "Currency": "USD",
  "Fees": [
    {
      "Amount": "100.00",
      "Currency": "USD",
      "Type": "string"
    }
  ],
  "Message": "string",
  "OtpRequired": true,
  "OtpExpiresAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
422Unprocessable EntityErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/transfers/withdrawals/crypto/confirmConfirm a crypto withdrawal with an emailed OTP codeRequest & responses +
Request examplePOST /api/v2/transfers/withdrawals/crypto/confirm
application/jsonSchema: ConfirmCryptoWithdrawalOtpRequest
curl --request POST 'https://staging.hoppa.global/api/v2/transfers/withdrawals/crypto/confirm' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "WithdrawalRequestId": 123,
  "OtpCode": "string",
  "UserId": 123
}'
Example request body
{
  "WithdrawalRequestId": 123,
  "OtpCode": "string",
  "UserId": 123
}
Response examples7 documented statuses
200OKExternalCryptoWithdrawalResponse
{
  "Success": true,
  "TransactionId": "string",
  "InterlaceTransferId": "string",
  "WithdrawalRequestId": 123,
  "Status": "PENDING",
  "ActualAmount": 100,
  "Currency": "USD",
  "Fees": [
    {
      "Amount": "100.00",
      "Currency": "USD",
      "Type": "string"
    }
  ],
  "Message": "string",
  "OtpRequired": true,
  "OtpExpiresAt": "2026-08-05T09:30:00Z"
}
202AcceptedExternalCryptoWithdrawalResponse
{
  "Success": true,
  "TransactionId": "string",
  "InterlaceTransferId": "string",
  "WithdrawalRequestId": 123,
  "Status": "PENDING",
  "ActualAmount": 100,
  "Currency": "USD",
  "Fees": [
    {
      "Amount": "100.00",
      "Currency": "USD",
      "Type": "string"
    }
  ],
  "Message": "string",
  "OtpRequired": true,
  "OtpExpiresAt": "2026-08-05T09:30:00Z"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
503Service UnavailableErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/transfers/withdrawals/validateValidate withdrawal requestRequest & responses +
Request exampleGET /api/v2/transfers/withdrawals/validate
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/transfers/withdrawals/validate?userId=123&currency=USD&amount=100' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
currencyquerystringoptionalExample: USD
amountquerynumberoptionalExample: 100
Response examples3 documented statuses
200OKWithdrawalValidationResult
{
  "IsValid": true,
  "UserId": 123,
  "RequestedAmount": 100,
  "RequestedCurrency": "USD",
  "ErrorCode": "string",
  "ErrorMessage": "string",
  "UserFriendlyMessage": "string",
  "AvailableAmount": 100,
  "ShortfallAmount": 100,
  "BalanceBreakdown": {},
  "AvailableBalance": {
    "TotalAvailableUSDT": 100,
    "TotalAvailableUSDC": 100,
    "WalletBreakdown": [
      {
        "WalletType": "string",
        "Currency": "USD",
        "Balance": 100,
        "USDValue": 100,
        "USDTEquivalent": 100,
        "USDCEquivalent": 100
      }
    ],
    "ExchangeRateUSDToUSDT": 100,
    "ExchangeRateUSDToUSDC": 100
  },
  "OptimalTransferPath": "string",
  "RequiresInternalTransfer": true
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/transfers/crypto-transactionsGet user crypto transactions (CryptoConnect transfers)Request & responses +
Request exampleGET /api/v2/transfers/crypto-transactions
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/transfers/crypto-transactions?userId=123&id=123&transactionHash=example&referenceId=external_reference_123&startTime=example&endTime=example' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
idquerystringoptionalExample: 123
transactionHashquerystringoptionalExample: example
referenceIdquerystringoptionalExample: external_reference_123
startTimequerystringoptionalExample: example
endTimequerystringoptionalExample: example
limitqueryintegeroptionalExample: 10
pagequeryintegeroptionalExample: 1
Response examples5 documented statuses
200OKCryptoTransfersListResponse
{
  "Transfers": [
    {
      "Id": "string",
      "AccountId": "string",
      "ReferenceId": "external_reference_123",
      "Source": {
        "Type": "string",
        "Id": "string",
        "Chain": "string",
        "Address": "string"
      },
      "Destination": {
        "Type": "string",
        "Id": "string",
        "Chain": "string",
        "Address": "string"
      },
      "Amount": {
        "Amount": 100,
        "Currency": "USD"
      },
      "Fees": [
        {
          "Amount": 100,
          "Currency": "USD",
          "Type": "string"
        }
      ],
      "Status": "PENDING",
      "CreateTime": "2026-08-05T09:30:00Z",
      "CompleteTime": "2026-08-05T09:30:00Z"
    }
  ],
  "Total": 1,
  "Page": 1,
  "Limit": 1
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/transfers/crypto-refundsGet crypto refunds for a userRequest & responses +
Request exampleGET /api/v2/transfers/crypto-refunds
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/transfers/crypto-refunds?userId=123&id=123&transferId=123&transactionHash=example&referenceId=external_reference_123&startTime=example' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
idquerystringoptionalExample: 123
transferIdquerystringoptionalExample: 123
transactionHashquerystringoptionalExample: example
referenceIdquerystringoptionalExample: external_reference_123
startTimequerystringoptionalExample: example
endTimequerystringoptionalExample: example
limitqueryintegeroptionalExample: 10
pagequeryintegeroptionalExample: 1
Response examples5 documented statuses
200OKCryptoRefundsListResponse
{
  "Refunds": [
    {
      "Id": "string",
      "TransferId": "string",
      "AccountId": "string",
      "Destination": {
        "Type": "string",
        "Id": "string",
        "Chain": "string",
        "Address": "string"
      },
      "Amount": {
        "Amount": 100,
        "Currency": "USD"
      },
      "Fees": [
        {
          "Amount": 100,
          "Currency": "USD",
          "Type": "string"
        }
      ],
      "Status": "PENDING",
      "TransactionHash": "string",
      "ReferenceId": "external_reference_123",
      "CreateTime": "2026-08-05T09:30:00Z",
      "CompleteTime": "2026-08-05T09:30:00Z"
    }
  ],
  "Total": 1,
  "Page": 1,
  "Limit": 1
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/transfers/crypto-refundsCreate a crypto refundRequest & responses +
Request examplePOST /api/v2/transfers/crypto-refunds
application/jsonSchema: CreateCryptoRefundRequest
curl --request POST 'https://staging.hoppa.global/api/v2/transfers/crypto-refunds?userId=123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "TransferId": "string",
  "Address": "string"
}'
Parameters
userIdqueryintegeroptionalExample: 123
Example request body
{
  "TransferId": "string",
  "Address": "string"
}
Response examples5 documented statuses
201CreatedCreateCryptoRefundResponse
{
  "Success": true,
  "RefundId": "string",
  "TransferId": "string",
  "AccountId": "string",
  "Destination": {
    "Type": "string",
    "Id": "string",
    "Chain": "string",
    "Address": "string"
  },
  "Amount": {
    "Amount": 100,
    "Currency": "USD"
  },
  "Fees": [
    {
      "Amount": 100,
      "Currency": "USD",
      "Type": "string"
    }
  ],
  "Status": "PENDING",
  "ReferenceId": "external_reference_123",
  "CreateTime": "2026-08-05T09:30:00Z",
  "CompleteTime": "2026-08-05T09:30:00Z",
  "Message": "string"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/transfers/crypto-refunds/gas-feeGet refund gas fee for a specific currency and chainRequest & responses +
Request examplePOST /api/v2/transfers/crypto-refunds/gas-fee
application/jsonSchema: GetRefundGasFeeRequest
curl --request POST 'https://staging.hoppa.global/api/v2/transfers/crypto-refunds/gas-fee' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Currency": "USD",
  "Chain": "string"
}'
Example request body
{
  "Currency": "USD",
  "Chain": "string"
}
Response examples4 documented statuses
200OKGetRefundGasFeeResponse
{
  "Fees": [
    {
      "Amount": 100,
      "Currency": "USD",
      "Type": "string"
    }
  ],
  "Message": "string"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/transfers/test-feesTest endpoint for fee charging flowtestRequest & responses +
Request examplePOST /api/v2/transfers/test-fees
No request body
curl --request POST 'https://staging.hoppa.global/api/v2/transfers/test-fees?userId=123&completeFee=100&whitelabelFee=100' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdqueryintegeroptionalExample: 123
completeFeequerynumberoptionalExample: 100
whitelabelFeequerynumberoptionalExample: 100
Response examples4 documented statuses
200OKapplication/json
{}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

Users17 operations
GET/api/v2/usersList users with filtering and paginationRequest & responses +
Request exampleGET /api/v2/users
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/users?pageNumber=1&pageSize=10&query=example&status=PENDING&kycStatus=SUBMITTED&externalUserId=external_reference_123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
pageNumberqueryintegeroptionalExample: 1
pageSizequeryintegeroptionalExample: 10
queryquerystringoptionalExample: example
statusqueryAccountStatusV2optionalExample: PENDING
kycStatusqueryKycStatusV2optionalExample: SUBMITTED
externalUserIdquerystringoptionalExample: external_reference_123
dateFromquerystringoptionalExample: 2026-08-05
dateToquerystringoptionalExample: 2026-08-05
Response examples3 documented statuses
200OKUserListResponseV2
{
  "Users": [
    {
      "Id": 123,
      "ExternalUserId": "external_reference_123",
      "Email": "user@example.com",
      "FirstName": "Jane",
      "LastName": "Doe",
      "Status": "PENDING",
      "KycStatus": "SUBMITTED",
      "KycLevel": "HOPPA_PRODUCTION",
      "CreatedAt": "2026-08-05T09:30:00Z",
      "UpdatedAt": "2026-08-05T09:30:00Z",
      "CompanyId": 123,
      "PackageId": 123,
      "BusinessName": "string",
      "BusinessExternalId": "external_reference_123",
      "BusinessParentId": 123,
      "AccountType": "business",
      "PrimaryExternalWalletId": "external_reference_123",
      "SelectedTierId": 123,
      "TierBillingCycle": "string",
      "OnboardingProductPreference": "external_reference_123"
    }
  ],
  "Total": 1,
  "PageNumber": 1,
  "PageSize": 1,
  "TotalPages": 1
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/usersCreate a new userRequest & responses +
Request examplePOST /api/v2/users
application/jsonSchema: UserCreateV2
curl --request POST 'https://staging.hoppa.global/api/v2/users' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Email": "user@example.com",
  "FirstName": "Jane",
  "LastName": "Doe",
  "ExternalUserId": "external_reference_123",
  "Phone": "+447700900123",
  "TierId": 123,
  "TierBillingCycle": "string",
  "Metadata": {},
  "InitialKycSource": "SUMSUB",
  "DateOfBirth": "2026-08-05",
  "Address": "string",
  "City": "London",
  "State": "string",
  "Country": "GB",
  "ZipCode": "SW1A 1AA",
  "CreateMandate": true,
  "MandateMaxAmount": "2026-08-05",
  "MandateCurrency": "2026-08-05",
  "MandateDescription": "2026-08-05",
  "BusinessName": "string",
  "BusinessExternalId": "external_reference_123",
  "BusinessParentId": 123,
  "ReferralId": "string",
  "AccountType": "business"
}'
Example request body
{
  "Email": "user@example.com",
  "FirstName": "Jane",
  "LastName": "Doe",
  "ExternalUserId": "external_reference_123",
  "Phone": "+447700900123",
  "TierId": 123,
  "TierBillingCycle": "string",
  "Metadata": {},
  "InitialKycSource": "SUMSUB",
  "DateOfBirth": "2026-08-05",
  "Address": "string",
  "City": "London",
  "State": "string",
  "Country": "GB",
  "ZipCode": "SW1A 1AA",
  "CreateMandate": true,
  "MandateMaxAmount": "2026-08-05",
  "MandateCurrency": "2026-08-05",
  "MandateDescription": "2026-08-05",
  "BusinessName": "string",
  "BusinessExternalId": "external_reference_123",
  "BusinessParentId": 123,
  "ReferralId": "string",
  "AccountType": "business"
}
Response examples4 documented statuses
201CreatedUserResponseV2
{
  "Id": 123,
  "ExternalUserId": "external_reference_123",
  "Email": "user@example.com",
  "FirstName": "Jane",
  "LastName": "Doe",
  "Status": "PENDING",
  "KycStatus": "SUBMITTED",
  "KycLevel": "HOPPA_PRODUCTION",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "CompanyId": 123,
  "PackageId": 123,
  "BusinessName": "string",
  "BusinessExternalId": "external_reference_123",
  "BusinessParentId": 123,
  "AccountType": "business",
  "PrimaryExternalWalletId": "external_reference_123",
  "SelectedTierId": 123,
  "TierBillingCycle": "string",
  "OnboardingProductPreference": "external_reference_123"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
409ConflictErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/users/{userId}Get user by IDRequest & responses +
Request exampleGET /api/v2/users/{userId}
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/users/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdpathintegerrequiredExample: 123
Response examples3 documented statuses
200OKUserDetailResponseV2
{
  "Phone": "+447700900123",
  "DateOfBirth": "2026-08-05",
  "Address": "string",
  "City": "London",
  "State": "string",
  "Country": "GB",
  "ZipCode": "SW1A 1AA",
  "KycProvider": "string",
  "KycVerificationId": "string",
  "KycVerificationDate": "2026-08-05",
  "KycRejectionReason": "string",
  "KycCompletedAt": "2026-08-05T09:30:00Z",
  "SumsubTokenForTransak": "USDC",
  "LastKycSubmissionId": 123,
  "LastKycSumsubUserId": "string",
  "LastKycProviderStatus": "PENDING",
  "LastKycProviderApplicationId": "string",
  "ReferralId": "string",
  "Id": 123,
  "ExternalUserId": "external_reference_123",
  "Email": "user@example.com",
  "FirstName": "Jane",
  "LastName": "Doe",
  "Status": "PENDING",
  "KycStatus": "SUBMITTED",
  "KycLevel": "HOPPA_PRODUCTION",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "CompanyId": 123,
  "PackageId": 123,
  "BusinessName": "string",
  "BusinessExternalId": "external_reference_123"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/users/{userId}Update user informationRequest & responses +
Request examplePUT /api/v2/users/{userId}
application/jsonSchema: UserUpdateV2
curl --request PUT 'https://staging.hoppa.global/api/v2/users/123' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "ExternalUserId": "external_reference_123",
  "FirstName": "Jane",
  "LastName": "Doe",
  "Phone": "+447700900123",
  "Metadata": {}
}'
Parameters
userIdpathintegerrequiredExample: 123
Example request body
{
  "ExternalUserId": "external_reference_123",
  "FirstName": "Jane",
  "LastName": "Doe",
  "Phone": "+447700900123",
  "Metadata": {}
}
Response examples4 documented statuses
200OKUserResponseV2
{
  "Id": 123,
  "ExternalUserId": "external_reference_123",
  "Email": "user@example.com",
  "FirstName": "Jane",
  "LastName": "Doe",
  "Status": "PENDING",
  "KycStatus": "SUBMITTED",
  "KycLevel": "HOPPA_PRODUCTION",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "UpdatedAt": "2026-08-05T09:30:00Z",
  "CompanyId": 123,
  "PackageId": 123,
  "BusinessName": "string",
  "BusinessExternalId": "external_reference_123",
  "BusinessParentId": 123,
  "AccountType": "business",
  "PrimaryExternalWalletId": "external_reference_123",
  "SelectedTierId": 123,
  "TierBillingCycle": "string",
  "OnboardingProductPreference": "external_reference_123"
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/users/occupation-codesGet complete list of occupation codesRequest & responses +
Request exampleGET /api/v2/users/occupation-codes
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/users/occupation-codes' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples2 documented statuses
200OKapplication/json
[
  {
    "Value": "string",
    "Title": "string",
    "MajorGroup": "string",
    "MinorGroup": "string"
  }
]
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/users/{userId}/kyc/verifyVerify and update user KYC information with comprehensive verification dataRequest & responses +
Request examplePOST /api/v2/users/{userId}/kyc/verify
application/jsonSchema: UserKycVerificationRequestV2
curl --request POST 'https://staging.hoppa.global/api/v2/users/123/kyc/verify' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "KycStatus": "SUBMITTED",
  "KycLevel": "HOPPA_PRODUCTION",
  "Occupation": "string",
  "AnnualSalary": "0-10000",
  "AccountPurpose": "Example description",
  "ExpectedMonthlyVolume": "0-1000",
  "DocumentIssueDate": "2026-08-05",
  "VerificationId": "string",
  "KycProvider": "string",
  "FirstName": "Jane",
  "LastName": "Doe",
  "DateOfBirth": "2026-08-05",
  "Gender": "string",
  "Nationality": "string",
  "Email": "user@example.com",
  "PhoneNumber": "+447700900123",
  "IpAddress": "string",
  "EqualsMainPurpose": [
    "SALARY_OR_INCOME"
  ],
  "EqualsSourceOfFunds": [
    "RECEIVING_FUNDS_FROM_OWN_ACCOUNTS"
  ],
  "EqualsCurrenciesRequired": [
    "AED"
  ],
  "EqualsDestinationCountries": [
    "AD"
  ],
  "EqualsExpectedAnnualVolume": "0-10000",
  "EqualsExpectedPayments": "FEWER-THAN-5",
  "NationalId": "string",
  "DocumentType": "string",
  "DocumentNumber": "string",
  "DocumentExpiryDate": "2026-08-05",
  "DocumentIssuingCountry": "GB",
  "DocumentIssuingAuthority": "string",
  "DocumentIssuedAt": "string",
  "DocumentFrontImage": "BASE64_ENCODED_DATA",
  "DocumentBackImage": "BASE64_ENCODED_DATA"
}'
Parameters
userIdpathintegerrequiredExample: 123
Example request body
{
  "KycStatus": "SUBMITTED",
  "KycLevel": "HOPPA_PRODUCTION",
  "Occupation": "string",
  "AnnualSalary": "0-10000",
  "AccountPurpose": "Example description",
  "ExpectedMonthlyVolume": "0-1000",
  "DocumentIssueDate": "2026-08-05",
  "VerificationId": "string",
  "KycProvider": "string",
  "FirstName": "Jane",
  "LastName": "Doe",
  "DateOfBirth": "2026-08-05",
  "Gender": "string",
  "Nationality": "string",
  "Email": "user@example.com",
  "PhoneNumber": "+447700900123",
  "IpAddress": "string",
  "EqualsMainPurpose": [
    "SALARY_OR_INCOME"
  ],
  "EqualsSourceOfFunds": [
    "RECEIVING_FUNDS_FROM_OWN_ACCOUNTS"
  ],
  "EqualsCurrenciesRequired": [
    "AED"
  ],
  "EqualsDestinationCountries": [
    "AD"
  ],
  "EqualsExpectedAnnualVolume": "0-10000",
  "EqualsExpectedPayments": "FEWER-THAN-5",
  "NationalId": "string",
  "DocumentType": "string",
  "DocumentNumber": "string",
  "DocumentExpiryDate": "2026-08-05",
  "DocumentIssuingCountry": "GB",
  "DocumentIssuingAuthority": "string",
  "DocumentIssuedAt": "string",
  "DocumentFrontImage": "BASE64_ENCODED_DATA",
  "DocumentBackImage": "BASE64_ENCODED_DATA"
}
Response examples4 documented statuses
200OKUserKycVerificationResponseV2
{
  "Success": true,
  "Message": "string",
  "User": {
    "Id": 123,
    "KycStatus": "SUBMITTED",
    "KycLevel": "HOPPA_PRODUCTION",
    "KycProvider": "string",
    "VerificationId": "string",
    "FirstName": "Jane",
    "LastName": "Doe",
    "Email": "user@example.com",
    "PhoneNumber": "+447700900123",
    "DateOfBirth": "2026-08-05",
    "Nationality": "string",
    "DocumentType": "string",
    "DocumentNumber": "string",
    "AddressLine1": "string",
    "AddressLine2": "string",
    "City": "London",
    "Region": "string",
    "Country": "GB",
    "PostalCode": "SW1A 1AA",
    "RejectionReason": "string",
    "ReviewNotes": "string",
    "VerifiedAt": "string",
    "UpdatedAt": "2026-08-05T09:30:00Z"
  }
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/users/{userId}/crypto-addressesGet user crypto wallet addresses. Passing `userId = 0` returns master account addresses for the authenticated company.Request & responses +
Request exampleGET /api/v2/users/{userId}/crypto-addresses
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/users/123/crypto-addresses' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdpathintegerrequiredExample: 123
Response examples3 documented statuses
200OKUserCryptoAddressListResponseV2
{
  "UserId": 123,
  "Addresses": [
    {
      "Address": "string",
      "Currency": "USD",
      "Chain": "string",
      "Tag": "string",
      "Network": "string",
      "IsActive": true,
      "CreatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "CryptoAddresses": [
    {
      "Address": "string",
      "Currency": "USD",
      "Chain": "string",
      "Tag": "string",
      "Network": "string",
      "IsActive": true,
      "CreatedAt": "2026-08-05T09:30:00Z"
    }
  ]
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/users/{userId}/assetsGet user assets (balances). Passing `userId = 0` returns master account balances for the authenticated company.Request & responses +
Request exampleGET /api/v2/users/{userId}/assets
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/users/123/assets?interlaceAccountId=123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdpathintegerrequiredExample: 123
interlaceAccountIdquerystringoptionalExample: 123
Response examples3 documented statuses
200OKUserAssetsResponseV2
{
  "UserId": 123,
  "Assets": [
    {
      "Id": 123,
      "Currency": "USD",
      "Balance": "100.00",
      "AvailableBalance": "100.00",
      "FrozenBalance": "100.00",
      "PendingBalance": "100.00",
      "Network": "string",
      "AssetType": "string",
      "BalanceType": "100.00",
      "BalanceId": "100.00",
      "CreatedAt": "2026-08-05T09:30:00Z"
    }
  ],
  "RetrievedAt": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

PUT/api/v2/users/{userId}/kyc/sumsub-tokenUpdate user SumSub KYC tokenRequest & responses +
Request examplePUT /api/v2/users/{userId}/kyc/sumsub-token
application/jsonSchema: UserKycSumSubTokenRequestV2
curl --request PUT 'https://staging.hoppa.global/api/v2/users/123/kyc/sumsub-token' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "SumsubSdkToken": "USDC",
  "DocumentIssueDate": "2026-08-05",
  "ExpiryDate": "2026-08-05",
  "PhoneCountryCode": "+447700900123",
  "Phone": "+447700900123",
  "Occupation": "string",
  "AnnualSalary": "0-10000",
  "AccountPurpose": "Example description",
  "ExpectedMonthlyVolume": "0-1000",
  "FirstName": "Jane",
  "LastName": "Doe",
  "MiddleName": "string",
  "Dob": "2026-08-05",
  "Gender": "string",
  "Nationality": "string",
  "Country": "GB",
  "PlaceOfBirth": "string",
  "CountryOfBirth": "GB",
  "Email": "user@example.com",
  "NationalId": "string",
  "IdType": "string",
  "Ssn": "string",
  "IpAddress": "string",
  "Street": "string",
  "Street2": "string",
  "City": "London",
  "State": "string",
  "PostCode": "SW1A 1AA",
  "AddressCountry": "GB"
}'
Parameters
userIdpathintegerrequiredExample: 123
Example request body
{
  "SumsubSdkToken": "USDC",
  "DocumentIssueDate": "2026-08-05",
  "ExpiryDate": "2026-08-05",
  "PhoneCountryCode": "+447700900123",
  "Phone": "+447700900123",
  "Occupation": "string",
  "AnnualSalary": "0-10000",
  "AccountPurpose": "Example description",
  "ExpectedMonthlyVolume": "0-1000",
  "FirstName": "Jane",
  "LastName": "Doe",
  "MiddleName": "string",
  "Dob": "2026-08-05",
  "Gender": "string",
  "Nationality": "string",
  "Country": "GB",
  "PlaceOfBirth": "string",
  "CountryOfBirth": "GB",
  "Email": "user@example.com",
  "NationalId": "string",
  "IdType": "string",
  "Ssn": "string",
  "IpAddress": "string",
  "Street": "string",
  "Street2": "string",
  "City": "London",
  "State": "string",
  "PostCode": "SW1A 1AA",
  "AddressCountry": "GB"
}
Response examples3 documented statuses
200OKUserKycSumSubTokenUpdateResponse
{
  "UserId": 123,
  "SumsubSdkToken": "USDC",
  "Message": "string",
  "Success": true,
  "SumsubUserId": "string",
  "UpdatedAt": "2026-08-05T09:30:00Z"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/users/{userId}/kyc/sumsub-access-tokenGet a SumSub access token for the user (for mobile SDK)Request & responses +
Request examplePOST /api/v2/users/{userId}/kyc/sumsub-access-token
application/jsonSchema: SumSubAccessTokenRequestV2
curl --request POST 'https://staging.hoppa.global/api/v2/users/123/kyc/sumsub-access-token' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Occupation": "string",
  "AnnualSalary": "0-10000",
  "AccountPurpose": "Example description",
  "ExpectedMonthlyVolume": "0-1000",
  "DocumentIssueDate": "2026-08-05",
  "IpAddress": "string"
}'
Parameters
userIdpathintegerrequiredExample: 123
Example request body
{
  "Occupation": "string",
  "AnnualSalary": "0-10000",
  "AccountPurpose": "Example description",
  "ExpectedMonthlyVolume": "0-1000",
  "DocumentIssueDate": "2026-08-05",
  "IpAddress": "string"
}
Response examples4 documented statuses
200OKSumSubAccessTokenApiResponseV2
{
  "Success": true,
  "Token": "USDC",
  "UserId": "string",
  "Error": {}
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/users/{userId}/kyc/detailed-statusGet detailed KYC status breakdown for the userRequest & responses +
Request exampleGET /api/v2/users/{userId}/kyc/detailed-status
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/users/123/kyc/detailed-status' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdpathintegerrequiredExample: 123
Response examples4 documented statuses
200OKDetailedKycStatusResponseV2
{
  "HoppaCardKycApproved": true,
  "BankKycApproved": true,
  "CardIssuerKycApproved": true,
  "Interlace": {
    "Provider": "string",
    "Status": "PENDING",
    "Approved": true,
    "ExternalId": "external_reference_123",
    "LastUpdated": "2026-08-05T09:30:00Z"
  },
  "EqualsMoney": {
    "ApplicationId": "string",
    "ApplicationStatus": "PENDING",
    "AccountId": "string",
    "RequiredAction": "string",
    "ActionUrl": "https://example.com/callback",
    "additionalDocumentsRequested": [
      {
        "type": "string",
        "text": "string",
        "expectedResponseType": "string",
        "applicationId": "string",
        "informationRequestId": "string",
        "additionalInformation": "string",
        "associatedPersonId": "string",
        "requestedAt": "2026-08-05T09:30:00Z"
      }
    ],
    "Provider": "string",
    "Status": "PENDING",
    "Approved": true,
    "ExternalId": "external_reference_123",
    "LastUpdated": "2026-08-05T09:30:00Z"
  }
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/users/{userId}/kyc/equalsmoney/documentsUpload an additional document requested by EqualsMoney for a user. Requires company API key authentication.Request & responses +
Request examplePOST /api/v2/users/{userId}/kyc/equalsmoney/documents
multipart/form-data
curl --request POST 'https://staging.hoppa.global/api/v2/users/123/kyc/equalsmoney/documents' \
  -H 'x-api-key: YOUR_API_KEY' \
  -F 'File=@/absolute/path/document.pdf' \
  -F 'Type=string' \
  -F 'AssociatedPersonId=string'
Parameters
userIdpathintegerrequiredExample: 123
Example request body
{
  "File": "<binary file>",
  "Type": "string",
  "AssociatedPersonId": "string"
}
Response examples5 documented statuses
200OKEqualsMoneyAdditionalDocumentUploadResponseV2
{
  "Success": true,
  "DocumentId": "string",
  "Type": "string",
  "FileName": "string",
  "RemainingAdditionalDocumentsRequested": [
    {
      "type": "string",
      "text": "string",
      "expectedResponseType": "string",
      "applicationId": "string",
      "informationRequestId": "string",
      "additionalInformation": "string",
      "associatedPersonId": "string",
      "requestedAt": "2026-08-05T09:30:00Z"
    }
  ]
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/users/check-referralCheck if a referral code is valid for a companyRequest & responses +
Request exampleGET /api/v2/users/check-referral
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/users/check-referral?referralCode=example' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
referralCodequerystringoptionalExample: example
Response examples4 documented statuses
200OKReferralCheckResponse
{
  "Valid": true,
  "TierId": 123
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/users/{userId}/walletsList crypto wallets for a user. Passing `userId = 0` returns master account wallets for the authenticated company.Request & responses +
Request exampleGET /api/v2/users/{userId}/wallets
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/users/123/wallets?id=123&nickname=example&currency=USD&master=true&referenceId=external_reference_123&limit=10' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdpathintegerrequiredExample: 123
idquerystringoptionalExample: 123
nicknamequerystringoptionalExample: example
currencyquerystringoptionalExample: USD
masterquerybooleanoptionalExample: true
referenceIdquerystringoptionalExample: external_reference_123
limitqueryintegeroptionalExample: 10
pagequeryintegeroptionalExample: 1
Response examples4 documented statuses
200OKCryptoConnectWalletsV3Response
{
  "code": "string",
  "message": "string",
  "data": {
    "total": "string",
    "list": [
      {
        "id": "string",
        "accountId": "string",
        "nickname": "string",
        "master": true,
        "referenceId": "external_reference_123",
        "balances": [
          {}
        ],
        "addresses": [
          {}
        ]
      }
    ]
  }
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/users/create-interlace-account/{userId}Create an Interlace account for the authenticated userRequest & responses +
Request examplePOST /api/v2/users/create-interlace-account/{userId}
No request body
curl --request POST 'https://staging.hoppa.global/api/v2/users/create-interlace-account/123' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
userIdpathintegerrequiredExample: 123
Response examples4 documented statuses
200OKCreateInterlaceAccountResponse
{
  "Success": true,
  "InterlaceAccountId": "string",
  "ExternalUserId": "external_reference_123",
  "Message": "string",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "AccountAlreadyExists": true,
  "ErrorCode": "string",
  "ErrorMessage": "string"
}
400Bad RequestProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
401UnauthorizedProblemDetails
{
  "type": "string",
  "title": "string",
  "status": 1,
  "detail": "string",
  "instance": "string"
}
500Internal Server Errorapplication/json
{}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/users/{userId}/sumsub/kyc-urlGenerate SumSub KYC verification URL for userRequest & responses +
Request examplePOST /api/v2/users/{userId}/sumsub/kyc-url
application/jsonSchema: SumSubAccessTokenRequestV2
curl --request POST 'https://staging.hoppa.global/api/v2/users/123/sumsub/kyc-url' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "Occupation": "string",
  "AnnualSalary": "0-10000",
  "AccountPurpose": "Example description",
  "ExpectedMonthlyVolume": "0-1000",
  "DocumentIssueDate": "2026-08-05",
  "IpAddress": "string"
}'
Parameters
userIdpathintegerrequiredExample: 123
Example request body
{
  "Occupation": "string",
  "AnnualSalary": "0-10000",
  "AccountPurpose": "Example description",
  "ExpectedMonthlyVolume": "0-1000",
  "DocumentIssueDate": "2026-08-05",
  "IpAddress": "string"
}
Response examples6 documented statuses
200Returns the SumSub access tokenSumSubKycUrlResponse
{
  "Success": true,
  "ErrorCode": "string",
  "ErrorMessage": "string",
  "AccessToken": "USDC",
  "ApplicantId": "string",
  "ExternalUserId": "external_reference_123",
  "KycSubmissionId": 123,
  "Status": "PENDING",
  "ExistingStatus": "PENDING",
  "ExpiresAt": "2026-08-05T09:30:00Z",
  "CreatedAt": "2026-08-05T09:30:00Z",
  "CompletedAt": "2026-08-05T09:30:00Z",
  "IsNewApplicant": true,
  "Message": "string",
  "Configuration": {
    "LevelName": "string",
    "TokenValidityHours": 1,
    "Provider": "string",
    "IsTestMode": true,
    "SdkVersion": "string",
    "RequiredDocuments": [
      "string"
    ]
  }
}
400Invalid request or KYC already completedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401User not authenticatedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
403User does not belong to the companyErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404User not foundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal server errorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/users/{userId}/tierSet user tier and queue the first subscription fee for scheduled fee chargingRequest & responses +
Request examplePOST /api/v2/users/{userId}/tier
application/jsonSchema: SetUserTierRequest
curl --request POST 'https://staging.hoppa.global/api/v2/users/123/tier' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{
  "TierId": 123,
  "TierCycle": "string"
}'
Parameters
userIdpathintegerrequiredExample: 123
Example request body
{
  "TierId": 123,
  "TierCycle": "string"
}
Response examples5 documented statuses
200OKTierBuyResponse
{
  "Success": true,
  "UserId": 123,
  "TierId": 123,
  "TierName": "string",
  "TierLevel": "string",
  "OrderId": "string",
  "TotalCost": 100,
  "Currency": "USD",
  "Status": "PENDING",
  "PurchasedAt": "2026-08-05T09:30:00Z",
  "ActivatedAt": "2026-08-05T09:30:00Z",
  "ExpiresAt": "2026-08-05T09:30:00Z",
  "UpgradeDetails": {
    "PreviousTierName": "string",
    "PreviousTierLevel": "string",
    "NewTierName": "string",
    "NewTierLevel": "string",
    "IsUpgrade": true,
    "IsDowngrade": true,
    "IsRenewal": true,
    "ChangedFeatures": [
      "string"
    ],
    "AddedFeatures": [
      "string"
    ],
    "RemovedFeatures": [
      "string"
    ]
  },
  "PaymentDetails": {
    "PaymentMethod": "string",
    "WalletAddress": "0x1111111111111111111111111111111111111111",
    "TransactionId": "string",
    "AmountPaid": 100,
    "Amount": 100,
    "Currency": "USD",
    "PaymentDate": "2026-08-05T09:30:00Z",
    "ProcessedAt": "2026-08-05T09:30:00Z",
    "PaymentStatus": "PENDING",
    "Status": "PENDING",
    "FailureReason": "string"
  },
  "NewBenefits": {
    "MaxCards": 1,
    "DailySpendLimit": 100,
    "MonthlySpendLimit": 100,
    "DailyWithdrawLimit": 100,
    "MonthlyWithdrawLimit": 100,
    "VirtualCards": true,
    "PhysicalCards": true,
    "InternationalUsage": true,
    "PremiumSupport": true,
    "CashbackPercentage": 100,
    "SupportedCurrencies": [
      "string"
    ],
    "AvailableCardTypes": [
      {
        "Id": 123,
        "Name": "string",
        "Type": "string",
        "Price": 100,
        "IsVirtual": true,
        "IsPhysical": true,
        "IsActive": true,
        "MonthlyFee": 100,
        "YearlyFee": 100,
        "BankProviderType": 1,
        "CustomerPaysForProduction": true,
        "CustomerPaysForShippment": true
      }
    ]
  },
  "ErrorCode": "string",
  "ErrorMessage": "string",
  "Message": "string",
  "Audit": {
    "RequestedBy": "string",
    "RequestedAt": "2026-08-05T09:30:00Z",
    "RequestSource": "string",
    "IPAddress": "string",
    "UserAgent": "string",
    "IsSecureConnection": true,
    "AuthenticationMethod": "string",
    "AdditionalNotes": "string"
  },
  "PurchaseId": "00000000-0000-4000-8000-000000000123",
  "PurchaseExpiresAt": "2026-08-05T09:30:00Z",
  "StripePayment": {
    "PublishableKey": "string",
    "ClientSecret": "string",
    "PaymentIntentId": "string"
  }
}
400Bad RequestErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
401UnauthorizedErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
404Not FoundErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}
500Internal Server ErrorErrorResponse
{
  "Message": "string",
  "Code": "string",
  "Status": 1,
  "ValidationErrors": {},
  "Details": "string"
}

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

Webhooks64 operations
POST/webhooks/outbound/user.registereduser.registeredRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent after a user is created. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/user.registered
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/user.registered' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "user.registered",
  "domain": "user",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "email": "user@example.com"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "user.registered",
  "domain": "user",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "email": "user@example.com"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/user.kyc.updateduser.kyc.updatedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a user's KYC status changes during verification submission or provider processing. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/user.kyc.updated
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/user.kyc.updated' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "user.kyc.updated",
  "domain": "user",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "status": "pending"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "user.kyc.updated",
  "domain": "user",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "status": "pending"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/kyc.verifiedkyc.verifiedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Interlace or SumSub KYC review is processed. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/kyc.verified
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/kyc.verified' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "kyc.verified",
  "domain": "kyc",
  "provider": "sumsub",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "kycLevel": "hoppacard-stagging",
    "status": "approved"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "kyc.verified",
  "domain": "kyc",
  "provider": "sumsub",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "kycLevel": "hoppacard-stagging",
    "status": "approved"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/kyc.interlace_submission_failedkyc.interlace_submission_failedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when SumSub approval could not be submitted to Interlace. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/kyc.interlace_submission_failed
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/kyc.interlace_submission_failed' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "kyc.interlace_submission_failed",
  "domain": "kyc",
  "provider": "interlace",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "error": "Interlace submission failed",
    "accountId": "acc_123",
    "applicantId": "applicant_123"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "kyc.interlace_submission_failed",
  "domain": "kyc",
  "provider": "interlace",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "error": "Interlace submission failed",
    "accountId": "acc_123",
    "applicantId": "applicant_123"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/legal_entity.statuslegal_entity.statusRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a business legal entity status changes. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/legal_entity.status
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/legal_entity.status' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "legal_entity.status",
  "domain": "kyc",
  "provider": "bank",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "entityId": "le_123",
    "status": "approved",
    "type": "BUSINESS"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "legal_entity.status",
  "domain": "kyc",
  "provider": "bank",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "entityId": "le_123",
    "status": "approved",
    "type": "BUSINESS"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/bank_account.statusbank_account.statusRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a business bank account status changes. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/bank_account.status
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/bank_account.status' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "bank_account.status",
  "domain": "account",
  "provider": "bank",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "bankAccountId": "ba_123",
    "iban": "GB00HOPP00000000000000",
    "currency": "GBP",
    "status": "active"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "bank_account.status",
  "domain": "account",
  "provider": "bank",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "bankAccountId": "ba_123",
    "iban": "GB00HOPP00000000000000",
    "currency": "GBP",
    "status": "active"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/account.deposit.addressaccount.deposit.addressRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when deposit addresses are created for a user's account. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/account.deposit.address
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/account.deposit.address' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "account.deposit.address",
  "domain": "account",
  "provider": "bank",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "status": "created"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "account.deposit.address",
  "domain": "account",
  "provider": "bank",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "status": "created"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/account.createdaccount.createdRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money account is created. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/account.created
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/account.created' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "account.created",
  "domain": "account",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "AccountCreated",
    "correlationId": "corr_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "PENDING",
    "type": "INDIVIDUAL"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "account.created",
  "domain": "account",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "AccountCreated",
    "correlationId": "corr_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "PENDING",
    "type": "INDIVIDUAL"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/account.activatedaccount.activatedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money account is activated. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/account.activated
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/account.activated' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "account.activated",
  "domain": "account",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "AccountActivated",
    "id": "acc_eq_123",
    "correlationId": "corr_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "ACTIVE",
    "type": "INDIVIDUAL",
    "primaryOwnerPersonaId": "persona_123",
    "details": {
      "accountId": "acc_eq_123",
      "name": "Example Trading Account"
    },
    "settlementDetails": [
      {
        "currency": "GBP",
        "sortCode": "040075",
        "accountNumber": "12345678",
        "ibans": [
          {
            "iban": "GB29NWBK60161331926819",
            "bic": "NWBKGB2L"
          }
        ],
        "accountName": "Example Trading Account",
        "bankName": "Equals Money",
        "bankAddress": "London, United Kingdom",
        "balanceReference": "BAL-123"
      }
    ]
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "account.activated",
  "domain": "account",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "AccountActivated",
    "id": "acc_eq_123",
    "correlationId": "corr_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "ACTIVE",
    "type": "INDIVIDUAL",
    "primaryOwnerPersonaId": "persona_123",
    "details": {
      "accountId": "acc_eq_123",
      "name": "Example Trading Account"
    },
    "settlementDetails": [
      {
        "currency": "GBP",
        "sortCode": "040075",
        "accountNumber": "12345678",
        "ibans": [
          {
            "iban": "GB29NWBK60161331926819",
            "bic": "NWBKGB2L"
          }
        ],
        "accountName": "Example Trading Account",
        "bankName": "Equals Money",
        "bankAddress": "London, United Kingdom",
        "balanceReference": "BAL-123"
      }
    ]
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/account.status_updatedaccount.status_updatedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money account status changes. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/account.status_updated
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/account.status_updated' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "account.status_updated",
  "domain": "account",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "AccountStatusUpdated",
    "correlationId": "corr_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "SUSPENDED",
    "type": "INDIVIDUAL"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "account.status_updated",
  "domain": "account",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "AccountStatusUpdated",
    "correlationId": "corr_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "SUSPENDED",
    "type": "INDIVIDUAL"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/payment.completedpayment.completedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent after a payment completes successfully. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/payment.completed
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/payment.completed' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.completed",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "paymentId": 987,
    "amount": 25.5,
    "currency": "EUR"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.completed",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "paymentId": 987,
    "amount": 25.5,
    "currency": "EUR"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/payment.mandate.createdpayment.mandate.createdRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent after a payment mandate is created. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/payment.mandate.created
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/payment.mandate.created' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.mandate.created",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "paymentMandateId": 456,
    "maxAmount": 250,
    "currency": "EUR",
    "frequency": "monthly"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.mandate.created",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "paymentMandateId": 456,
    "maxAmount": 250,
    "currency": "EUR",
    "frequency": "monthly"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/payment.mandate.cancelledpayment.mandate.cancelledRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent after a payment mandate is cancelled. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/payment.mandate.cancelled
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/payment.mandate.cancelled' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.mandate.cancelled",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "paymentMandateId": 456
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.mandate.cancelled",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "paymentMandateId": 456
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/payment.request.createdpayment.request.createdRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent after a payment request is created. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/payment.request.created
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/payment.request.created' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.request.created",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "paymentRequestId": 789,
    "amount": 19.99,
    "currency": "EUR"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.request.created",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "paymentRequestId": 789,
    "amount": 19.99,
    "currency": "EUR"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/payment.request.cancelledpayment.request.cancelledRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent after a payment request is cancelled. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/payment.request.cancelled
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/payment.request.cancelled' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.request.cancelled",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "paymentRequestId": 789,
    "amount": 19.99,
    "currency": "EUR"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.request.cancelled",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "paymentRequestId": 789,
    "amount": 19.99,
    "currency": "EUR"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/payment.request.confirmed.directpayment.request.confirmed.directRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent after a payment request is confirmed by direct payment. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/payment.request.confirmed.direct
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/payment.request.confirmed.direct' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.request.confirmed.direct",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "paymentRequestId": 789,
    "paymentMandateId": 456,
    "amount": 19.99,
    "currency": "EUR",
    "transferId": "tr_123"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.request.confirmed.direct",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "paymentRequestId": 789,
    "paymentMandateId": 456,
    "amount": 19.99,
    "currency": "EUR",
    "transferId": "tr_123"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/payment.request.confirmed.with.exchangepayment.request.confirmed.with.exchangeRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent after a payment request is confirmed using crypto exchange. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/payment.request.confirmed.with.exchange
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/payment.request.confirmed.with.exchange' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.request.confirmed.with.exchange",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "paymentRequestId": 789,
    "paymentMandateId": 456,
    "amount": 19.99,
    "currency": "EUR",
    "transferId": "tr_123"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.request.confirmed.with.exchange",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "paymentRequestId": 789,
    "paymentMandateId": 456,
    "amount": 19.99,
    "currency": "EUR",
    "transferId": "tr_123"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/order.completedorder.completedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money payment order completes. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/order.completed
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/order.completed' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "order.completed",
  "domain": "payment",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "orderId": "order_123",
    "accountId": "account_123"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "order.completed",
  "domain": "payment",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "orderId": "order_123",
    "accountId": "account_123"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/order.createdorder.createdRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money FX order is created. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/order.created
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/order.created' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "order.created",
  "domain": "order",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "OrderCreated",
    "orderId": "order_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "CREATED",
    "buyCurrency": "EUR",
    "sellCurrency": "GBP",
    "buyAmount": 1000,
    "sellAmount": 850,
    "rate": 0.85,
    "payments": [
      {
        "settlementDate": "2026-04-29 00:00:00 UTC",
        "rate": 0.85,
        "inverseRate": 1.1765,
        "internalReference": "INT-123",
        "externalReference": "EXT-123",
        "from": {
          "amount": 850,
          "currency": "GBP"
        },
        "to": {
          "amount": 1000,
          "currency": "EUR"
        },
        "recipient": {
          "id": "recipient_123",
          "name": "Example Supplier Ltd"
        }
      }
    ]
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "order.created",
  "domain": "order",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "OrderCreated",
    "orderId": "order_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "CREATED",
    "buyCurrency": "EUR",
    "sellCurrency": "GBP",
    "buyAmount": 1000,
    "sellAmount": 850,
    "rate": 0.85,
    "payments": [
      {
        "settlementDate": "2026-04-29 00:00:00 UTC",
        "rate": 0.85,
        "inverseRate": 1.1765,
        "internalReference": "INT-123",
        "externalReference": "EXT-123",
        "from": {
          "amount": 850,
          "currency": "GBP"
        },
        "to": {
          "amount": 1000,
          "currency": "EUR"
        },
        "recipient": {
          "id": "recipient_123",
          "name": "Example Supplier Ltd"
        }
      }
    ]
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/order.cancelledorder.cancelledRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money FX order is cancelled. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/order.cancelled
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/order.cancelled' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "order.cancelled",
  "domain": "order",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "OrderCancelled",
    "orderId": "order_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "CANCELLED"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "order.cancelled",
  "domain": "order",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "OrderCancelled",
    "orderId": "order_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "CANCELLED"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/payout.paymentpayout.paymentRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a business payout payment update is processed. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/payout.payment
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/payout.payment' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payout.payment",
  "domain": "payout",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "ext_tx_123",
    "userId": 12345,
    "accountId": 321,
    "amount": 100,
    "currency": "EUR",
    "status": "completed",
    "transferId": "transfer_123",
    "type": "PAYOUT.PAYMENT"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payout.payment",
  "domain": "payout",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "ext_tx_123",
    "userId": 12345,
    "accountId": 321,
    "amount": 100,
    "currency": "EUR",
    "status": "completed",
    "transferId": "transfer_123",
    "type": "PAYOUT.PAYMENT"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/business_account.transactionbusiness_account.transactionRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a business account transaction is processed. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/business_account.transaction
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/business_account.transaction' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "business_account.transaction",
  "domain": "business_account",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "ext_tx_123",
    "userId": 12345,
    "accountId": 321,
    "transactionType": "payout_payment",
    "amount": 100,
    "currency": "EUR",
    "status": "completed",
    "fee": 1.25
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "business_account.transaction",
  "domain": "business_account",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "ext_tx_123",
    "userId": 12345,
    "accountId": 321,
    "transactionType": "payout_payment",
    "amount": 100,
    "currency": "EUR",
    "status": "completed",
    "fee": 1.25
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/wallet.topped_upwallet.topped_upRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a wallet, budget, or card funding transaction credits value. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/wallet.topped_up
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/wallet.topped_up' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "wallet.topped_up",
  "domain": "wallet",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": "1001",
    "walletId": "wallet_123",
    "userId": "12345",
    "amount": "100.00",
    "currency": "EUR",
    "status": "completed",
    "provider": "hoppacard"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "wallet.topped_up",
  "domain": "wallet",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": "1001",
    "walletId": "wallet_123",
    "userId": "12345",
    "amount": "100.00",
    "currency": "EUR",
    "status": "completed",
    "provider": "hoppacard"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/wallet.withdrawalwallet.withdrawalRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a wallet withdrawal or debit transaction is processed. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/wallet.withdrawal
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/wallet.withdrawal' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "wallet.withdrawal",
  "domain": "wallet",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": "1002",
    "walletId": "wallet_123",
    "userId": "12345",
    "amount": "50.00",
    "currency": "EUR",
    "status": "completed",
    "provider": "hoppacard"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "wallet.withdrawal",
  "domain": "wallet",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": "1002",
    "walletId": "wallet_123",
    "userId": "12345",
    "amount": "50.00",
    "currency": "EUR",
    "status": "completed",
    "provider": "hoppacard"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/wallet.refundwallet.refundRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a crypto refund is processed. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/wallet.refund
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/wallet.refund' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "wallet.refund",
  "domain": "wallet",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": "1001",
    "userId": "12345",
    "amount": "10.00",
    "currency": "USDT",
    "chain": "TRON",
    "address": "TXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "status": "completed",
    "transferId": "transfer_123",
    "transactionHash": "0x1234567890abcdef",
    "provider": "hoppacard"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "wallet.refund",
  "domain": "wallet",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": "1001",
    "userId": "12345",
    "amount": "10.00",
    "currency": "USDT",
    "chain": "TRON",
    "address": "TXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "status": "completed",
    "transferId": "transfer_123",
    "transactionHash": "0x1234567890abcdef",
    "provider": "hoppacard"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/budget.createdbudget.createdRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a budget is created. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/budget.created
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/budget.created' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.created",
  "domain": "budget",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "budgetId": "budget_123",
    "name": "Main EUR Budget",
    "currency": "EUR",
    "amount": "1000.00",
    "spent": "125.00",
    "remaining": "875.00",
    "period": "monthly",
    "status": "active"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.created",
  "domain": "budget",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "budgetId": "budget_123",
    "name": "Main EUR Budget",
    "currency": "EUR",
    "amount": "1000.00",
    "spent": "125.00",
    "remaining": "875.00",
    "period": "monthly",
    "status": "active"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/budget.updatedbudget.updatedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a budget is updated. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/budget.updated
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/budget.updated' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.updated",
  "domain": "budget",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "budgetId": "budget_123",
    "name": "Main EUR Budget",
    "currency": "EUR",
    "amount": "1000.00",
    "spent": "125.00",
    "remaining": "875.00",
    "period": "monthly",
    "status": "active"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.updated",
  "domain": "budget",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "budgetId": "budget_123",
    "name": "Main EUR Budget",
    "currency": "EUR",
    "amount": "1000.00",
    "spent": "125.00",
    "remaining": "875.00",
    "period": "monthly",
    "status": "active"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/budget.deletedbudget.deletedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a budget is deleted. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/budget.deleted
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/budget.deleted' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.deleted",
  "domain": "budget",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "budgetId": "budget_123",
    "name": "Main EUR Budget",
    "currency": "EUR",
    "amount": "1000.00",
    "spent": "125.00",
    "remaining": "875.00",
    "period": "monthly",
    "status": "deleted"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.deleted",
  "domain": "budget",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "budgetId": "budget_123",
    "name": "Main EUR Budget",
    "currency": "EUR",
    "amount": "1000.00",
    "spent": "125.00",
    "remaining": "875.00",
    "period": "monthly",
    "status": "deleted"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/budget.transaction.closedbudget.transaction.closedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a budget transaction is closed. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/budget.transaction.closed
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/budget.transaction.closed' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.transaction.closed",
  "domain": "budget",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": "1001",
    "userId": "12345",
    "budgetId": "budget_123",
    "amount": "15.00",
    "currency": "EUR",
    "status": "closed",
    "type": "DEBIT"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.transaction.closed",
  "domain": "budget",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": "1001",
    "userId": "12345",
    "budgetId": "budget_123",
    "amount": "15.00",
    "currency": "EUR",
    "status": "closed",
    "type": "DEBIT"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/budget.creditedbudget.creditedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money budget receives funds. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/budget.credited
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/budget.credited' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.credited",
  "domain": "budget",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "ext_tx_123",
    "userId": 12345,
    "budgetId": "budget_123",
    "amount": 75,
    "currency": "EUR",
    "source": "BANK_TRANSFER",
    "reference": "Invoice 123",
    "remitterName": "Example Ltd"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.credited",
  "domain": "budget",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "ext_tx_123",
    "userId": 12345,
    "budgetId": "budget_123",
    "amount": 75,
    "currency": "EUR",
    "source": "BANK_TRANSFER",
    "reference": "Invoice 123",
    "remitterName": "Example Ltd"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/budget.debitedbudget.debitedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money budget is debited. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/budget.debited
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/budget.debited' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.debited",
  "domain": "budget",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": 1002,
    "externalTransactionId": "ext_tx_456",
    "userId": 12345,
    "budgetId": "budget_123",
    "amount": 25,
    "currency": "EUR",
    "source": "CARD_PAYMENT"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.debited",
  "domain": "budget",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": 1002,
    "externalTransactionId": "ext_tx_456",
    "userId": 12345,
    "budgetId": "budget_123",
    "amount": 25,
    "currency": "EUR",
    "source": "CARD_PAYMENT"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/budget.credit_pendingbudget.credit_pendingRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money budget credit is pending settlement. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/budget.credit_pending
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/budget.credit_pending' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.credit_pending",
  "domain": "budget",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "BoxCreditPending",
    "budgetId": "budget_123",
    "budgetName": "Operations Budget",
    "settlementPriceAmount": 1200,
    "settlementPriceCurrency": "GBP",
    "valueDateTime": "2026-04-29 00:00:00 UTC"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.credit_pending",
  "domain": "budget",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "BoxCreditPending",
    "budgetId": "budget_123",
    "budgetName": "Operations Budget",
    "settlementPriceAmount": 1200,
    "settlementPriceCurrency": "GBP",
    "valueDateTime": "2026-04-29 00:00:00 UTC"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/card.createdcard.createdRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a card is created. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/card.created
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/card.created' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.created",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "cardNumber": "****-****-****-4242",
    "lastFour": "4242",
    "status": "active",
    "currency": "EUR"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.created",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "cardNumber": "****-****-****-4242",
    "lastFour": "4242",
    "status": "active",
    "currency": "EUR"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/card.activatedcard.activatedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a card is activated. Virtual cards may emit this immediately after creation. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/card.activated
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/card.activated' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.activated",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "cardId": 555
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.activated",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "cardId": 555
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/card.updatedcard.updatedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a card status changes. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/card.updated
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/card.updated' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.updated",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "previousStatus": "PENDING",
    "newStatus": "ACTIVE",
    "lastFour": "4242"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.updated",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "previousStatus": "PENDING",
    "newStatus": "ACTIVE",
    "lastFour": "4242"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/card.deletedcard.deletedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a card is deleted or cancelled. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/card.deleted
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/card.deleted' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.deleted",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "previousStatus": "ACTIVE",
    "newStatus": "CANCELLED"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.deleted",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "previousStatus": "ACTIVE",
    "newStatus": "CANCELLED"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/card.shippedcard.shippedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a physical card is shipped. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/card.shipped
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/card.shipped' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.shipped",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "trackingNumber": "TRACK123",
    "shippingCarrier": "DHL",
    "shippedAt": "2026-04-28 10:15:30 UTC"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.shipped",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "trackingNumber": "TRACK123",
    "shippingCarrier": "DHL",
    "shippedAt": "2026-04-28 10:15:30 UTC"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/card.transactioncard.transactionRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent for card purchases, refunds, reversals, fee transactions, freezes, and unfreezes. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/card.transaction
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/card.transaction' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.transaction",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "card_tx_123",
    "userId": 12345,
    "accountId": 321,
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "transactionType": "card_payment",
    "amount": 42.5,
    "currency": "EUR",
    "status": "completed",
    "description": "CARD PAYMENT: Example Merchant",
    "transactionDate": "2026-04-28 10:15:30 UTC",
    "merchantName": "Example Merchant",
    "merchantMid": "merchant_mid_123",
    "merchantCity": "London",
    "merchantCountry": "GB",
    "merchantState": "ENG",
    "merchantZipcode": "EC1A1BB",
    "mcc": "5812",
    "mccCategory": "Restaurants",
    "fee": 0.35,
    "transactionCurrency": "GBP",
    "transactionAmount": "36.25",
    "clientTransactionId": "client_tx_123",
    "cardTransactionId": "card_trace_123",
    "relatedCardTransactionId": "card_trace_parent_123",
    "remark": "Approved",
    "detail": "Card transaction processed",
    "type": "CONSUMPTION"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.transaction",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "card_tx_123",
    "userId": 12345,
    "accountId": 321,
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "transactionType": "card_payment",
    "amount": 42.5,
    "currency": "EUR",
    "status": "completed",
    "description": "CARD PAYMENT: Example Merchant",
    "transactionDate": "2026-04-28 10:15:30 UTC",
    "merchantName": "Example Merchant",
    "merchantMid": "merchant_mid_123",
    "merchantCity": "London",
    "merchantCountry": "GB",
    "merchantState": "ENG",
    "merchantZipcode": "EC1A1BB",
    "mcc": "5812",
    "mccCategory": "Restaurants",
    "fee": 0.35,
    "transactionCurrency": "GBP",
    "transactionAmount": "36.25",
    "clientTransactionId": "client_tx_123",
    "cardTransactionId": "card_trace_123",
    "relatedCardTransactionId": "card_trace_parent_123",
    "remark": "Approved",
    "detail": "Card transaction processed",
    "type": "CONSUMPTION"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/card.topupcard.topupRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when value is loaded onto a card. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/card.topup
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/card.topup' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.topup",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "card_tx_123",
    "userId": 12345,
    "accountId": 321,
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "transactionType": "card_topup",
    "amount": 42.5,
    "currency": "EUR",
    "status": "completed",
    "description": "CARD PAYMENT: Example Merchant",
    "transactionDate": "2026-04-28 10:15:30 UTC",
    "merchantName": "Example Merchant",
    "merchantMid": "merchant_mid_123",
    "merchantCity": "London",
    "merchantCountry": "GB",
    "merchantState": "ENG",
    "merchantZipcode": "EC1A1BB",
    "mcc": "5812",
    "mccCategory": "Restaurants",
    "fee": 0.35,
    "transactionCurrency": "GBP",
    "transactionAmount": "36.25",
    "clientTransactionId": "client_tx_123",
    "cardTransactionId": "card_trace_123",
    "relatedCardTransactionId": "card_trace_parent_123",
    "remark": "Approved",
    "detail": "Card transaction processed",
    "type": "CONSUMPTION"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.topup",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "card_tx_123",
    "userId": 12345,
    "accountId": 321,
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "transactionType": "card_topup",
    "amount": 42.5,
    "currency": "EUR",
    "status": "completed",
    "description": "CARD PAYMENT: Example Merchant",
    "transactionDate": "2026-04-28 10:15:30 UTC",
    "merchantName": "Example Merchant",
    "merchantMid": "merchant_mid_123",
    "merchantCity": "London",
    "merchantCountry": "GB",
    "merchantState": "ENG",
    "merchantZipcode": "EC1A1BB",
    "mcc": "5812",
    "mccCategory": "Restaurants",
    "fee": 0.35,
    "transactionCurrency": "GBP",
    "transactionAmount": "36.25",
    "clientTransactionId": "client_tx_123",
    "cardTransactionId": "card_trace_123",
    "relatedCardTransactionId": "card_trace_parent_123",
    "remark": "Approved",
    "detail": "Card transaction processed",
    "type": "CONSUMPTION"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/card.unloadcard.unloadRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when value is unloaded from a card. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/card.unload
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/card.unload' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.unload",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "card_tx_123",
    "userId": 12345,
    "accountId": 321,
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "transactionType": "card_unload",
    "amount": 42.5,
    "currency": "EUR",
    "status": "completed",
    "description": "CARD PAYMENT: Example Merchant",
    "transactionDate": "2026-04-28 10:15:30 UTC",
    "merchantName": "Example Merchant",
    "merchantMid": "merchant_mid_123",
    "merchantCity": "London",
    "merchantCountry": "GB",
    "merchantState": "ENG",
    "merchantZipcode": "EC1A1BB",
    "mcc": "5812",
    "mccCategory": "Restaurants",
    "fee": 0.35,
    "transactionCurrency": "GBP",
    "transactionAmount": "36.25",
    "clientTransactionId": "client_tx_123",
    "cardTransactionId": "card_trace_123",
    "relatedCardTransactionId": "card_trace_parent_123",
    "remark": "Approved",
    "detail": "Card transaction processed",
    "type": "CONSUMPTION"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.unload",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "card_tx_123",
    "userId": 12345,
    "accountId": 321,
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "transactionType": "card_unload",
    "amount": 42.5,
    "currency": "EUR",
    "status": "completed",
    "description": "CARD PAYMENT: Example Merchant",
    "transactionDate": "2026-04-28 10:15:30 UTC",
    "merchantName": "Example Merchant",
    "merchantMid": "merchant_mid_123",
    "merchantCity": "London",
    "merchantCountry": "GB",
    "merchantState": "ENG",
    "merchantZipcode": "EC1A1BB",
    "mcc": "5812",
    "mccCategory": "Restaurants",
    "fee": 0.35,
    "transactionCurrency": "GBP",
    "transactionAmount": "36.25",
    "clientTransactionId": "client_tx_123",
    "cardTransactionId": "card_trace_123",
    "relatedCardTransactionId": "card_trace_parent_123",
    "remark": "Approved",
    "detail": "Card transaction processed",
    "type": "CONSUMPTION"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/card.state_updatedcard.state_updatedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money card state changes. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/card.state_updated
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/card.state_updated' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.state_updated",
  "domain": "card",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "userId": 12345,
    "previousState": "ACTIVE",
    "currentState": "SUSPENDED",
    "status": "blocked"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.state_updated",
  "domain": "card",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "userId": 12345,
    "previousState": "ACTIVE",
    "currentState": "SUSPENDED",
    "status": "blocked"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/card.3ds.otpcard.3ds.otpRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a card 3DS OTP is received from Interlace. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/card.3ds.otp
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/card.3ds.otp' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.3ds.otp",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "otp": "123456",
    "expiresAt": "2026-04-28 10:20:30 UTC"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.3ds.otp",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "otp": "123456",
    "expiresAt": "2026-04-28 10:20:30 UTC"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/card.3ds_auth_requestcard.3ds_auth_requestRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money card 3DS authentication request requires OTP handling. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/card.3ds_auth_request
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/card.3ds_auth_request' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.3ds_auth_request",
  "domain": "card",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "merchantName": "Example Merchant",
    "amount": 42.5,
    "currency": "EUR",
    "transactionId": "txn_123",
    "otp": "123456"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.3ds_auth_request",
  "domain": "card",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "merchantName": "Example Merchant",
    "amount": 42.5,
    "currency": "EUR",
    "transactionId": "txn_123",
    "otp": "123456"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/digitalwallet.token_transitiondigitalwallet.token_transitionRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money digital wallet token changes state. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/digitalwallet.token_transition
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/digitalwallet.token_transition' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "digitalwallet.token_transition",
  "domain": "digitalwallet",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "DigitalWalletTokenTransition",
    "cardId": "card_ext_123",
    "tokenId": "token_123",
    "walletType": "APPLE_PAY",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "previousState": "INACTIVE",
    "currentState": "ACTIVE"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "digitalwallet.token_transition",
  "domain": "digitalwallet",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "DigitalWalletTokenTransition",
    "cardId": "card_ext_123",
    "tokenId": "token_123",
    "walletType": "APPLE_PAY",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "previousState": "INACTIVE",
    "currentState": "ACTIVE"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/cardholder.statuscardholder.statusRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent whenever a cardholder status update is processed. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/cardholder.status
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/cardholder.status' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "cardholder.status",
  "domain": "cardholder",
  "provider": "bank",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "status": "Active"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "cardholder.status",
  "domain": "cardholder",
  "provider": "bank",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "status": "Active"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/cardholder.createdcardholder.createdRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a cardholder is created by the banking provider. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/cardholder.created
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/cardholder.created' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "cardholder.created",
  "domain": "cardholder",
  "provider": "bank",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "status": "Active",
    "cardholderId": "cardholder_123"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "cardholder.created",
  "domain": "cardholder",
  "provider": "bank",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "status": "Active",
    "cardholderId": "cardholder_123"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/cardholder.approvedcardholder.approvedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a cardholder is approved by the banking provider. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/cardholder.approved
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/cardholder.approved' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "cardholder.approved",
  "domain": "cardholder",
  "provider": "bank",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "status": "Active"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "cardholder.approved",
  "domain": "cardholder",
  "provider": "bank",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "status": "Active"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/cardholder.deletedcardholder.deletedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when a cardholder is deleted by the banking provider. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/cardholder.deleted
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/cardholder.deleted' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "cardholder.deleted",
  "domain": "cardholder",
  "provider": "bank",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "cardholderId": "cardholder_123"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "cardholder.deleted",
  "domain": "cardholder",
  "provider": "bank",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "userId": 12345,
    "cardholderId": "cardholder_123"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/person.createdperson.createdRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money associated person is created. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/person.created
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/person.created' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "person.created",
  "domain": "person",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PersonCreated",
    "personId": "person_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "firstName": "Jane",
    "lastName": "Doe",
    "email": "jane.doe@example.com"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "person.created",
  "domain": "person",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PersonCreated",
    "personId": "person_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "firstName": "Jane",
    "lastName": "Doe",
    "email": "jane.doe@example.com"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/kyc.updatekyc.updateRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when Equals Money updates a user's KYC review status. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/kyc.update
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/kyc.update' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "kyc.update",
  "domain": "kyc",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "KycUpdate",
    "correlationId": "corr_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "PENDING_DOCUMENTS",
    "personId": "person_123",
    "requiredAction": "upload_bank_statement",
    "actionUrl": "https://app.equalsmoney.com/kyc/upload"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "kyc.update",
  "domain": "kyc",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "KycUpdate",
    "correlationId": "corr_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "PENDING_DOCUMENTS",
    "personId": "person_123",
    "requiredAction": "upload_bank_statement",
    "actionUrl": "https://app.equalsmoney.com/kyc/upload"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/kyc.information_requestkyc.information_requestRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when Equals Money requests additional KYC documents. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/kyc.information_request
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/kyc.information_request' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "kyc.information_request",
  "domain": "kyc",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "KycInformationRequest",
    "correlationId": "corr_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "requiredDocuments": [
      "proof_of_address",
      "source_of_funds"
    ]
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "kyc.information_request",
  "domain": "kyc",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "KycInformationRequest",
    "correlationId": "corr_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "requiredDocuments": [
      "proof_of_address",
      "source_of_funds"
    ]
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/recipient.createdrecipient.createdRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money recipient is created. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/recipient.created
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/recipient.created' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "recipient.created",
  "domain": "recipient",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "RecipientCreated",
    "recipientId": "recipient_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "name": "Example Supplier Ltd"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "recipient.created",
  "domain": "recipient",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "RecipientCreated",
    "recipientId": "recipient_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "name": "Example Supplier Ltd"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/recipient.deletedrecipient.deletedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money recipient is deleted. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/recipient.deleted
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/recipient.deleted' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "recipient.deleted",
  "domain": "recipient",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "RecipientDeleted",
    "recipientId": "recipient_123",
    "eventTime": "2026-04-28 10:15:30 UTC"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "recipient.deleted",
  "domain": "recipient",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "RecipientDeleted",
    "recipientId": "recipient_123",
    "eventTime": "2026-04-28 10:15:30 UTC"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/payment.createdpayment.createdRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money payment is created. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/payment.created
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/payment.created' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.created",
  "domain": "payment",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentCreated",
    "paymentId": "payment_123",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "PROCESSING",
    "amount": 250,
    "currency": "GBP",
    "recipientId": "recipient_123",
    "reference": "Invoice 123"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.created",
  "domain": "payment",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentCreated",
    "paymentId": "payment_123",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "PROCESSING",
    "amount": 250,
    "currency": "GBP",
    "recipientId": "recipient_123",
    "reference": "Invoice 123"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/payment.returnedpayment.returnedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money payment is returned. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/payment.returned
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/payment.returned' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.returned",
  "domain": "payment",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentReturned",
    "paymentId": "payment_123",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "RETURNED",
    "returnReason": "Beneficiary account closed"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.returned",
  "domain": "payment",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentReturned",
    "paymentId": "payment_123",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "RETURNED",
    "returnReason": "Beneficiary account closed"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/fee.createdfee.createdRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money fee is created. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/fee.created
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/fee.created' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "fee.created",
  "domain": "fee",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "FeeCreated",
    "feeId": "fee_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "feeType": "payment_fee",
    "amount": 2.5,
    "currency": "GBP"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "fee.created",
  "domain": "fee",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "FeeCreated",
    "feeId": "fee_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "feeType": "payment_fee",
    "amount": 2.5,
    "currency": "GBP"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/paymentbatch.createdpaymentbatch.createdRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money payment batch is created. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/paymentbatch.created
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/paymentbatch.created' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatch.created",
  "domain": "paymentbatch",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchCreated",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "CREATED",
    "totalAmount": 1500,
    "currency": "GBP",
    "paymentCount": 3
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatch.created",
  "domain": "paymentbatch",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchCreated",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "CREATED",
    "totalAmount": 1500,
    "currency": "GBP",
    "paymentCount": 3
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/paymentbatch.cancelledpaymentbatch.cancelledRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money payment batch is cancelled. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/paymentbatch.cancelled
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/paymentbatch.cancelled' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatch.cancelled",
  "domain": "paymentbatch",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchCancelled",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "CANCELLED"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatch.cancelled",
  "domain": "paymentbatch",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchCancelled",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "CANCELLED"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/paymentbatch.validation_errorpaymentbatch.validation_errorRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money payment batch fails validation. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/paymentbatch.validation_error
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/paymentbatch.validation_error' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatch.validation_error",
  "domain": "paymentbatch",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchValidationError",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "errors": [
      "Recipient account number is invalid",
      "Payment amount exceeds limit"
    ]
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatch.validation_error",
  "domain": "paymentbatch",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchValidationError",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "errors": [
      "Recipient account number is invalid",
      "Payment amount exceeds limit"
    ]
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/paymentbatch.processingpaymentbatch.processingRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money payment batch enters processing. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/paymentbatch.processing
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/paymentbatch.processing' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatch.processing",
  "domain": "paymentbatch",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchProcessing",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "PROCESSING"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatch.processing",
  "domain": "paymentbatch",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchProcessing",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "PROCESSING"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/paymentbatch.completedpaymentbatch.completedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money payment batch completes. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/paymentbatch.completed
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/paymentbatch.completed' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatch.completed",
  "domain": "paymentbatch",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchCompleted",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "COMPLETED",
    "successCount": 2,
    "failureCount": 1
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatch.completed",
  "domain": "paymentbatch",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchCompleted",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "COMPLETED",
    "successCount": 2,
    "failureCount": 1
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/paymentbatchorder.createdpaymentbatchorder.createdRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money payment batch FX order is created. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/paymentbatchorder.created
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/paymentbatchorder.created' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatchorder.created",
  "domain": "paymentbatchorder",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchOrderCreated",
    "orderId": "order_123",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "CREATED"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatchorder.created",
  "domain": "paymentbatchorder",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchOrderCreated",
    "orderId": "order_123",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "CREATED"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/paymentbatchorder.completedpaymentbatchorder.completedRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money payment batch FX order completes. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/paymentbatchorder.completed
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/paymentbatchorder.completed' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatchorder.completed",
  "domain": "paymentbatchorder",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchOrderCompleted",
    "orderId": "order_123",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "COMPLETED"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatchorder.completed",
  "domain": "paymentbatchorder",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchOrderCompleted",
    "orderId": "order_123",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "COMPLETED"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/webhooks/outbound/paymentbatchorder.cancelledpaymentbatchorder.cancelledRequest & responses +

This operation documents an outbound webhook request that CryptoCard Platform sends to your configured webhook URL. Sent when an Equals Money payment batch FX order is cancelled. Configure the destination URL and webhook secret on the company configuration. We send an HTTP `POST` with `Content-Type: application/json` and `X-Hoppacard-Signature`. The signature is a lowercase hex HMAC-SHA256 digest of the exact request body, using your webhook secret as the key. Return any 2xx status code to acknowledge the webhook.

Request examplePOST /webhooks/outbound/paymentbatchorder.cancelled
application/json
curl --request POST 'https://staging.hoppa.global/webhooks/outbound/paymentbatchorder.cancelled' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'X-Hoppacard-Signature: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a' \
  -H 'Content-Type: application/json' \
  --data '{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatchorder.cancelled",
  "domain": "paymentbatchorder",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchOrderCancelled",
    "orderId": "order_123",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "CANCELLED"
  }
}'
Parameters
X-Hoppacard-SignatureheaderstringrequiredExample: c1f6d6d2e8b9f1f13b0f7a2b8cc8d4f44aa50ef0997b0c0e86f8f4f6112e3c6a
Example request body
{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatchorder.cancelled",
  "domain": "paymentbatchorder",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28 10:15:30 UTC",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchOrderCancelled",
    "orderId": "order_123",
    "batchId": "batch_123",
    "eventTime": "2026-04-28 10:15:30 UTC",
    "status": "CANCELLED"
  }
}
Response examples1 documented status
200Return any 2xx response to acknowledge receipt.No body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

WhitelabelTransactions3 operations
GET/api/v2/whitelabel/transactionsGet company transactions (user_id = 0 and company_id matches the user's company).Request & responses +
Request exampleGET /api/v2/whitelabel/transactions
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/whitelabel/transactions?page=1&pageSize=20&status=PENDING&type=example&startDate=2026-08-05T09%3A30%3A00Z&endDate=2026-08-05T09%3A30%3A00Z' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
pagequeryintegeroptionalExample: 1
pageSizequeryintegeroptionalExample: 20
statusquerystringoptionalExample: PENDING
typequerystringoptionalExample: example
startDatequerystringoptionalExample: 2026-08-05T09:30:00Z
endDatequerystringoptionalExample: 2026-08-05T09:30:00Z
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

POST/api/v2/whitelabel/transactions/syncSync transactions from Interlace for the whitelabel company's account. Creates transactions with user_id=0 and company_id set to the requesting user's company.Request & responses +
Request examplePOST /api/v2/whitelabel/transactions/sync
No request body
curl --request POST 'https://staging.hoppa.global/api/v2/whitelabel/transactions/sync' \
  -H 'x-api-key: YOUR_API_KEY'
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

GET/api/v2/whitelabel/transactions/exportExport all transactions matching the filters (no pagination) for CSV export.Request & responses +
Request exampleGET /api/v2/whitelabel/transactions/export
No request body
curl --request GET 'https://staging.hoppa.global/api/v2/whitelabel/transactions/export?status=PENDING&type=example&startDate=2026-08-05T09%3A30%3A00Z&endDate=2026-08-05T09%3A30%3A00Z' \
  -H 'x-api-key: YOUR_API_KEY'
Parameters
statusquerystringoptionalExample: PENDING
typequerystringoptionalExample: example
startDatequerystringoptionalExample: 2026-08-05T09:30:00Z
endDatequerystringoptionalExample: 2026-08-05T09:30:00Z
Response examples1 documented status
200OKNo body
No response body is defined for this status.

Examples use safe placeholder values. Confirm required fields, enums and programme availability in the live Scalar schema before sending production traffic.

Make retries boring and safe.

400

Fix the request. Do not retry unchanged.

401 / 403

Fix credentials or company scope.

404

Confirm the resource belongs to this user and company.

409

Fetch current state; the operation may already exist.

429

Wait for Retry-After, then retry with jitter.

5xx

Retry only idempotent calls with exponential backoff.

Production readiness checklist

Ready to test?

Open the live API reference.

Use this guide for the workflow and Scalar for the exact current schema and response model.

Open Scalar