Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

Deposit & Withdraw

Who it's for: Users topping up or cashing out their cGHS balance via mobile money or bank transfer, and developers integrating deposit and withdrawal flows into their apps. Why it matters: Moving money on and off chain is as simple as a mobile money transfer — users pay in GHS through familiar channels and receive spendable cGHS immediately on confirmation.

cGHS is minted when a user deposits fiat via Transakt (mobile money / bank transfer gateway) and burned on redemption. The flow is two-step: initiate the payment, then confirm/mint once the payment is verified.


POST /deposit — Initiate Fiat Deposit

Starts a Transakt payment collection. Returns a Transakt reference the user pays into.

Request
{
  "amount": "100.00",
  "channel": "mobile_money",
  "phoneNumber": "+233241234567",
  "userAddress": "0xabc..."
}
FieldNotes
amountFiat amount (GHS, human-readable)
channel"mobile_money" or "bank"
phoneNumberMobile money number (with country code)
userAddressUser's wallet address to receive cGHS
Response
{
  "success": true,
  "depositId": "d1-uuid",
  "amountGHS": "100.00",
  "transaktRef": "TRX-123456",
  "transaktError": null
}

POST /deposit/confirm — Confirm & Mint

Called after Transakt payment is verified (or triggered by the Transakt webhook automatically). Mints cGHS on-chain.

Request — either by deposit ID:

{ "depositId": "d1-uuid" }

Or by address + amount (manual override):

{ "amount": "100.00", "userAddress": "0xabc..." }
Response
{
  "success": true,
  "depositId": "d1-uuid",
  "proofHash": "0xproofhash...",
  "txId": "tx-uuid"
}

GET /deposit/:id — Deposit Status

{
  "depositId": "d1-uuid",
  "userAddress": "0xabc...",
  "amountGHS": "100.00",
  "status": "complete",
  "transaktRef": "TRX-123456",
  "txId": "tx-uuid",
  "txHash": "0xdeadbeef...",
  "createdAt": "2026-03-19T10:00:00Z"
}

POST /withdraw — Withdraw (Burn cGHS)

Burns cGHS and triggers a Transakt payout to the user's bank/mobile money.

Request
{
  "userAddress": "0xabc...",
  "amount": "50000000",
  "channel": "mobile_money",
  "receiver": "+233241234567"
}

amount is in base units (6 decimals) — 50000000 = 50 cGHS.

Response
{
  "success": true,
  "withdrawId": "d1-uuid",
  "amountGHS": "50.00",
  "userAddress": "0xabc...",
  "receiver": "+233241234567",
  "txId": "tx-uuid"
}

GET /withdraw/:id — Withdrawal Status

{
  "withdrawId": "d1-uuid",
  "userAddress": "0xabc...",
  "amountGHS": "50.00",
  "receiver": "+233241234567",
  "status": "complete",
  "transaktRef": "TRX-789012",
  "txId": "tx-uuid",
  "txHash": "0xdeadbeef...",
  "createdAt": "2026-03-19T10:05:00Z"
}

Webhooks

PathSenderPurpose
POST /webhook/transaktTransaktPayment confirmed → triggers mint
POST /webhook/shikaShika WalletOn-chain tx confirmed → updates status