Authorization header required) because they are called directly from customer-facing checkout pages or from third-party providers. See the per-endpoint notes for exceptions.
Base URL https://api.genuka.com · Auth Authorization: Bearer <token> + X-Company: <companyId> · Getting Started
Endpoints at a glance
Stripe
GET /2023-11/stripe/callback
Handle the Stripe OAuth Connect redirect. Stripe sends code and state query parameters after the merchant authorises Genuka on their Stripe account. On success the merchant is redirected to the dashboard payment-methods page. On failure all Stripe payment methods for the company are deactivated.
Note: This endpoint is called by Stripe’s servers, not by your application. Do not call it directly.Query parameters
302 Found): Redirects to the frontend payment-methods page.
Error responses
302 Found— invalid state token; redirects to login witherror=Invalid state parameter.302 Found— Stripe token exchange failed; redirects to login with error message.
POST /2023-11/stripe/checkout
Create a Stripe hosted checkout session for an order or an app subscription. Returns the session id and redirect url. If the company currency is not supported by Stripe (e.g. XAF, XOF) the amount is automatically converted to USD.
Auth: Not required. Called from customer-facing checkout pages.Request body
200 OK):
400 Bad Request— order/subscription not found or Stripe session creation failed:{ "error": "No such order." }404 Not Found— order/subscription ULID does not exist.
POST /2023-11/stripe/webhooks
Platform-level Stripe webhook receiver. Stripe calls this endpoint to notify of payment events (e.g. checkout.session.completed). Stripe verifies the payload signature using the platform webhook secret. Always respond 200 OK to prevent retries.
Auth: Not required. Called by Stripe servers only.
Success response (
200 OK):
400 Bad Request— signature verification failed.
POST /2023-11/stripe/webhooks/{paymentMethod}
Per-merchant webhook receiver for Stripe accounts connected in direct mode. The signature is verified using the individual merchant’s webhook secret stored in their payment method configuration.
Auth: Not required. Called by Stripe servers only.Path parameters
Success response (
200 OK):
404 Not Found—paymentMethodULID does not exist.400 Bad Request— signature verification failed.
PayDunya
GET /2023-11/paydunya/callback
Payment return URL that PayDunya redirects the customer to after a checkout attempt. Always returns 200 OK; actual payment confirmation happens via the webhook.
Auth: Not required.
200 OK):
POST /2023-11/paydunya/checkout
Create a PayDunya hosted checkout session for an order. Returns the PayDunya invoice token and redirect URL.
Auth: Not required.Request body
200 OK):
400 Bad Request— order not found or PayDunya session creation failed:{ "error": "..." }
POST /2023-11/paydunya/webhooks
PayDunya webhook receiver (POST). Receives payment confirmation events from PayDunya servers. Looks up the order by order_id, validates the callback, and records a payment if successful.
Auth: Not required — called by PayDunya servers, not by API clients.Incoming payload (sent by PayDunya):
200 OK):
404— Order not found for the givenorder_id.500— Unexpected error during payment processing.
GET /2023-11/paydunya/webhooks
PayDunya webhook receiver (GET). PayDunya sends both GET and POST callbacks on payment events. The gateway handler validates the hash signature and updates the corresponding order payment status.
Auth: Not required. Called by PayDunya servers only.Query parameters (sent by PayDunya as GET params):
Success response (
200 OK):
Query parameter: PayDunya must be configured to append ?company_id=<companyId> to the webhook URL so the handler can resolve the merchant’s API keys for signature verification.
data)
Success response (
200 OK):
400 Bad Request— signature verification failed:{ "error": "Invalid Signature" }
Pawapay
POST /2023-11/pawapay/checkout
Create a Pawapay hosted checkout page for an order, a Genuka subscription, or an app subscription. Returns a redirect URL to the Pawapay checkout widget. The currency is automatically resolved from the order’s stored currency-conversion metadata when present.
Auth: Not required.Request body
200 OK):
400 Bad Request— missing required entity or gateway error:{ "error": "No order_id, subscription_id, or app_subscription_id provided" }404 Not Found— entity ULID does not exist.
POST /2023-11/pawapay/deposits/direct
Trigger a direct Pawapay deposit (USSD push / STK push) without a redirect page. The customer receives an in-app or USSD prompt on their phone. Returns the deposit ID and initial status.
Auth: Not required.Request body
200 OK):
400 Bad Request—order_idmissing, phone cannot be resolved, or gateway rejected:{ "error": "Customer phone is required for direct deposit", "error_code": null, "gateway_response": null }404 Not Found— order ULID does not exist.
GET /2023-11/pawapay/deposits/{depositId}/status
Poll the status of a previously initiated Pawapay deposit. Delegates to the Pawapay API using the company’s credentials.
Auth: Not required.Path parameters
Query parameters
200 OK):
The API wraps the raw Pawapay response. The outer envelope always contains status (from the Pawapay response) and raw (the full Pawapay deposit object).
400 Bad Request— Pawapay API error:{ "error": "..." }
GET /2023-11/pawapay/predict-correspondent
Predict the mobile money operator (correspondent) for a given phone number by querying the Pawapay prediction API.
Auth: Not required.Query parameters
200 OK):
400 Bad Request—phoneparameter missing:{ "error": "phone is required" }422 Unprocessable Entity— operator cannot be determined:{ "error": "Could not determine the operator for this phone number" }
POST /2023-11/pawapay/webhooks
Pawapay deposit status webhook (POST). Pawapay calls this endpoint when a deposit’s status changes (e.g. COMPLETED, FAILED). The handler resolves the order via metadata stored on the deposit and records the payment.
Auth: Not required — called by Pawapay servers, not by API clients.Incoming payload (sent by Pawapay):
200 OK):
GET /2023-11/pawapay/webhooks
Pawapay webhook receiver (GET). Pawapay sends both GET and POST callbacks on deposit status changes. The handler updates order payment status.
Auth: Not required. Called by Pawapay servers only.Success response (
200 OK):
Success response (
200 OK):
Mamoni
POST /2023-11/mamoni/init
Initialize a Mamoni mobile-money transaction directly (without a hosted page). Calls the Mamoni gateway to trigger a payment prompt on the customer’s phone.
Auth: Not required.Request body
200 OK):
400 Bad Request— gateway error:{ "error": "..." }
POST /2023-11/mamoni/check
Check the status of a previously initiated Mamoni transaction by its reference.
Auth: Not required.Request body
200 OK when SUCCESSFUL, 202 Accepted otherwise):
400 Bad Request— gateway error:{ "error": "..." }
POST /2023-11/mamoni/checkout
Create a Mamoni-hosted checkout session for an order.
Auth: Not required.Request body
200 OK):
400 Bad Request— order not found or gateway error:{ "error": "..." }
POST /2023-11/mamoni/webhooks
Mamoni webhook receiver. Mamoni calls this to notify of transaction status changes. The handler updates the order payment state.
Auth: Not required. Called by Mamoni servers only.
Success response (
200 OK):
Taramoney
POST /2023-11/taramoney/checkout
Create a Taramoney checkout session for an order, a Genuka subscription, or an app subscription. Returns a redirect URL to the Taramoney payment page.
Auth: Not required.Request body
200 OK):
400 Bad Request— missing required entity or gateway error:{ "error": "No order_id, subscription_id, or app_subscription_id provided" }404 Not Found— entity ULID does not exist.
POST /2023-11/taramoney/webhooks/{timestamp_order}
Taramoney payment webhook (POST). Taramoney passes the order creation timestamp as a URL segment when confirming a payment. The handler finds the order and records the payment.
Auth: Not required — called by Taramoney servers, not by API clients.Path parameters:
Incoming payload (sent by Taramoney):
200 OK):
GET /2023-11/taramoney/webhooks/{timestamp_order}
Taramoney webhook receiver (GET). Taramoney passes the order timestamp as a path segment during callback. Both GET and POST are accepted.
Auth: Not required. Called by Taramoney servers only.Path parameters:
Success response (
200 OK):
Note: The route segmentInbound webhook payload fields{timestamp_order}encodes both the Unix timestamp and the order ULID separated by__(double underscore), e.g.1710000000__01hqydxwtxdj3kmzp3bz7jk73g. This segment is constructed by the API when building the webhook URL for Taramoney and is used to resolve the order without trusting the request body.
Success response (
200 OK):
200 OK — payment not confirmed):
PayPal
POST /2023-11/paypal/checkout
Create a PayPal checkout session for an order. Returns a redirect URL to the PayPal payment page.
Auth: Not required.Request body
200 OK):
400 Bad Request— order not found or PayPal session creation failed:{ "error": "..." }404 Not Found— order ULID does not exist.
Genuka Pay
POST /2023-11/genuka-pay/initiate
Initiate a Genuka Pay mobile-money payment for an order, a Genuka subscription, or an app subscription. Genuka Pay is an aggregated mobile money gateway. Returns a redirect URL. The amount is automatically resolved from the order’s currency-conversion metadata when present.
Auth: Not required.Request body
200 OK):
400 Bad Request— missing required entity or gateway error:{ "error": "No order_id, subscription_id, or app_subscription_id provided" }404 Not Found— entity ULID does not exist.
POST /2023-11/genuka-pay/webhooks/{companyId}
Genuka Pay webhook receiver. The signature in the request headers is validated before processing. On a valid event the corresponding order or subscription payment status is updated.
Auth: Not required. Called by Genuka Pay servers only.Path parameters
Success response (
200 OK):
401 Unauthorized— invalid webhook signature:{ "error": "Invalid signature" }
SMS Gate
POST /2023-11/smsgate/webhook/{connectionId}
Inbound webhook from an SMS Gate Android device. Routes to the appropriate handler based on the X-Webhook-Event request header. Supported events:
Auth: Not required. Called by SMS Gate device.Path parameters
Request headers (from SMS Gate)
Request body (sms:received)
id (the original message ID) and state (lowercase status string). For failed events an optional recipients array carries per-recipient error details.
200 OK):
200 OKwith{ "status": "ignored" }—connectionIdnot found (always 200 to prevent retries).
Telegram
POST /2023-11/telegram/webhook
Telegram Bot API webhook receiver. Processes incoming Telegram updates and supports the following bot commands:
Auth: Not required. Called by Telegram servers only.
Success response (
200 OK):
Broadcasting
GET|POST /2023-11/broadcasting/auth
Authenticate a private or presence Laravel Echo / Pusher channel. This is a standard Laravel broadcasting auth endpoint consumed by the frontend’s laravel-echo client.
Auth: Required —Authorization: Bearer <token>+X-Company: <companyId>.
200 OK):
401 Unauthorized— unauthenticated or channel subscription forbidden.403 Forbidden— user not authorized to join the requested channel.
Caddy Configuration
GET /2023-11/caddy-configuration
Retrieve the latest Caddy reverse-proxy JSON configuration stored in S3. Used by the deployment infrastructure to synchronize Caddy routing rules.
Auth: Not required (internal infrastructure use).
200 OK — Content-Type: application/json):
Raw Caddy configuration JSON as stored in S3. Structure varies; a minimal example:
404 Not Found— no configuration file found in S3:{ "error": "No configuration files found." }
Public Company Profile
GET /2023-11/companies/{company}
Retrieve a public company profile. This is the primary endpoint used by storefronts and checkout pages to obtain branding, available payment methods, currencies, and shipping options. No authentication required.
Auth: Not required.Path parameters
Query parameters
200 OK):
404 Not Found— company ULID does not exist:{ "message": "No query results for model." }
