Skip to main content

Quickstart

Add a card or an account, create a test payment, send a receipt as your customer and approve it, in about ten minutes.

Bezanbecard is reconciliation and evidence software for payments you receive offline: card to card, by IBAN transfer (Pol, Paya, Satna) or by any other bank transfer. Your customer pays from their own banking app straight to your card or account and uploads the bank receipt. Your team reviews every receipt in one queue and approves or rejects it, and every step is kept as evidence. Money never passes through Bezanbecard.

This guide runs entirely in test mode: no money moves and you need no SMS app.

1. Create an account

Sign up with your mobile number. You get a business account that starts in test mode; the switch at the top of the dashboard shows which mode you are in.

2. Add a card or an account

Payments go to a destination: a bank card, or an account you know only by its IBAN, such as a company account. In the dashboard open Cards and accounts and add one while test mode is on.

  • A card number must pass the bank checks (a valid check digit and a known Iranian bank). Add the IBAN of the account behind the card too if customers may also pay it by bank transfer.
  • An account needs its IBAN, which must pass its check digits and name a known bank.
  • The holder name is shown to customers on the checkout, as their bank app will show it.

In test mode nothing is ever sent to this card or account. Bank transfers explains cards, accounts and payment methods.

3. Create a payment

Pick whichever suits you:

  • In the dashboard: Payments → New payment, then send the customer its payment page.
  • Without code, for many customers: a payment link.
  • From your server: with the API, as below.

For the API, open Developers → API keys and create a secret key. It starts with sk_test_ and is shown once, so store it in your server's environment, never in browser or mobile code.

Shell
export BEZANBECARD_SECRET_KEY=sk_test_…

Amounts are integers in rial. 12500000 rial is 1,250,000 toman.

curl https://a.bezanbecard.com/v1/payments \
  -H "Authorization: Bearer $BEZANBECARD_SECRET_KEY" \
  -H "Idempotency-Key: order-1042" \
  -H "Content-Type: application/json" \
  -d '{"amount":12500000,"reference":"1042","return_url":"https://shop.example/orders/1042/thanks"}'

The answer is a payment object in Awaiting transferrequires_payment. Three fields matter now:

  • checkout_url: the hosted checkout page to send your customer to.
  • expected_amount: the exact amount the customer should send. It differs from amount by a small unique sum (by default between 1,000 and 99,990 rial, added on top), so each open payment on a destination asks for a different figure and every transfer is easy to tell apart in your bank statement. You can turn unique amounts off in your payment settings.
  • payment_method_types: card, transfer or both, depending on your settings and what the destination takes.

4. Pay as your customer

Open checkout_url on your phone. When the destination takes both methods, the page has two tabs, Card to card and Bank transfer, with the card number or the IBAN and the exact amount to copy.

In test mode, send no money. Upload any photo or screenshot as the receipt and press Send receipt. The page now says it is waiting for the shop's approval, and the payment is Awaiting approvalprocessing.

Your server can send a receipt for the customer too, for example when they sent it to you on a messenger:

curl
curl https://a.bezanbecard.com/v1/payments/pay_…/receipts \
  -H "Authorization: Bearer $BEZANBECARD_SECRET_KEY" \
  -H "Idempotency-Key: receipt-1042-1" \
  -F channel=card \
  -F [email protected]

5. Approve the receipt

Open Receipts in the dashboard. The receipt waits there beside its payment, with the amount the payment asks for and anything the customer typed. Look at the file and press Approve receipt. The payment becomes Succeededsucceeded and the open checkout page turns into a confirmation by itself.

Try a rejection too: create another payment, send a receipt and reject it with a reason such as "The receipt cannot be read". The customer sees the reason on the checkout page and can send another receipt. Receipts and review covers approving part of an amount, duplicate warnings and the rest.

Approving works from your own code as well:

curl
curl https://a.bezanbecard.com/v1/receipts/rcp_…/approve \
  -H "Authorization: Bearer $BEZANBECARD_SECRET_KEY" \
  -H "Idempotency-Key: approve-rcp_…" \
  -H "Content-Type: application/json" \
  -d '{}'

6. Hear about it with a webhook

Your server should not poll. Add an endpoint under Developers → Webhooks, subscribe it to payment.succeeded and payment.partially_paid (add receipt.created to hear about every new receipt), and verify the Bezanbecard-Signature header on every delivery. Webhooks has the handler.

7. Go live

  1. Switch the dashboard to live mode and add the card or account your customers will pay to.
  2. Choose in your settings which payment methods you take and whether a receipt file is required (it is by default).
  3. Invite the teammates who review receipts. Owners, admins and support members can approve and reject; developers and viewers can only look.
  4. If you use the API, create a live secret key (sk_live_…) and a live webhook endpoint (it has its own signing secret).
  5. Make one small real payment end to end: pay it, send the receipt and approve it.

The SMS app is optional. Connect it if you want your bank's deposit SMS beside each receipt, or automatic approval; everything above works without it.

Test and live data never mix: a test key sees only test payments, a live key only live ones.