Sandbox Simulator

Trigger the events you cannot cause yourself in the sandbox - identity verification results, incoming bank payments, card activity and more.

Some of what happens in Striga starts outside your application: a verification provider reaches a decision, a bank payment arrives, a card is used at a till. The sandbox simulator lets you trigger those events on demand, so you can build and test every step of your integration end to end.

Simulator endpoints exist only on the sandbox, under https://www.sandbox.striga.com/api/v1/simulate. They are signed exactly like every other request (see Authenticating with the API). They cause the same state changes and send the same webhooks as the real events they stand in for.

At a glance

AreaEndpointSimulates
IdentityPATCH /simulate/user/kycA consumer's identity verification result
IdentityPOST /simulate/kyc/share-tokenA reusable-KYC share token
IdentityPATCH /simulate/business/kybA business's verification result
IdentityPOST /simulate/auth/2fa/reset/livenessA passed liveness check for a 2FA reset
Money movementPATCH /simulate/accounts/depositAn incoming SEPA payment to a EUR account
Money movementPATCH /simulate/sepaThe outcome of an outgoing SEPA payment
CardsPATCH /simulate/card/statusA physical card being dispatched or activated
CardsPOST /simulate/card/authorizationA card payment at a merchant or ATM
ApplicationPATCH /simulate/payment-accountsTurning Payment Accounts on or off
ApplicationPOST /simulate/payment-accounts/stateReading your Payment Accounts settings
WebhooksPOST /simulate/webhook/pingA test webhook to your endpoint

Identity verification

Simulate a consumer's KYC result

PATCH /simulate/user/kyc

FieldRequiredDescription
userIdyesThe consumer's id
statusyesAPPROVED, REJECTED or REJECTED_FINAL
tierno1 or 2, the verification tier to decide
rejectLabelsnoFor rejections: an array of reasons, e.g. ["LOW_QUALITY", "SELFIE_MISMATCH"]
reusablenotrue to simulate a reused verification, where no new documents are collected
{ "userId": "00000000-0000-0000-0000-000000000000", "status": "APPROVED", "tier": 1 }

The consumer must have verified their email and mobile first. Verification must also have been started with POST /user/kyc/start.

The call answers 200 as soon as the decision is recorded, and you receive a KYC webhook when the status changes. After an approval, Striga keeps provisioning in the background for a few more seconds: the consumer's default wallet and accounts, and their banking record. If your application has automatic account enrichment, accounts are enriched as part of that provisioning, and you don't need to call POST /wallets/account/enrich yourself during onboarding. Ask your Striga contact to enable it for your sandbox application.

Create a reusable-KYC share token

POST /simulate/kyc/share-token

No body. Answers { "shareToken": "..." }. Pass the token to POST /user/kyc/start on an application with reusable KYC enabled, then complete the verification with PATCH /simulate/user/kyc.

Simulate a business's KYB result

PATCH /simulate/business/kyb

FieldRequiredDescription
businessIdyesThe business's id
statusyesAPPROVED, REJECTED or REJECTED_FINAL

Answers 204. On an approval, the business's default wallet and banking record are provisioned before the status is recorded. If provisioning fails, the business stays unapproved, and you can simply repeat the call.

Pass liveness for a 2FA reset

POST /simulate/auth/2fa/reset/liveness

FieldRequiredDescription
resetIdyesThe id returned when the reset was initiated

Answers { "resetId": "...", "status": "LIVENESS_PASSED" }. You can then complete the reset. Resets that are already COMPLETED, REJECTED or EXPIRED are refused.

Money movement

Simulate an incoming EUR deposit

PATCH /simulate/accounts/deposit

Credits a simulated SEPA payment to an enriched EUR account.

FieldRequiredDescription
accountIdyesThe 32-character EUR account id
amountyesAmount in cents, as a string without decimals, e.g. "10000" for €100.00
senderNamenoUp to 70 characters
senderIbannoA valid IBAN
senderBicnoA valid BIC
referencenoUp to 129 characters
paymentTypenoSEPA (default) or SEPA_INSTANT
{ "accountId": "00000000000000000000000000000000", "amount": "10000", "reference": "Sandbox top-up" }

A successful call answers 200, and the credit arrives on the account like a real incoming payment.

Every refusal is HTTP 400, and its code tells you whether repeating the request can succeed:

errorCodemessageWhat to do
31002Account must be active and enrichedThe account has no bank account yet. Enrich it, then repeat.
31122Account not foundNo account has this accountId. Repeating cannot succeed.
31123Only EUR deposits can be simulatedThe account is not a EUR account. Repeating cannot succeed.
31124Account holder banking record is not set upRepeating cannot succeed. Contact support with the accountId.
31125Deposit simulation failedThe banking provider refused the deposit, or it failed unexpectedly. Contact support with the accountId.
00002Invalid fieldsA field failed validation; errorDetails names it.

Simulate the outcome of an outgoing SEPA payment

PATCH /simulate/sepa

FieldRequiredDescription
transactionIdyesThe id of an outgoing SEPA payment you initiated
accountIdyesThe EUR account it was sent from
statusyesCOMPLETED or FAILED

Answers 200. The payment settles or fails exactly as a real one would, with the same balance changes and webhooks.

Cards

Dispatch or activate a physical card

PATCH /simulate/card/status

FieldRequiredDescription
cardIdyesThe card's id
statusyesDISPATCHED or ACTIVE

Activating a card also enrols it in 3-D Secure. Cards that are already active or blocked are refused.

Simulate a card payment

POST /simulate/card/authorization

FieldRequiredDescription
cardIdyesThe card's id
amountEURCentsyesWhole euro cents, from 0 to 1500000
mccnoA merchant category code, e.g. "5812". Use "ATM" or "6011" for a cash withdrawal.
{ "cardId": "00000000-0000-0000-0000-000000000000", "amountEURCents": 1234, "mcc": "5812" }

Answers 200 with the simulated transaction and "response": "APPROVED" or "DECLINED". The decision is made exactly as for a real payment: against the balance of the account linked to the card, the card's limits and its status. So fund the linked account first, with PATCH /simulate/accounts/deposit. The reason for a decline is delivered in the card transaction webhook.

Application settings

Turn Payment Accounts on or off

PATCH /simulate/payment-accounts

FieldRequiredDescription
enabledyestrue or false

Changes the setting for your application. Enabling it also grants the consent endpoints' permissions; disabling it leaves those permissions in place, inert. Answers:

{ "paymentAccountsEnabled": true, "consentPermissionsGranted": true }

Read your Payment Accounts settings

POST /simulate/payment-accounts/state

No body. Answers:

{ "paymentAccountsEnabled": true, "effective3pSepaPayoutsEnabled": true }

effective3pSepaPayoutsEnabled is whether third-party SEPA payouts are actually permitted for your application.

Webhooks

Send a test webhook

POST /simulate/webhook/ping

FieldRequiredDescription
payloadyesAny JSON object

Delivers payload to your application's webhook URL as a TEST webhook. It is signed like every live webhook, with a uid and a ts added. Use it to check that your endpoint verifies signatures and responds.

The call answers 200 once delivery has been attempted, even if your endpoint did not accept it. Confirm receipt on your side.

Putting it together: from a new consumer to a card payment

  1. Create the consumer, then verify their email and mobile.
  2. POST /user/kyc/start, then PATCH /simulate/user/kyc with "status": "APPROVED".
  3. Enrich the EUR account with POST /wallets/account/enrich, unless your application enriches accounts automatically.
  4. Fund it with PATCH /simulate/accounts/deposit.
  5. Create a card linked to that account, and pay with it using POST /simulate/card/authorization.