{ "statusCode": 201, "success": true, "status": "payment_registered", "message": "Payment has been registered", "data": { "payment_id": "cmodi78b2000101pjezst1ics", "session_payment": "https://app.starkfi.io/sessions/payment?token=<jwt>", "crypto_tx": { "schema_version": 1, "family": "evm", "chain_name": "arbitrum", "transactionRequest": { "from": "0x9b57847b69D0354837F7b723133B9dBCbefb4F9F", "to": "0x23183C87c9c6668edf5974893905AF475c3664c9", "data": "0x40180def...", "value": 0, "chainId": 42161, "gasLimit": "82499", "maxPriorityFeePerGas": "0", "maxFeePerGas": "52514800", "nonce": 36 }, "meta": { "source": "evm_split" } }, "fiat_tx": { "message": "This details is available only for fiat payments" } }}
StarkPay
Create Transaction
Generate a transaction from a registered payment order. The required parameters vary by transaction type — always validate the type before building the request.
Your StarkFi API key. You can find it in your dashboard.
The transaction type defines the required and optional request parameters. Always validate the specified type before building the request.
Checkout (order) flows do not require KYC/KYB — payments with order_code or executor_id: order_transaction skip verification.For financial transactions, fiat-related types require approved KYC/KYB when payer_email or payer_wallet is sent. Pure crypto never requires KYC/KYB. Errors: kyc_verification_required, kyc_not_approved. See StarkPay overview.
Direct on-chain submission is not allowed and may result in failure or rejection. All transactions must be signed locally and then submitted exclusively through the Broadcast endpoint.
After receiving crypto_tx, sign it with the user’s wallet before broadcasting.
import { Connection, Transaction, Keypair } from "@solana/web3.js";const connection = new Connection("https://api.mainnet-beta.solana.com");const keypair = Keypair.fromSecretKey(secretKey);// Reconstruct transaction from crypto_tx dataconst transaction = Transaction.from(Buffer.from(crypto_tx.serialized, "base64"));transaction.sign(keypair);const signedTx = transaction.serialize().toString("base64");console.log("Signed transaction:", signedTx);
You can use an external wallet provider like Privy.io to sign transactions without exposing private keys. Never call sendTransaction directly — always go through the broadcast endpoint.
Pass the returned id as card_data.card_token in the create transaction request.
Card payment support is currently limited to CardCrypto. Only one-time transactions are supported. Enablement requires a minimum lead time of 7 days and must be aligned in advance with the sales team. To use any payment method involving the traditional financial system (PIX, fiat, card), complete KYC/KYB procedures with the account management team.