API Documentation

Complete reference for Chari Money's Banking-as-a-Service API. Integrate financial services into your applications with our robust and secure endpoints.

Getting Started

Version 1.8 · Last updated 5 novembre 2025

Welcome to the official documentation for Chari Money's Banking-as-a-Service (BAAS) API. This RESTful API empowers fintechs, platforms, and developers to integrate a complete financial infrastructure into their applications: account opening with KYC verification, wallet-to-wallet transactions, card deposits (3D Secure), bank wire transfers via RIB, multi-channel merchant payments (phone, QR Code, card), beneficiary management, retail agents, and real-time webhooks. All endpoints follow a preview/execute model with asynchronous webhook confirmation.

Authentication Headers

Include the following headers with all API requests:

HeaderTypeRequiredDescription
Chari-Api-KeystringRequiredAPI key for authentication. Provided by Chari for each environment (sandbox / production).
C-Request-IdstringOptionalUnique ID per request for tracing. Echoed back in the response. Recommended format: UUID v4. Ex: 69906411-0aa24a89-ab2005ca-9d18dc15

Test Credit Card (Sandbox)

PAN

4918914107195005

CVV

123

Expiry

08/25 (or any future date)

3DS Code

555

Postman Collection

Download the full Postman collection to test all API endpoints.

Download

Changelog

v1.8

2025-11-05

Initial documentation. Full API v1.8 coverage.

v1.8.1

2025-12-01

Added register-with-docs, merchant-kyc-upload, add-tokenized-card endpoints. Enriched reference tables (docTypes, customerStatuses, accountLevels). Detailed error codes with endpoint mapping. autoActivate parameter on confirm. Fixed confirm route.

C

Customer Registration

Full customer lifecycle management: status check, registration, OTP confirmation, PIN management, balance and info retrieval, and unregistration.

GET{host}/api/customers/status

Check Status with Chari

Retrieve the current registration status of a customer with Chari only.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredThe customer's phone number. Format: +212*********

Notes

  • 0 : Not exists — The number does not exist with ChariMoney.
  • 1 : Not confirmed — The number exists with ChariMoney but is not yet enrolled with Switch (OTP not entered).
  • 2 : Confirmed — The number exists and is registered with Switch.
  • 3 : Active — Registered with Switch and active with ChariMoney (PIN created).
  • 4 : Locked temporary — The number is temporarily blocked (max attempts exceeded).
  • 5 : Locked — The number is blocked.
GET{host}/api/customers/default

Check Status with Switch

Retrieve whether Chari is the default wallet for the customer.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredThe customer's phone number. Format: +212*********

Notes

  • true : Chari is the default wallet for the customer.
  • false : Chari is NOT the default wallet for the customer.
POST{host}/api/customers/register202

Register

Initiate a new customer registration process. An OTP will be sent via SMS.

ParameterTypeInRequiredDescription
PhoneNumberstringbodyRequiredThe customer's phone number. Format: +212*********
FirstNamestringbodyRequiredMinimum 2 letters (latin characters only)
LastNamestringbodyRequiredMinimum 2 letters (latin characters only)
CinstringbodyRequiredMinimum 5 characters
WalletTypestringbodyRequired"P": Particular (Particulier) / "C": Merchant (Commerçant)
POST{host}/api/customers/register200

Register with Documents

Register a merchant with KYC documents in a single step (multipart/form-data). Same route as basic register, but with file attachments.

ParameterTypeInRequiredDescription
phoneNumberstringbodyRequiredPhone number. Format: +212*********
firstNamestringbodyRequiredFirst name (min. 2 latin chars).
lastNamestringbodyRequiredLast name (min. 2 latin chars).
cinstringbodyRequiredNational ID number (min. 5 chars).
rcNumberstringbodyRequiredCommercial register number.
walletTypestringbodyRequired"C" (Merchant).
kycDocuments[n].docTypeintbodyRequiredDocument type ID (see "Document Types" table).
kycDocuments[n].docFrontfilebodyRequiredFront image of the document.
kycDocuments[n].docBackfilebodyOptionalBack image of the document (if applicable).

Notes

  • Content-Type must be multipart/form-data (not application/json).
  • Accepted files are images (JPEG, PNG) and PDF.
  • See the "Document Types" table for valid docType values.
POST{host}/api/customers/register/confirm

Confirm

Confirm a registration using OTP as a verification method.

ParameterTypeInRequiredDescription
PhoneNumberstringbodyRequiredThe customer's phone number. Format: +212*********
CodestringbodyRequiredThe received OTP code with format: xxx-xxx
autoActivatebooleanbodyOptionalIf true, directly activates the customer without requiring the Set PIN step. Useful if you don't plan to use ChariMoney's PIN system.
POST{host}/api/customers/confirm/resend-otp

