openapi: 3.1.0 info: title: Cellulant Tingg Checkout API description: | Tingg Checkout 3.0 — accept payments across 25+ African markets through a single integration. Supports Express Checkout (hosted/modal) and Custom Checkout (host-to-host) for mobile money, cards, and direct bank transfer. version: "3.0.0" contact: name: Cellulant Developer Support url: https://developer.tingg.africa email: developer@cellulant.io license: name: Cellulant Terms of Service url: https://www.cellulant.io/terms servers: - url: https://api.tingg.africa description: Production - url: https://api-approval.tingg.africa description: Sandbox security: - BearerAuth: [] ApiKeyAuth: [] tags: - name: Authentication description: OAuth 2.0 access token issuance for Tingg API calls. - name: Express Checkout description: Create hosted checkout sessions returning short and long URLs. - name: Custom Checkout description: Host-to-host checkout flow for merchant-controlled UX. - name: Acknowledgement description: Acknowledge successful or partial payments back to the platform. paths: /v1/oauth/token/request: post: summary: Request OAuth Access Token description: Exchange clientId, clientSecret, and apiKey for a bearer access token used to authorize subsequent Tingg API requests. operationId: requestAccessToken tags: - Authentication requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TokenRequest' examples: TokenRequestExample: $ref: '#/components/examples/TokenRequestExample' responses: '200': description: Token issued content: application/json: schema: $ref: '#/components/schemas/TokenResponse' examples: TokenResponseExample: $ref: '#/components/examples/TokenResponseExample' '4XX': $ref: '#/components/responses/ErrorResponse' /v3/checkout-api/checkout-request/express-request: post: summary: Create Express Checkout Request description: Create a hosted checkout session. The response includes both short_url and long_url that the merchant can present to the end-user (use short_url to avoid truncation in SMS or WhatsApp). operationId: createExpressCheckout tags: - Express Checkout parameters: - $ref: '#/components/parameters/ApiKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ExpressCheckoutRequest' examples: ExpressCheckoutRequestExample: $ref: '#/components/examples/ExpressCheckoutRequestExample' responses: '200': description: Checkout created content: application/json: schema: $ref: '#/components/schemas/ExpressCheckoutResponse' examples: ExpressCheckoutResponseExample: $ref: '#/components/examples/ExpressCheckoutResponseExample' '4XX': $ref: '#/components/responses/ErrorResponse' /v3/checkout-api/checkout-request/custom-request: post: summary: Initiate Custom Checkout Request description: Initiate a host-to-host checkout where the merchant collects payment details and posts them to Tingg directly, retaining control of the UX. operationId: initiateCustomCheckout tags: - Custom Checkout parameters: - $ref: '#/components/parameters/ApiKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CustomCheckoutRequest' responses: '200': description: Custom checkout initiated content: application/json: schema: $ref: '#/components/schemas/CustomCheckoutResponse' '4XX': $ref: '#/components/responses/ErrorResponse' /v3/checkout-api/checkout-request/charge: post: summary: Initiate Charge Request description: Post a charge request to debit the customer for an initiated custom checkout. Used to push USSD/STK prompts or card charges from the merchant's backend. operationId: initiateChargeRequest tags: - Custom Checkout parameters: - $ref: '#/components/parameters/ApiKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ChargeRequest' responses: '200': description: Charge accepted content: application/json: schema: $ref: '#/components/schemas/ChargeResponse' '4XX': $ref: '#/components/responses/ErrorResponse' /v3/checkout-api/query-status: get: summary: Query Request Status description: Retrieve the current status of a previously raised checkout or charge request by merchant_transaction_id. operationId: queryRequestStatus tags: - Custom Checkout parameters: - $ref: '#/components/parameters/ApiKey' - name: merchant_transaction_id in: query required: true schema: type: string - name: service_code in: query required: true schema: type: string responses: '200': description: Status retrieved content: application/json: schema: $ref: '#/components/schemas/StatusResponse' '4XX': $ref: '#/components/responses/ErrorResponse' /v3/checkout-api/acknowledgement/request: post: summary: Acknowledge Payment description: Send the final or partial delivered status for a checkout transaction back to the platform. operationId: acknowledgePayment tags: - Acknowledgement parameters: - $ref: '#/components/parameters/ApiKey' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AcknowledgementRequest' examples: AcknowledgementRequestExample: $ref: '#/components/examples/AcknowledgementRequestExample' responses: '200': description: Acknowledgement logged content: application/json: schema: $ref: '#/components/schemas/AcknowledgementResponse' '4XX': $ref: '#/components/responses/ErrorResponse' components: securitySchemes: BearerAuth: type: http scheme: bearer bearerFormat: JWT ApiKeyAuth: type: apiKey in: header name: apikey description: Merchant apiKey issued in the Tingg integration dashboard. parameters: ApiKey: name: apikey in: header required: true description: Merchant API key issued in the Tingg integration dashboard. schema: type: string responses: ErrorResponse: description: Error response content: application/json: schema: $ref: '#/components/schemas/Error' schemas: TokenRequest: type: object required: [grant_type, client_id, client_secret] properties: grant_type: type: string enum: [client_credentials] client_id: type: string client_secret: type: string TokenResponse: type: object properties: access_token: type: string token_type: type: string example: Bearer expires_in: type: integer description: Lifetime in seconds. ExpressCheckoutRequest: type: object required: [merchant_transaction_id, service_code, country_code, currency_code, request_amount, callback_url] properties: merchant_transaction_id: type: string description: Unique merchant transaction id. service_code: type: string description: Tingg service code identifying the merchant's product line. country_code: type: string description: ISO 3166-1 alpha-2 country code (KE, UG, TZ, NG, GH, ...). currency_code: type: string description: ISO 4217 currency code. request_amount: type: number format: double request_description: type: string account_number: type: string msisdn: type: string description: Customer phone in E.164 format. customer_first_name: type: string customer_last_name: type: string customer_email: type: string format: email due_date: type: string format: date-time callback_url: type: string format: uri success_redirect_url: type: string format: uri fail_redirect_url: type: string format: uri payment_option_code: type: string language_code: type: string example: en ExpressCheckoutResponse: type: object properties: status_code: type: integer status_description: type: string checkout_request_id: type: string long_url: type: string format: uri short_url: type: string format: uri CustomCheckoutRequest: allOf: - $ref: '#/components/schemas/ExpressCheckoutRequest' - type: object properties: payer_client_code: type: string payer_mode: type: string enum: [MOBILE, BANK, CARD] CustomCheckoutResponse: type: object properties: status_code: type: integer checkout_request_id: type: string merchant_transaction_id: type: string ChargeRequest: type: object required: [checkout_request_id, payment_option_code, msisdn] properties: checkout_request_id: type: string merchant_transaction_id: type: string service_code: type: string payment_option_code: type: string msisdn: type: string amount: type: number format: double currency_code: type: string ChargeResponse: type: object properties: status_code: type: integer status_description: type: string cpg_transaction_id: type: string StatusResponse: type: object properties: checkout_request_id: type: string merchant_transaction_id: type: string request_status_code: type: string request_status_description: type: string request_amount: type: number format: double payments: type: array items: $ref: '#/components/schemas/Payment' failed_payments: type: array items: $ref: '#/components/schemas/Payment' Payment: type: object properties: cpg_transaction_id: type: string payer_transaction_id: type: string customer_name: type: string msisdn: type: string amount_paid: type: number format: double currency_code: type: string payment_mode: type: string hub_overall_status: type: string payment_status: type: string AcknowledgementRequest: type: object required: [acknowledgement_type, acknowledgment_reference, merchant_transaction_id, service_code, status_code, currency_code] properties: acknowledgement_amount: type: number format: double description: Required when acknowledgement_type is Partial. acknowledgement_type: type: string enum: [Full, Partial] acknowledgement_narration: type: string acknowledgment_reference: type: string merchant_transaction_id: type: string service_code: type: string status_code: type: integer description: 183 = successful, 180 = rejected, 188 = received, will be acknowledged later. currency_code: type: string AcknowledgementResponse: type: object properties: status_code: type: integer status_description: type: string Error: type: object properties: status_code: type: integer status_description: type: string errors: type: array items: type: object properties: code: type: string message: type: string examples: TokenRequestExample: summary: OAuth token request value: grant_type: client_credentials client_id: 1234567890abcdef client_secret: clsec_abcdefghijklmnopqr TokenResponseExample: summary: OAuth token response value: access_token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9... token_type: Bearer expires_in: 3599 ExpressCheckoutRequestExample: summary: Create express checkout for KES 1500 value: merchant_transaction_id: MX-2026-05-24-0001 service_code: TINGGSVC001 country_code: KE currency_code: KES request_amount: 1500 request_description: Order #42 — Premium subscription account_number: ACC-42 msisdn: '254712345678' customer_first_name: Wanjiru customer_last_name: Mwangi customer_email: wanjiru@example.co.ke callback_url: https://merchant.example.co.ke/tingg/ipn success_redirect_url: https://merchant.example.co.ke/checkout/success fail_redirect_url: https://merchant.example.co.ke/checkout/failed language_code: en ExpressCheckoutResponseExample: summary: Express checkout created value: status_code: 200 status_description: Successful checkout_request_id: '99887766' short_url: https://online.tingg.africa/checkout/Abc12 long_url: https://online.tingg.africa/checkout/express?accessKey=abcdef1234567890... AcknowledgementRequestExample: summary: Acknowledge a successful payment value: acknowledgement_type: Full acknowledgement_narration: Goods delivered acknowledgment_reference: ACK-001 merchant_transaction_id: MX-2026-05-24-0001 service_code: TINGGSVC001 status_code: 183 currency_code: KES