BirrJS
Providers

Verify.et

Integrate verify.et for automated transaction verification with Ethiopian banks.

The @birrjs/verifyet package provides automated transaction verification via verify.et — a universal verification API that detects the bank from any receipt format and checks payments against your configured accounts.

Installation

pnpm add @birrjs/verifyet

Configuration

import { verifyEt } from "@birrjs/verifyet";

createBirr({
  provider: verifyEt({
    apiKey: process.env.VERIFY_ET_API_KEY!,
    channels: [
      {
        type: "cbe",
        value: "1000200030004000",
        name: "Abebe",
      },
      {
        type: "telebirr",
        value: "0912345678",
        name: "Abebe",
      },
    ],
  }),
});

Options

OptionTypeRequiredDescription
apiKeystringYesAPI key from verify.et
channelsVerifyEtChannel[]YesBank accounts to display for payment

VerifyEtChannel

FieldTypeDescription
typeVerifyEtChannelTypeThe bank or mobile money provider
valuestringAccount number or phone number
namestringAccount holder name

VerifyEtChannelType

"telebirr" | "cbe" | "mpesa" | "dashen" | "boa" | "cbebirr" | "awash" | "siinqee" | "kaafiebirr"

Environment variables

VariableDescription
VERIFY_ET_API_KEYAPI key from verify.et

How it works

Instead of redirecting users to a checkout page, users see a list of bank accounts and pay directly from their banking app.

Subscribe flow

  1. Your app calls subscribe() → BirrJS calls provider.initializeTransaction()
  2. BirrJS returns paymentInstructions — an array of bank accounts with amounts (no checkoutUrl)
  3. Display the instructions to the user: "Send 29.00 ETB to any of these accounts"
  4. The user pays via their banking app and gets a receipt (reference)
  5. The user submits their receipt via client.verifyReceipt({ receiptUrl, planId })

Verify receipt flow

  1. verifyReceipt calls provider.verifyTransaction(receiptUrl)
  2. Verify.et auto-detects the bank and verifies the transaction
  3. BirrJS checks: transaction verified? amount ≥ plan price? payment landed in your account?
  4. If all checks pass, the subscription is activated and subscription.activated events fire

Wrong channel selection

If a user picks "Telebirr" but actually pays via CBE (to your CBE account), BirrJS automatically retries with the correct account. The channel picker is a hint, not a hard requirement.

Supported channels

ChannelType value
Telebirrtelebirr
CBEcbe
M-Pesampesa
Dashen Bankdashen
Bank of Abyssiniaboa
CBE Birrcbebirr
Awash Bankawash
Siinqee Banksiinqee
Kaafi Ebirrkaafiebirr

Error types

ErrorCause
SERVER_ERRORVerify.et API returned a 5xx error
UNAUTHORIZEDInvalid or missing API key
INSUFFICIENT_CREDITSAccount credits exhausted
RATE_LIMITEDToo many requests
TIMEOUT_ERRORRequest exceeded 30s timeout
NETWORK_ERRORNetwork connectivity issue
VERIFICATION_FAILEDReceipt could not be verified

Building a checkout page? BirrJS includes ready-made UI components for receipt-based payments — bank account cards, channel selector, and receipt input.