Resend OTP

Resend the One-Time Password for registration or confirmation.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredThe customer's phone number. Format: +212*********
POST{host}/api/customers/login

Login with PIN

Authenticate an existing customer using their PIN.

ParameterTypeInRequiredDescription
PhoneNumberstringbodyRequiredThe customer's phone number. Format: +212*********
PinstringbodyRequiredPIN of the customer.

Notes

  • logged : true if authentication succeeded, false otherwise.
  • remainingAttempts : number of remaining attempts before account lockout.
POST{host}/api/customers/pin

Create PIN

Set up a secure PIN for a registered customer.

ParameterTypeInRequiredDescription
PhoneNumberstringbodyRequiredThe customer's phone number. Format: +212*********
PinstringbodyRequiredPIN of the customer. (4 numbers required)
PATCH{host}/api/customers/pin

Update PIN

Change an existing PIN for security or user preference.

ParameterTypeInRequiredDescription
PhoneNumberstringbodyRequiredThe customer's phone number. Format: +212*********
OldPinstringbodyRequiredExisting PIN of the customer.
NewPinstringbodyRequiredNew PIN of the customer.
POST{host}/api/customers/pin/resetComing Soon

Reset PIN

Reset customer PIN. To be delivered in the next version.

No parameters required.

GET{host}/api/customers/balance

Get Customer Balance

Retrieve the balance of a registered customer.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredThe customer's phone number. Format: +212*********
GET{host}/api/customers/info

Get Customer Info

Retrieve detailed profile data for a registered customer.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredThe customer's phone number. Format: +212*********

Notes

  • accountLevel : account level (1 = basic, 2-4 = higher KYC levels).
  • customerStatus : customer status (see "Check Status with Chari" endpoint).
  • rib : Bank Account Identifier (RIB) associated with the wallet.
PUT{host}/api/customers/unregister

Unregister

Deactivate or remove a customer from the platform.

ParameterTypeInRequiredDescription
PhoneNumberstringbodyRequiredThe customer's phone number. Format: +212*********
ReasonintbodyRequiredClosure reason code (see notes).

Notes

  • 1 : Closure at the initiative of the EDP — Unspecified reason
  • 2 : Closure at the initiative of the EDP — Suspicion of fraud
  • 3 : Closure at the initiative of the client — Contract closure
  • 4 : Closure at the initiative of the client — Lost or stolen phone
  • 5 : Closure at the initiative of the client — Unspecified reason
K

KYC

Mobile KYC flow (iOS/Android) powered by ShareID. Your app launches the ShareID SDK for document scan and selfie capture; ShareID performs quality, authenticity, and face-to-document matching.

Integration Flow

  1. 1Your app calls "/kyc/shareid/auth" to obtain a short-lived KYC token.
  2. 2The app opens the ShareID SDK with that token.
  3. 3The user scans their ID and completes a guided selfie.
  4. 4ShareID runs the checks.
  5. 5Your app calls "/kyc/session/complete" to signal the flow has finished on-device.
  6. 6A callback is sent to our API with status and documents.
GET{host}/api/kyc/shareid/auth

Authentication

Obtain a short-lived KYC token to launch ShareID SDK.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredThe customer's phone number. Format: +212*********

Notes

  • baseUrl : Base URL of the ShareID SDK to use.
  • applicant_id : unique identifier of the KYC request.
  • token : temporary JWT token for SDK-side authentication.
POST{host}/api/customers/upgrade/request

Confirmation

Signal the KYC flow has finished on-device and request account upgrade.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredThe customer's phone number. Format: +212*********
AccountLevelintqueryRequiredThe account level to upgrade to (2, 3, or 4).
POST{host}/api/customers/merchant/kyc/request

Merchant KYC Upload

Upload merchant KYC documents to request an account upgrade (multipart/form-data).

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredMerchant phone number. Format: +212*********
kycDocuments[n].docTypeintbodyRequiredDocument type ID (see "Document Types" table).
kycDocuments[n].docFrontfilebodyRequiredFront image of the document.
kycDocuments[n].docBackfilebodyOptionalBack image (if applicable).
O

Operations

All financial operations: card deposits, wallet-to-wallet transfers, bank transfers, merchant payments, chargebacks, refunds, and reference-based requests.

CashIn Card

POST{host}/api/operations/cashin/card/preview

Preview (by Phone)

Check feasibility of depositing funds into a customer's wallet from a card.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredNuméro de téléphone du client. Format : +212*********
AmountdecimalbodyRequiredMontant à déposer. Doit être un nombre positif.
POST{host}/api/operations/cashin/card

Execute (by Phone)

