Skip to Content

Usage Examples

Every method returns ApiResponse<T>. Access the payload via .data, pagination via .meta.pagination.

import { EInvoice, EInvoiceApiError } from '@useyona/einvoice-js'; const client = new EInvoice({ apiKey: process.env.YONA_API_KEY!, });

Invoices — client.invoices

API Reference

MethodSignatureReturns
createcreate(params: CreateInvoiceParams)ApiResponse<Invoice>
getget(id: string)ApiResponse<Invoice>
listlist(params?: ListInvoicesParams)ApiResponse<Invoice[]>
updateupdate(id: string, params: UpdateInvoiceParams)ApiResponse<Invoice>
deletedelete(id: string)ApiResponse<{ deleted: boolean }>
submitsubmit(id: string)ApiResponse<SubmitResult>
batchSubmitbatchSubmit(invoiceIds: string[])ApiResponse<BatchSubmitResult>
retryretry(id: string)ApiResponse<RetryResult>
cancelcancel(id: string, params: CancelInvoiceParams)ApiResponse<Invoice>
getStatusgetStatus(id: string)ApiResponse<InvoiceStatusResult>
queryStatusqueryStatus(id: string)ApiResponse<InvoiceStatusResult>
validatevalidate(params: CreateInvoiceParams)ApiResponse<ValidationResult>
downloaddownload(id: string)ApiResponse<DownloadResult>
getStatisticsgetStatistics(params?: InvoiceStatisticsParams)ApiResponse<InvoiceStatistics>
getHsnCodesgetHsnCodes(params?: GetHsnCodesParams)ApiResponse<HsnCode[]>
getHsnCategoriesgetHsnCategories()ApiResponse<HsnCategory[]>
getResourcesgetResources()ApiResponse<InvoiceResources>
getResourceByTypegetResourceByType(type: InvoiceResourceType)ApiResponse<unknown[]>
lookupTaxIdlookupTaxId(taxId: string)ApiResponse<TaxpayerInfo>
validateReferencevalidateReference(params: ValidateReferenceParams)ApiResponse<ValidationResult>
submitTaxReportsubmitTaxReport(invoiceId: string, params: TaxReportParams)ApiResponse<TaxReportResult>

Create, submit, and check status

try { const invoice = await client.invoices.create({ sellerId: 'c7a1d3e5-8f2b-4a6c-9d0e-1f2a3b4c5d6e', buyerId: 'd8b2e4f6-9a3c-5b7d-0e1f-2a3b4c5d6e7f', invoiceNumber: 'INV-2026-001', invoiceDate: '2026-04-30', dueDate: '2026-05-30', currency: 'NGN', lineItems: [ { description: 'Software development services - April 2026', hsnCode: '9983', quantity: 80, unitCode: 'HUR', unitPrice: 15000, taxPercent: 7.5, }, ], paymentTerms: 'Net 30', }); const submission = await client.invoices.submit(invoice.data.id); const status = await client.invoices.getStatus(invoice.data.id); } catch (err) { if (err instanceof EInvoiceApiError) { console.error(err.errorCode, err.message, err.errors); } }

List with filters

const drafts = await client.invoices.list({ status: 'draft', page: 1, limit: 20, sortOrder: 'DESC', }); drafts.data.forEach(inv => { console.log(inv.invoiceNumber, inv.payableAmount); });

Validate before creating

const validation = await client.invoices.validate({ sellerId: 'c7a1d3e5-8f2b-4a6c-9d0e-1f2a3b4c5d6e', buyerId: 'd8b2e4f6-9a3c-5b7d-0e1f-2a3b4c5d6e7f', invoiceNumber: 'INV-2026-002', invoiceDate: '2026-04-30', lineItems: [{ description: 'Annual ERP licensing fee', hsnCode: '9984', quantity: 1, unitCode: 'EA', unitPrice: 2500000, taxPercent: 7.5, }], }); if (validation.data.valid) { console.log('Totals:', validation.data.calculations); }

