Skip to main content
This domain covers every payment provider integration offered by the Genuka API: Stripe, PayDunya, Pawapay, Mamoni, Taramoney, PayPal, and Genuka Pay. Each gateway exposes a checkout initiation endpoint and a webhook receiver that the provider calls back to confirm payment status. Two additional utility endpoints are included: a Caddy reverse-proxy configuration reader used for deployment infrastructure, and a public company profile endpoint used by storefronts to retrieve branding and payment options without authentication. Channel notification webhooks for SMS Gate and Telegram are also documented here. Most gateway endpoints are public (no 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
Success response (302 Found): Redirects to the frontend payment-methods page. Error responses
  • 302 Found — invalid state token; redirects to login with error=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
Success response (200 OK):
Error responses
  • 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.
Inbound webhook payload fields Success response (200 OK):
Error responses
  • 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
Inbound webhook payload fields Success response (200 OK):
Error responses
  • 404 Not FoundpaymentMethod ULID 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.
Success response (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
Success response (200 OK):
Error responses
  • 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):
Success response (200 OK):
Error responses:
  • 404 — Order not found for the given order_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.
Inbound webhook payload fields (inside data) Success response (200 OK):
Error responses
  • 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
Success response (200 OK):
Error responses
  • 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
Success response (200 OK):
Error responses
  • 400 Bad Requestorder_id missing, 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
Success response (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).
Error responses
  • 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
Success response (200 OK):
Error responses
  • 400 Bad Requestphone parameter 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):
Success response (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):
Inbound webhook payload fields 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
Success response (200 OK):
Error responses
  • 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
Success response (200 OK when SUCCESSFUL, 202 Accepted otherwise):
Error responses
  • 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
Success response (200 OK):
Error responses
  • 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.
Inbound webhook payload fields 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
Success response (200 OK):
Error responses
  • 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):
Success response (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):
Path parameters
Note: The route segment {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.
Inbound webhook payload fields Success response (200 OK):
Non-success payment response (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
Success response (200 OK):
Error responses
  • 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
Success response (200 OK):
Error responses
  • 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
Inbound webhook payload fields Success response (200 OK):
Error responses
  • 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)
Request body (sms:sent / sms:delivered / sms:failed) For delivery status events the gateway sends id (the original message ID) and state (lowercase status string). For failed events an optional recipients array carries per-recipient error details.
Success response (200 OK):
Error responses
  • 200 OK with { "status": "ignored" }connectionId not 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.
Inbound webhook payload fields 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>.
Success response (200 OK):
Error responses
  • 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).
Success response (200 OK — Content-Type: application/json): Raw Caddy configuration JSON as stored in S3. Structure varies; a minimal example:
Error responses
  • 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
Success response (200 OK):
Error responses
  • 404 Not Found — company ULID does not exist: { "message": "No query results for model." }