Add funds to a customer's wallet from a payment card. Triggers 3D Secure authentication.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredNuméro de téléphone du client.
FirstNamestringbodyRequiredPrénom du titulaire de la carte.
LastNamestringbodyRequiredNom du titulaire de la carte.
CvvstringbodyRequiredCode de sécurité à 3 chiffres (CVV).
AmountdecimalbodyRequiredMontant à déposer.
CurrencystringbodyOptionalCode devise ISO 3 lettres (ex : MAD).
PanstringbodyRequiredNuméro complet de la carte (PAN).
ExpiryDatestringbodyRequiredDate d'expiration au format YYMM.
KeepAliveboolbodyRequiredtrue : sauvegarder la carte pour usage futur / false : usage unique.
CardNamestringbodyOptionalNom choisi par l'utilisateur pour sauvegarder la carte.

Notes

  • After 3D Secure authentication, the user is redirected to acceptURL or declineURL.
  • RESPONSE_CODE in the redirect URL: 0 = success, any other value = failure.
  • REASON_CODE : human-readable reason for the result (e.g., SUCCESS, DECLINED).
  • Validate RESPONSE_CODE and REASON_CODE to determine the next action in your application.
POST{host}/api/operations/cashin/card/{cardId}

Execute with Saved Card

Add funds from a saved tokenized card.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredNuméro de téléphone du client.
CardIdintrouteRequiredIdentifiant de la carte sauvegardée.
CvvstringbodyRequiredCode de sécurité à 3 chiffres.
AmountdecimalbodyRequiredMontant à déposer.
POST{host}/api/operations/cashin/card/agent/preview

Preview (by Agent)

Check feasibility of depositing funds via agent code.

ParameterTypeInRequiredDescription
codestringqueryRequiredCode de l'agent.
AmountdecimalbodyRequiredMontant à déposer.
POST{host}/api/operations/cashin/card/agent

Execute (by Agent)

Add funds to a customer's wallet via agent.

ParameterTypeInRequiredDescription
agentstringqueryRequiredCode de l'agent.
FirstNamestringbodyRequiredPrénom du titulaire de la carte.
LastNamestringbodyRequiredNom du titulaire de la carte.
CvvstringbodyRequiredCode de sécurité à 3 chiffres.
AmountdecimalbodyRequiredMontant à déposer.
PanstringbodyRequiredNuméro complet de la carte.
ExpiryDatestringbodyRequiredDate d'expiration au format YYMM.
KeepAliveboolbodyRequiredSauvegarder la carte pour usage futur.
CurrencystringbodyOptionalThe 3-letter ISO currency code (e.g., MAD).
CardNamestringbodyOptionalName chosen by the user to save the card.

Transfer

POST{host}/api/operations/transfer/preview

Preview

Check feasibility of moving funds between customers' wallets internally.

ParameterTypeInRequiredDescription
CustomerPhoneNumberstringbodyRequiredNuméro de l'émetteur. Format : +212*********
AmountdecimalbodyRequiredMontant à transférer.
ReasonstringbodyRequiredMotif du transfert.
RecipientPhoneNumberstringbodyRequiredNuméro du bénéficiaire. Format : +212*********
BeneficiaryIdintbodyOptionalRéférence à un bénéficiaire existant (optionnel).
POST{host}/api/operations/transfer

Execute

Move funds between customers' wallets internally.

ParameterTypeInRequiredDescription
CustomerPhoneNumberstringbodyRequiredNuméro de l'émetteur.
AmountdecimalbodyRequiredMontant à transférer.
ReasonstringbodyRequiredMotif du transfert.
RecipientPhoneNumberstringbodyRequiredNuméro du bénéficiaire.
BeneficiaryIdintbodyOptionalReference to an existing beneficiary (optional).

Bank Transfer

POST{host}/api/operations/bank-transfer/preview

Preview

Check feasibility of sending money from a wallet to an external bank account.

ParameterTypeInRequiredDescription
CustomerPhoneNumberstringbodyRequiredRequis si AgentCode est vide.
AgentCodestringbodyOptionalRequis si CustomerPhoneNumber est vide. Code Agent (Principal ou Retail).
AmountdecimalbodyRequiredMontant à virer.
ReasonstringbodyRequiredMotif du virement (caractères latins uniquement).
BeneficiaryIdintbodyOptionalOptionnel si rib + beneficiaryName sont fournis.
BeneficiaryNamestringbodyOptionalOptionnel si beneficiaryId est fourni.
RibstringbodyOptionalRIB : chaîne numérique de 24 chiffres. Optionnel si beneficiaryId est fourni.

Notes

  • Au moins un identifiant parmi beneficiaryId ou (rib + beneficiaryName) doit être fourni.
POST{host}/api/operations/bank-transfer