Sellers — client.sellers

API Reference

MethodSignatureReturns
createcreate(params: CreateSellerParams)ApiResponse<Seller>
getget(id: string)ApiResponse<Seller>
listlist(params?: ListSellersParams)ApiResponse<Seller[]>
updateupdate(id: string, params: UpdateSellerParams)ApiResponse<Seller>
deletedelete(id: string)ApiResponse<{ deleted: boolean }>
bulkDeletebulkDelete(ids: string[])ApiResponse<{ deleted: number }>
verifyTinverifyTin(id: string)ApiResponse<TaxNumberVerificationResult>
getVerificationStatusgetVerificationStatus(id: string)ApiResponse<TaxNumberVerificationResult>
searchsearch(query: string)ApiResponse<SearchResult>
const seller = await client.sellers.create({ partyName: 'Zenith Software Solutions Ltd', email: 'billing@zenithsoftware.ng', phoneNumber: '+2348012345678', taxNumber: '31245678-0001', postalAddress: { line1: '14 Admiralty Way', city: 'Lagos', state: 'Lagos', country: 'NG', }, }); await client.sellers.verifyTin(seller.data.id); const verification = await client.sellers.getVerificationStatus(seller.data.id); const results = await client.sellers.search('Zenith');

Buyers — client.buyers

API Reference

Same methods as sellers. taxNumber is optional for buyers.

MethodSignatureReturns
createcreate(params: CreateBuyerParams)ApiResponse<Buyer>
getget(id: string)ApiResponse<Buyer>
listlist(params?: ListBuyersParams)ApiResponse<Buyer[]>
updateupdate(id: string, params: UpdateBuyerParams)ApiResponse<Buyer>
deletedelete(id: string)ApiResponse<{ deleted: boolean }>
bulkDeletebulkDelete(ids: string[])ApiResponse<{ deleted: number }>
verifyTinverifyTin(id: string)ApiResponse<TaxNumberVerificationResult>
getVerificationStatusgetVerificationStatus(id: string)ApiResponse<TaxNumberVerificationResult>
searchsearch(query: string)ApiResponse<SearchResult>
const buyer = await client.buyers.create({ partyName: 'Kalu & Associates Ltd', email: 'procurement@kaluassociates.ng', phoneNumber: '+2349087654321', taxNumber: '87654321-0001', postalAddress: { line1: '27 Wuse II District', city: 'Abuja', state: 'FCT', country: 'NG', }, });

Billing — client.billing

API Reference

