/** * @qbirr/sdk — Node.js client for the qbirr payment verification API. * * import { Qbirr } from '@qbirr/sdk'; * const qb = new Qbirr({ apiKey: process.env.QBIRR_API_KEY! }); * const r = await qb.verify({ * provider: 'cbe', * ref: 'FT23001234ABC', * amount: 500, * receiverName: 'YOUR NAME', * receiverAccount: '1000017692643', * }); * console.log(r.verified, r.payer); * * Works on Node 18+ (uses the built-in fetch). No dependencies. */ export type Provider = 'cbe' | 'telebirr' | 'abyssinia' | 'dashen' | 'mpesa' | 'awash' | 'ebirr' | 'zamzam'; export interface VerifyRequest { provider: Provider; /** Transaction reference (or, for Awash/eBirr, the SMS URL / URL token). */ ref: string; /** Expected payment amount in ETB. */ amount: number; /** Exact receiver name (case-insensitive, whitespace-normalised match). */ receiverName: string; /** Required for CBE and Bank of Abyssinia. Ignored for other providers. */ receiverAccount?: string; } export interface VerifyResult { /** True if the receipt is real, the amount matches, and the receiver matches. */ verified: boolean; /** Payer name as extracted from the receipt. */ payer: string; /** Amount that was actually paid (per the receipt). */ amount: number; /** Human-readable failure reason, empty on success. */ error: string; } export interface UsageStatus { used: number; limit: number; remaining: number; plan: string; /** ISO date — first instant of the current monthly window. */ period_start: string; /** ISO date — first instant of the next monthly window. */ period_end: string; } export interface QbirrOptions { /** Your API key from the qbirr dashboard. */ apiKey: string; /** Override base URL. Defaults to https://verify.qbirr.com */ baseUrl?: string; /** Per-request timeout (ms). Defaults to 30 000. */ timeoutMs?: number; /** Optional fetch override (for tests). */ fetch?: typeof fetch; } /** Thrown for network failures, HTTP errors, or non-JSON responses. */ export declare class QbirrError extends Error { readonly status?: number | undefined; readonly body?: unknown | undefined; constructor(message: string, status?: number | undefined, body?: unknown | undefined); } export declare class Qbirr { private readonly apiKey; private readonly baseUrl; private readonly timeoutMs; private readonly fetchFn; constructor(opts: QbirrOptions); /** * Verify a single transaction. Returns `{ verified: false, error: '...' }` * on a real verification failure (wrong amount, wrong receiver, expired * receipt). Throws QbirrError for network/auth problems. */ verify(req: VerifyRequest): Promise; /** * Verify by uploading the receipt itself — PDF or an image (PNG/JPEG). * Images with a QR code (most bank receipts have one) are decoded and * routed through the URL-based flow automatically. * * const buf = await fs.readFile('receipt.pdf'); * await qb.verifyUpload({ * provider: 'cbe', * amount: 999, * receiverName: 'YOUR NAME', * receiverAccount: '1000017692643', * file: buf, * filename: 'receipt.pdf', * contentType: 'application/pdf', * }); */ verifyUpload(opts: { provider: Provider; amount: number; receiverName: string; receiverAccount?: string; file: Buffer | Uint8Array | Blob; filename?: string; contentType?: string; }): Promise; /** Returns the current month's quota usage for this API key. */ usage(): Promise; private requestForm; private request; } export default Qbirr;