Execute

Send money from a wallet to an external bank account.

ParameterTypeInRequiredDescription
CustomerPhoneNumberstringbodyRequiredRequis si agentCode est vide.
AgentCodestringbodyOptionalRequis si CustomerPhoneNumber est vide.
AmountdecimalbodyRequiredMontant à virer.
ReasonstringbodyOptionalMotif du virement.
BeneficiaryIdintbodyOptionalOptionnel si rib + beneficiaryName sont fournis.
BeneficiaryNamestringbodyOptionalOptionnel si beneficiaryId est fourni.
RibstringbodyOptionalRIB : 24 chiffres. Requis si pas de beneficiaryId.

Merchant Payment

POST{host}/api/operations/merchant/payment/push/manual/preview

By Phone — Preview

Check Pay Merchant by PhoneNumber.

ParameterTypeInRequiredDescription
CustomerPhoneNumberstringbodyRequiredNuméro du client payeur.
AmountdecimalbodyRequiredMontant du paiement.
ReasonstringbodyRequiredMotif du paiement.
RecipientPhoneNumberstringbodyRequiredNuméro du marchand.
BeneficiaryIdintbodyOptionalReference to an existing beneficiary (optional).
POST{host}/api/operations/merchant/payment/push/manual

By Phone — Execute

Pay Merchant by PhoneNumber.

ParameterTypeInRequiredDescription
CustomerPhoneNumberstringbodyRequiredNuméro du client payeur.
AmountdecimalbodyRequiredMontant du paiement.
ReasonstringbodyRequiredMotif du paiement.
RecipientPhoneNumberstringbodyRequiredNuméro du marchand.
BeneficiaryIdintbodyOptionalReference to an existing beneficiary (optional).
POST{host}/api/operations/merchant/payment/push/qrcode/preview

By QR Code — Preview

Check Pay Merchant by QR Code.

ParameterTypeInRequiredDescription
CustomerPhoneNumberstringbodyRequiredNuméro du client payeur.
QrCodeContentstringbodyRequiredContenu du QR Code scanné.
AmountdecimalbodyRequiredMontant du paiement.
POST{host}/api/operations/merchant/payment/push/qrcode

By QR Code — Execute

Pay Merchant by QR Code.

ParameterTypeInRequiredDescription
CustomerPhoneNumberstringbodyRequiredNuméro du client payeur.
QrCodeContentstringbodyRequiredContenu du QR Code.
AmountdecimalbodyRequiredMontant du paiement.
POST{host}/api/operations/merchant/payment/push/card/preview

By Card — Preview

Check Pay Merchant by card (Card to Wallet).

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredNuméro du marchand.
AmountdecimalbodyRequiredMontant du paiement.
POST{host}/api/operations/merchant/payment/push/card

By Card — Execute

Pay Merchant by card (Card to Wallet).

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredNuméro du marchand.
AmountdecimalbodyRequiredMontant du paiement.
POST{host}/api/operations/merchant/qrcode/static

Static QR Generation

Generate a static QR Code with a specific amount.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredNuméro du marchand.
MaskedNumberboolqueryOptionalMasquer le numéro du marchand dans le contenu QR. Ex : +2126######74
AmountdecimalbodyRequiredMontant fixe du QR Code.
GET{host}/api/operations/merchant/qrcode

Dynamic QR Generation

Generate a dynamic QR Code.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredNuméro du marchand.
MaskedNumberboolqueryOptionalMasquer le numéro du marchand.

Notes

  • QR statique : le montant est fixe et intégré dans le QR.
  • QR dynamique : le client saisit le montant lors du paiement.
  • qrCodeReference : référence unique attribuée aux QR dynamiques.

ChargeBack

POST{host}/api/operations/chargeback/preview

Preview

Check the feasibility of performing a chargeback.

ParameterTypeInRequiredDescription
SourcePhoneNumberstringbodyRequiredNuméro du client à l'origine. Format : +212*********
AmountdecimalbodyRequiredMontant du chargeback.
DescriptionstringbodyRequiredMotif du chargeback.
DestinationPhoneNumberstringbodyRequiredNuméro du destinataire. Format : +212*********
OriginalOperationIdintbodyRequiredID de l'opération d'origine qui a déclenché le chargeback.
POST{host}/api/operations/chargeback

Execute

Execute a chargeback operation.

ParameterTypeInRequiredDescription
SourcePhoneNumberstringbodyRequiredNuméro du client à l'origine.
AmountdecimalbodyRequiredMontant du chargeback.
DescriptionstringbodyRequiredMotif du chargeback.
DestinationPhoneNumberstringbodyRequiredNuméro du destinataire.
OriginalOperationIdintbodyRequiredID de l'opération d'origine.