MethodSignatureReturns
getAccountgetAccount()ApiResponse<BillingAccount>
checkBalancecheckBalance(accountId: string, credits: number)ApiResponse<BalanceCheck>
getPlansgetPlans(params?: ListPlansParams)ApiResponse<SubscriptionPlan[]>
getPlangetPlan(code: string)ApiResponse<SubscriptionPlan>
getPackagesgetPackages(params?: ListPackagesParams)ApiResponse<CreditPackage[]>
getPackagegetPackage(id: string)ApiResponse<CreditPackage>
getAllPlansgetAllPlans()ApiResponse<Array<SubscriptionPlan | CreditPackage>>
getActiveSubscriptiongetActiveSubscription()ApiResponse<Subscription>
getSubscriptionHistorygetSubscriptionHistory()ApiResponse<Subscription[]>
getSubscriptiongetSubscription(id: string)ApiResponse<Subscription>
createSubscriptioncreateSubscription(params: CreateSubscriptionParams)ApiResponse<Subscription>
cancelSubscriptioncancelSubscription(id: string, params?: CancelSubscriptionParams)ApiResponse<Subscription>
resumeSubscriptionresumeSubscription(id: string)ApiResponse<Subscription>
changePlanchangePlan(id: string, params: ChangePlanParams)ApiResponse<Subscription>
purchaseCreditspurchaseCredits(params: PurchaseCreditsParams)ApiResponse<PurchaseResult>
getPaymentsgetPayments(params?: ListPaymentsParams)ApiResponse<Payment[]>
getTransactionsgetTransactions(params?: ListTransactionsParams)ApiResponse<CreditTransaction[]>
transferCreditstransferCredits(params: TransferCreditsParams)ApiResponse<TransferCreditsResult>
getPaymentMethodsgetPaymentMethods()ApiResponse<PaymentMethod[]>
addPaymentMethodaddPaymentMethod(params: AddPaymentMethodParams)ApiResponse<{ customerId: string; setupUrl?: string }>
removePaymentMethodremovePaymentMethod(provider: string, id: string)ApiResponse<{ removed: boolean }>
setDefaultPaymentMethodsetDefaultPaymentMethod(provider: string, params: { paymentMethodId: string })ApiResponse<{ customerId: string }>
getUsageAnalyticsgetUsageAnalytics(params?: UsageAnalyticsParams)ApiResponse<UsageAnalytics>
getConsumptionBreakdowngetConsumptionBreakdown()ApiResponse<Record<string, unknown>>
getAccountStatsgetAccountStats(accountId: string)ApiResponse<BillingAccountStats>
getTransactiongetTransaction(id: string)ApiResponse<CreditTransaction>
subscribeAndPaysubscribeAndPay(params: SubscribeAndPayParams)ApiResponse<SubscribeAndPayResult>
getRenewalHistorygetRenewalHistory(params?: ListRenewalsParams)ApiResponse<SubscriptionRenewal[]>
getRenewalStatsgetRenewalStats()ApiResponse<RenewalStats>
getCreditCostsgetCreditCosts()ApiResponse<CreditCostEntry[]>
const account = await client.billing.getAccount(); console.log(account.data.creditBalance); const sufficient = await client.billing.checkBalance('1a2b3c4d-5e6f-7890-abcd-ef1234567890', 100); const sub = await client.billing.createSubscription({ planCode: 'starter_monthly', }); const purchase = await client.billing.purchaseCredits({ packageId: 'pkg_5000_credits', currency: 'NGN', });

Organizations — client.organizations

API Reference

MethodSignatureReturns
createcreate(params: CreateOrganizationParams)ApiResponse<Organization>
listlist()ApiResponse<Organization[]>
getget(id?: string)ApiResponse<Organization>
updateupdate(params: UpdateOrganizationParams)ApiResponse<Organization>
completeOnboardingcompleteOnboarding(params: CompleteOnboardingParams)ApiResponse<Organization>
verifyTaxNumberverifyTaxNumber(params: { taxNo: string })ApiResponse<Organization>
sendPhoneVerificationsendPhoneVerification(params: { phoneNumber: string })ApiResponse<{ sent: boolean }>
verifyPhoneverifyPhone(params: { otp: string })ApiResponse<Organization>
getCreditPoolConfiggetCreditPoolConfig()ApiResponse<CreditPoolConfig>
updateCreditPoolConfigupdateCreditPoolConfig(params: Partial<CreditPoolConfig>)ApiResponse<CreditPoolConfig>
getChildrengetChildren()ApiResponse<Organization[]>
const org = await client.organizations.get(); await client.organizations.verifyTaxNumber({ taxNo: '31245678-0001' }); const children = await client.organizations.getChildren(); await client.organizations.updateCreditPoolConfig({ primaryCoversSecondary: true, minimumReserve: 500, });

Webhooks — client.webhooks

API Reference

Requires organizationId in client config.