Request Operations

POST{host}/api/operations/cashin/request

Request CashIn

Request a CashIn operation. Generates a unique reference that expires over time.

ParameterTypeInRequiredDescription
PhoneNumberstringbodyRequiredNuméro de téléphone du client.
AmountdecimalbodyRequiredMontant du CashIn.

Notes

  • operationType : 1 = CashIn, 2 = CashOut
  • operationStatus : 1 = open (en attente), 2 = completed (exécutée), 3 = failed (échouée)
POST{host}/api/operations/cashout/request

Request CashOut

Request a CashOut operation. Generates a unique reference that expires over time.

ParameterTypeInRequiredDescription
PhoneNumberstringbodyRequiredNuméro de téléphone du client.
AmountdecimalbodyRequiredMontant du CashOut.

Get Operations

GET{host}/api/operations

By Customer

Get a list of operations for a specific customer.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredNuméro de téléphone du client.
PageSizeintqueryOptionalRésultats par page. Par défaut : 10
PageNumberintqueryOptionalNuméro de page. Par défaut : 1
OperationTypelist intqueryOptional1=CASHIN, 2=CASHOUT, 3=TRANSFER, 5=PAYMENT_PUSH, 7=PAYMENT_REFUND, 9=BANK_TRANSFER, 12=CHARGEBACK, 24=PAYMENT_CARD
TransactionStatusintqueryOptional1=PENDING, 2=COMPLETED, 3=FAILED, 4=CANCELLED
SensintqueryOptional1=CREDIT, 2=DEBIT
FromdatetimequeryOptionalDate/heure de début du filtre.
TodatetimequeryOptionalDate/heure de fin du filtre.

Notes

  • collection : liste paginée des opérations.
  • count : nombre total d'opérations correspondant aux filtres.
  • accountNumber : peut être un numéro de téléphone, un RIB ou un accountId.
GET{host}/api/operations/{id}

By ID

Get a specific operation by its ID.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredNuméro de téléphone du client.
IdintrouteRequiredID de l'opération.

Notes

  • operationId : identifiant de l'opération globale.
  • transactionId : identifiant de la transaction principale (une opération peut générer plusieurs transactions : débit émetteur, crédit destinataire, frais, etc.).
  • transactionReference : référence de la transaction principale.
  • amount : montant initial.
  • totalAmount : montant après application des frais et commissions.
GET{host}/api/operations/all

All (by Partner)

Get a list of all operations by partner.

ParameterTypeInRequiredDescription
PageSizeintqueryOptionalRésultats par page. Par défaut : 10
PageNumberintqueryOptionalNuméro de page. Par défaut : 1
OperationTypelist intqueryOptionalFiltrer par type d'opération.
TransactionStatusintqueryOptionalFiltrer par statut.
SensintqueryOptional1=CREDIT, 2=DEBIT
FromdatetimequeryOptionalDate/heure de début.
TodatetimequeryOptionalDate/heure de fin.
GET{host}/api/operations/c-request-idComing Soon

Get Operation By C-Request-Id

Get an operation by its C-Request-Id. To be delivered in the next version.

No parameters required.

Refund

POST{host}/api/operations/refund/preview

Preview

Check refund feasibility after merchant payment.

ParameterTypeInRequiredDescription
PhoneNumberstringbodyRequiredNuméro du client à rembourser.
OperationIdintbodyRequiredID de l'opération à rembourser.
RefundAmountdecimalbodyRequiredMontant du remboursement.
OrderIdstringbodyRequiredOrderId original du paymentGateway.
TransactionTrackIdstringbodyRequiredTransactionTrackId original du paymentGateway.
POST{host}/api/operations/refund

Execute

Refund customers after merchant payment.

ParameterTypeInRequiredDescription
PhoneNumberstringbodyRequiredNuméro du client.
OperationIdintbodyRequiredID de l'opération à rembourser.
RefundAmountdecimalbodyRequiredMontant du remboursement.
OrderIdstringbodyRequiredOrderId original.
TransactionTrackIdstringbodyRequiredTransactionTrackId original.
B

Beneficiary

Manage a customer's beneficiaries: list, add, update, and delete. Beneficiaries can be identified by phone number and/or RIB.

GET{host}/api/customer/beneficiaries

Get Beneficiaries

Get a list of beneficiaries for a customer.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredNuméro de téléphone du client.
PageSizeintqueryOptionalRésultats par page. Par défaut : 10
PageNumberintqueryOptionalNuméro de page. Par défaut : 1
SearchstringqueryOptionalFiltrer par mot-clé.
FromdatetimequeryOptionalDate de création — début.
TodatetimequeryOptionalDate de création — fin.
POST{host}/api/customer/beneficiaries

Add Beneficiary

Add a new beneficiary. At least PhoneNumber or RIB must be provided.

ParameterTypeInRequiredDescription
PhoneNumber (query)stringqueryRequiredNuméro de téléphone du client (propriétaire).
NamestringbodyRequiredNom du bénéficiaire. Minimum 2 lettres.
PhoneNumberstringbodyOptionalNuméro du bénéficiaire. Format : +212*********
RibstringbodyOptionalRIB du bénéficiaire. 24 chiffres.
EmailstringbodyOptionalEmail du bénéficiaire.

Notes

  • PhoneNumber ou RIB : au moins l'un des deux doit être fourni.
PUT{host}/api/customer/beneficiaries/{id}

Update Beneficiary

Update an existing beneficiary.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredNuméro de téléphone du client (propriétaire).
IdintrouteRequiredID du bénéficiaire à modifier.
NamestringbodyRequiredNom. Minimum 2 lettres.
PhoneNumberstringbodyOptionalNuméro du bénéficiaire.
RibstringbodyOptionalRIB. 24 chiffres.
EmailstringbodyOptionalEmail du bénéficiaire.
DELETE{host}/api/customer/beneficiaries/{Id}

Delete Beneficiary

Delete an existing beneficiary.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredNuméro de téléphone du client.
IdintrouteRequiredID du bénéficiaire à supprimer.
T

Tokenized Cards

View and manage saved (tokenized) bank cards of a customer.

GET{host}/api/customers/tokenized/cards

Get Cards by Customer

Retrieve all tokenized cards for a customer.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredNuméro de téléphone du client.
PageSizeintqueryOptionalRésultats par page. Par défaut : 10
PageNumberintqueryOptionalNuméro de page. Par défaut : 1

Notes

  • customerBankCardId: unique identifier for the saved card.
  • maskedPan: masked card number (last 4 digits).
  • issuer: name of the issuing bank.
  • scheme: card network (Visa, Mastercard, etc.).
GET{host}/api/customers/tokenized/cards/{id}

Get Card by ID

Retrieve a specific tokenized card by its ID.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredNuméro de téléphone du client.
IdintrouteRequiredID de la carte.
POST{host}/api/customers/tokenized/cards

Add Tokenized Card

Save (tokenize) a new bank card for a customer.

ParameterTypeInRequiredDescription
PhoneNumberstringqueryRequiredCustomer phone number.
FirstNamestringbodyRequiredCardholder first name.
LastNamestringbodyRequiredCardholder last name.
PanstringbodyRequiredFull card number (PAN).
ExpiryDatestringbodyRequiredExpiry date in YYMM format (e.g. 3005).
CvvstringbodyRequiredCard verification code (CVV/CVC).
CardNamestringbodyOptionalCustom card name (alias).

Notes

  • The PAN (card number) will be securely stored and tokenized.
  • Use the sandbox test card for testing (see the Test Card section).
DELETE{host}/api/customers/tokenized/cards/{id}Coming Soon

Delete Tokenized Card

Delete a tokenized card. To be delivered in the next version.

No parameters required.

R

Retail Agents

Manage retail agents: list, add, and execute CashIn/CashOut operations by reference.

GET{host}/api/agents/retail

Get Retail Agents

List all retail agents.

ParameterTypeInRequiredDescription
CodestringqueryRequiredCode de l'agent.
PageSizeintqueryOptionalRésultats par page. Par défaut : 10
PageNumberintqueryOptionalNuméro de page. Par défaut : 1
FromdatetimequeryOptionalCréation de l'agent — date début.
TodatetimequeryOptionalCréation de l'agent — date fin.
GET{host}/api/agents/retail/{code}

Get Agent by Code

Get a specific retail agent by code.

ParameterTypeInRequiredDescription
CodestringrouteRequiredCode de l'agent.
POST{host}/api/agents/retail

Add Retail Agent

Add a new retail agent.

ParameterTypeInRequiredDescription
PhoneNumberstringbodyRequiredNuméro de téléphone de l'agent. Format : +212*********
NamestringbodyRequiredNom commercial de l'agent.
FirstNamestringbodyRequiredPrénom. Minimum 2 lettres.
LastNamestringbodyRequiredNom de famille. Minimum 2 lettres.
CinstringbodyRequiredNuméro de pièce d'identité.
AddressstringbodyOptionalAdresse de l'agent.
EmailstringbodyOptionalEmail de l'agent.
PUT{host}/api/agents/retail/{code}Coming Soon

Update Retail Agent

Update a retail agent. To be delivered in the next version.

No parameters required.

GET{host}/api/operations/cashin/request

Get CashIn by Reference

Retrieve requested operation details using a unique reference ID.