MethodSignatureReturns
createcreate(params: CreateWebhookParams)ApiResponse<WebhookEndpoint>
listlist(params?: PaginationParams)ApiResponse<WebhookEndpoint[]>
getget(id: string)ApiResponse<WebhookEndpoint>
updateupdate(id: string, params: UpdateWebhookParams)ApiResponse<WebhookEndpoint>
deletedelete(id: string)ApiResponse<{ deleted: boolean }>
testtest(id: string)ApiResponse<{ eventId: string }>
listDeliverieslistDeliveries(webhookId: string, params?: ListDeliveriesParams)ApiResponse<WebhookDelivery[]>
retryDeliveryretryDelivery(deliveryId: string)ApiResponse<{ retried: boolean }>
const client = new EInvoice({ apiKey: process.env.YONA_API_KEY!, organizationId: '9f8e7d6c-5b4a-3210-fedc-ba9876543210', }); const webhook = await client.webhooks.create({ url: 'https://api.zenithsoftware.ng/webhooks/yona', events: ['invoice.approved', 'invoice.rejected', 'invoice.failed'], description: 'Production notifications', }); await client.webhooks.test(webhook.data.id); const deliveries = await client.webhooks.listDeliveries(webhook.data.id);

Webhook verification

import { verifyWebhook } from '@useyona/einvoice-js/webhooks'; const event = verifyWebhook(rawBody, requestHeaders, process.env.WEBHOOK_SECRET!); switch (event.eventType) { case 'invoice.approved': handleApproved(event.data); break; case 'invoice.rejected': handleRejected(event.data); break; case 'invoice.failed': handleFailed(event.data); break; }

API Keys — client.apiKeys

API Reference

Requires organizationId.

MethodSignatureReturns
createcreate(params: CreateApiKeyParams)ApiResponse<ApiKeyWithKey>
listlist(params?: PaginationParams)ApiResponse<ApiKey[]>
getget(id: string)ApiResponse<ApiKey>
revokerevoke(id: string)ApiResponse<{ revoked: boolean }>
rotaterotate(id: string)ApiResponse<RotateApiKeyResult>
updateRoleupdateRole(id: string, params: UpdateApiKeyRoleParams)ApiResponse<{ updated: boolean }>
getPermissionsgetPermissions(id: string)ApiResponse<ApiKeyPermissions>
const key = await client.apiKeys.create({ mode: 'sandbox', name: 'CI/CD Pipeline Key', }); const rotated = await client.apiKeys.rotate('7a8b9c0d-1e2f-3456-7890-abcdef123456'); await client.apiKeys.revoke('7a8b9c0d-1e2f-3456-7890-abcdef123456');
🚨 Store keys immediately

key.data.key and rotated.data.newApiKey.key are returned only once.


Users — client.users

API Reference

Requires organizationId.

MethodSignatureReturns
listlist(params?: ListUsersParams)ApiResponse<User[]>
getget(id: string)ApiResponse<User>
getMegetMe()ApiResponse<User>
updateupdate(id: string, params: UpdateUserParams)ApiResponse<User>
updateRoleupdateRole(id: string, params: { roleId: string })ApiResponse<{ updated: boolean }>
updateStatusupdateStatus(id: string, params: { status: UserStatus })ApiResponse<User>
getPermissionsgetPermissions(id: string)ApiResponse<UserPermissions>
addPermissionsaddPermissions(id: string, params: { permissions: string[] })ApiResponse<User>
removePermissionsremovePermissions(id: string, params: { permissions: string[] })ApiResponse<User>
sendPhoneVerificationsendPhoneVerification(id: string, params: SendPhoneVerificationParams)ApiResponse<{ sent: boolean }>
verifyPhoneverifyPhone(id: string, params: VerifyPhoneOtpParams)ApiResponse<User>
const users = await client.users.list(); const me = await client.users.getMe(); await client.users.updateRole('f1e2d3c4-b5a6-7890-1234-567890abcdef', { roleId: 'role_admin' });

Invitations — client.invitations

API Reference

Requires organizationId except for verify and accept.

MethodSignatureReturns
createcreate(params: CreateInvitationParams)ApiResponse<Invitation>
listlist(params?: ListInvitationsParams)ApiResponse<Invitation[]>
resendresend(id: string)ApiResponse<Invitation>
revokerevoke(id: string)ApiResponse<Invitation>
verifyverify(params: VerifyInvitationParams)ApiResponse<InvitationVerification>
acceptaccept(params: AcceptInvitationParams)ApiResponse<AcceptInvitationResult>
await client.invitations.create({ email: 'colleague@zenithsoftware.ng', roleId: 'role_member', });