ParameterTypeInRequiredDescription
ReferencestringqueryRequiredRéférence unique de l'opération.

Notes

  • type : 1 = CashIn, 2 = CashOut
  • status : 1 = open, 2 = completed, 3 = failed
POST{host}/api/agents/operations/cashin

Execute CashIn by Reference

Execute a CashIn operation by the agent.

ParameterTypeInRequiredDescription
CodestringbodyRequiredCode de l'agent.
ReferencestringbodyRequiredRéférence de l'opération.
GET{host}/api/operations/cashout/request

Get CashOut by Reference

Retrieve CashOut operation details by reference.

ParameterTypeInRequiredDescription
ReferencestringqueryRequiredRéférence unique de l'opération.
POST{host}/api/agents/operations/cashout

Execute CashOut by Reference

Execute a CashOut operation by the agent.

ParameterTypeInRequiredDescription
CodestringbodyRequiredCode de l'agent.
ReferencestringbodyRequiredRéférence de l'opération.
P

Principal Agents

View information about a principal agent.

GET{host}/api/agents/principal

Get Principal Agent by Code

Get the account info of a principal agent.

ParameterTypeInRequiredDescription
CodestringqueryRequiredCode de l'agent principal.
W

Webhooks

Webhooks let Chari BAAS notify your system about events (operation completed, KYC updates, etc.) in near-real time. Your server exposes an HTTPS endpoint; we POST signed JSON events to it.

HTTP Request

POSThttps://{your-domain}/webhooks/chari

Headers

Content-Type: application/jsonUser-Agent: Chari-BAAS-Webhook/1.0C-Webhook-Id: xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxApi-Key: xxxxxxxx

Réponse attendue : 200 OK sous 5 secondes (corps vide). Tout code non-2xx déclenche un retry.

Event Body Properties

PropertyTypeRequiredDescription
WebhookIdstringRequiredIdentifiant du webhook.
EventIdstringRequiredType d'événement. Ex : bank-transfer.initiated
CRequestIdstringRequiredIdentifiant de traçage reçu du partenaire.
OperationIdintRequiredID de l'opération exécutée (peut être 0 si aucune opération créée).
TransactionIdintOptionalID de la transaction principale.
OperationTypeintRequiredCode du type d'opération (voir Types).
OperationStatusintRequired1 = Open, 2 = Completed, 3 = Failed
CreatedAtdateRequiredDate de début du processus.
AmountdecimalRequiredMontant de l'opération.
FeeAmountdecimalRequiredMontant des frais.
PrimaryAccountNumberstringRequiredNuméro de téléphone de l'émetteur.
SecondaryAccountNumberstringOptionalNuméro de téléphone du destinataire.
MethodstringOptionalMéthode : Card / Agent / Network
CustomDatastringOptionalDonnées personnalisées du partenaire (max 128 caractères).
GatewayTrackIdstringOptionalGateway Transaction Track Id.
GatewayOrderIdstringOptionalGateway Transaction Order Id.
GatewayReferenceIdstringOptionalGateway Transaction Reference Id.
BankTransferBeneficiaryNamestringOptionalNom du bénéficiaire pour les virements bancaires.
NetworkNamestringOptionalNom du réseau pour les opérations réseau.
ReferencestringOptionalRéférence de l'opération par référence.

Retry Policy

Backoff:1m, 5m, 30m, 60m, then every 6h up to 72h total.
Stop:On first 200.
Dead letter:After 72h marked as undeliverable.

Events

Event IDDescription
customer.kycKYC process started
customer.level.updatedCustomer account level updated
operation.createdOperation is created (pending)
operation.updatedOperation status changes
cashin.card.authorizedCashIn by Card accepted
payment.card.authorizedPayment by Card accepted
bank-transfer.initiatedBank transfer sent
bank-transfer.completedBank transfer settled
bank-transfer.failedBank transfer rejected/returned
bank-transfer.receivedBank transfer received
transfer.receivedTransfer received
cashin.network.executedCashIn by reference executed
cashout.network.executedCashOut by reference executed

Example Event Body

json
{
  "data": {
    "WebhookId": 12345,
    "CRequestId": "a4d1e0b5-9f6a-4c1d-bc7b-2d0a7f4b9b12",
    "OperationId": 924381,
    "OperationType": 5,
    "OperationStatus": 2,
    "CreatedAt": "2025-11-05T10:12:00Z",
    "ExecutedAt": "2025-11-05T10:12:22Z",
    "Amount": 25000.00,
    "FeeAmount": 350.00,
    "CustomData": "{\"note\":\"Salary for October\"}",
    "PrimaryAccountNumber": "+212711111111",
    "SecondaryAccountNumber": "+212722222222",
    "Method": "BankTransfer",
    "Reference": "BANK-REF-9FJ2X7",
    "BankTransferBeneficiaryName": "Aminata Diop"
  }
}
R

Response Format

All API responses are wrapped in a `data` object. The C-Request-Id header you send is echoed back in the response.

C-Request-Id Header

Our API supports the C-Request-Id header to allow networks to track requests efficiently. You can include a unique C-Request-Id in the request headers, which will be echoed back in the response.

T

Types & References

Operation Types

IDCode
1CASHIN
2CASHOUT
3TRANSFER
4DEPOSIT
5PAYMENT_PUSH
6PAYMENT_PULL
7PAYMENT_REFUND
8ALIMENTATION_AGENT
9BANK_TRANSFER
10MOBILE_TOP_UP
12CHARGEBACK
24PAYMENT_CARD

Transaction Types

IDCode
1CASHIN
2CASHOUT
3TRANSFER
5PAYMENT_PUSH
6TRANSACTION_FEES
7PAYMENT_REFUND
9CHARGEBACK
10CHARGEBACK_CANCELLATION
16BANK_TRANSFER
18CASHBACK

Transaction Statuses

IDCodeDescription
1PENDINGPending
2COMPLETEDCompleted
3FAILEDFailed
4CANCELLEDCancelled

Transaction Direction (Sens)

IDCodeDescription
1CREDITCredit (incoming funds)
2DEBITDebit (outgoing funds)

Customer Statuses

IDCodeDescription
0NOT_EXISTSNumber does not exist at ChariMoney
1NOT_CONFIRMEDExists but not confirmed (OTP not entered)
2CONFIRMEDConfirmed and registered with Switch
3ACTIVERegistered, active, and PIN created
4LOCKED_TEMPORARYTemporarily locked (excessive attempts)
5LOCKEDLocked

Account Levels

IDCodeDescription
1BASICBasic level — registration without KYC
2KYC_LEVEL_2Level 2 — ShareID verification (document + selfie)
3KYC_LEVEL_3Level 3 — advanced verification
4KYC_LEVEL_4Level 4 — full verification

Document Types

IDCodeDescription
1IdentityCardNational identity card
2DrivingLicenseDriving license
3PassportPassport
4ResidencePermitResidence permit
5ProofOfIncomeProof of income
6ProofOfResidenceProof of residence
7SelfieSelfie / Face photo
8CommercialRegisterCommercial register
E

Error Codes

HTTP Status Codes

401 UnauthorizedAuthentication credentials (API KEY) not authorized.
422 UnprocessableThe server is unable to process the request.
423 LockedThe access is locked for the given customer.
400 Bad RequestCase-specific error with Chari error code.

Error Response Format

json
{
  "errorCode": 20005,
  "errorDescription": "The specified user could not be found."
}

Chari Error Codes

10xxxGeneral

CodeMessageRelated Endpoints
10001Missing Parameters.

20xxxCustomer

CodeMessageRelated Endpoints
20000The phone number format is invalid.
20005The specified user could not be found.
20006The initial parameters provided are incorrect or invalid.
20007The Merchant Category Code (MCC) provided is incorrect or not recognized.
20008Registration is temporarily locked due to security or policy restrictions.
20009The request is pending confirmation. Please wait for further processing.
20017There is no pending request associated with the provided Phone Number.

26xxxPIN / Authentication

CodeMessageRelated Endpoints
26001The entered PIN is incorrect.
26004A PIN has already been set for this wallet.
26005The provided PIN does not meet the required format (must be a 4-digit number).

27xxxBeneficiary

CodeMessageRelated Endpoints
27000The Beneficiary already exists with the same phoneNumber.
27001The Beneficiary does not exist.

32xxxKYC / Upgrade

CodeMessageRelated Endpoints
32000An upgrade request is already under review for this account.
I

Infrastructure & Security

Environments

Sandbox

https://sandbox.charimoney.com

Development and testing. Transactions are simulated.

Production

Communiqué sur demande

Live transactions. Requires prior approval.

Security & Compliance

  • API authentication is handled using API Keys.
  • Requests from non-whitelisted IPs/domains will be rejected.
  • If an API key is compromised, it must be rotated immediately.
  • Rate limiting may apply to prevent abuse.
  • The production environment requires prior approval and testing in sandbox.

Next Steps for Integration

  1. 1
    Request API keys

    Contact support to receive your dedicated sandbox and production keys.

  2. 2
    Submit IPs/domains

    Provide the list of public IPs or domains for whitelisting.

  3. 3
    Test in sandbox

    Run all your integration tests in the sandbox environment.

  4. 4
    Go to production

    Once approved, switch to production with your live API key.

API Documentation - ChariBaas | ChariBaas