Roles — client.roles

API Reference

Requires organizationId.

MethodSignatureReturns
listlist()ApiResponse<Role[]>
createcreate(params: CreateRoleParams)ApiResponse<Role>
getget(roleId: string)ApiResponse<RoleDetails>
updateupdate(roleId: string, params: UpdateRoleParams)ApiResponse<Role>
deletedelete(roleId: string)ApiResponse<null>
getAvailablePermissionsgetAvailablePermissions()ApiResponse<AvailablePermissions>
const roles = await client.roles.list(); const permissions = await client.roles.getAvailablePermissions(); const customRole = await client.roles.create({ name: 'invoice_submitter', displayName: 'Invoice Submitter', description: 'Can create and submit invoices only', permissions: ['invoice.create', 'invoice.submit', 'invoice.read'], });

B2B2B Partner Helpers

Methods on the EInvoice client instance for multi-tenant operations.

MethodDescription
forOrganization(orgId)Returns a new client scoped to a child org (same API key). For API keys, users, webhooks.
forApiKey(apiKey, orgId?)Returns a new client with a different API key. For invoices, sellers, buyers, billing.
createOrganizationWithApiKey(orgParams, keyParams)Creates a child org and its first API key in one call.
const partner = new EInvoice({ apiKey: 'sk_live_partner_key_here', organizationId: '9f8e7d6c-5b4a-3210-fedc-ba9876543210', }); const { organization, apiKey } = await partner.createOrganizationWithApiKey( { businessName: 'Lagos Tech Innovations Nigeria Ltd', email: 'admin@lagostech.ng' }, { mode: 'production', name: 'lagostech-primary-key' }, ); const childClient = partner.forApiKey(apiKey.key, organization.id); const seller = await childClient.sellers.create({ partyName: 'Lagos Tech Innovations Nigeria Ltd', email: 'billing@lagostech.ng', phoneNumber: '+2348023456789', taxNumber: '45678901-0001', postalAddress: { line1: '3 Victoria Island', city: 'Lagos', country: 'NG' }, }); const childAdmin = partner.forOrganization(organization.id); await childAdmin.apiKeys.list(); await childAdmin.users.list();
🚨 Store the key immediately

apiKey.key is returned only once. It cannot be retrieved after this response.


Error handling pattern

This pattern applies to every SDK method across all services. See Error Handling for the full error class reference.

import { EInvoice, EInvoiceApiError, EInvoiceRateLimitError, EInvoiceTimeoutError, EInvoiceConfigError, } from '@useyona/einvoice-js'; const client = new EInvoice({ apiKey: process.env.YONA_API_KEY! }); try { const invoice = await client.invoices.create({ sellerId: 'c7a1d3e5-8f2b-4a6c-9d0e-1f2a3b4c5d6e', buyerId: 'd8b2e4f6-9a3c-5b7d-0e1f-2a3b4c5d6e7f', invoiceNumber: 'INV-2026-001', invoiceDate: '2026-04-30', lineItems: [{ description: 'API integration services', hsnCode: '9983', quantity: 1, unitCode: 'EA', unitPrice: 750000, taxPercent: 7.5, }], }); } catch (err) { if (err instanceof EInvoiceRateLimitError) { await sleep(err.retryAfter * 1000); // retry } else if (err instanceof EInvoiceApiError) { switch (err.statusCode) { case 400: if (err.errorCode === 'BIZ001') { handleInsufficientCredits(); } else { handleValidation(err.errorCode, err.errors); } break; case 404: handleNotFound(err.message); break; case 409: handleConflict(err.message); break; } } else if (err instanceof EInvoiceTimeoutError) { retryWithBackoff(err.timeoutMs); } else if (err instanceof EInvoiceConfigError) { fixConfiguration(err.message); } }
Last updated on