Checkout API
Use the SeevPlus REST API to initiate checkout payments programmatically and verify checkout results server-side.
⬡ API product
Requires developer access and an API key
The Checkout API is how developers integrate Seev's payment gateway directly into their own application. Developer checkout payments are initiated through SeevPlus so the organization, environment, and transaction can be recorded before the customer is redirected to checkout.
Before you use the Checkout API, open the Developer Dashboard, accept the developer terms, select Checkout API as a product, and generate an API key. Don't have an API key yet? Start with the API Keys guide.
If your integration still calls gateway-api.seevcash.com directly, migrate
to the SeevPlus payment routes for more reliable organization-scoped
processing. See Migrate to the SeevPlus Payment
Routes.
Who it's for
The Checkout API is the right choice if:
- You are building a web or mobile app and need payments as part of your own product flow
- You need to pass payment data programmatically — amount or items, customer info, payment channels, redirect URL, and gateway metadata
- You want to control the redirect and run your own post-payment logic (update a database, send confirmation emails, provision access)
- You're building a platform or marketplace where multiple merchants or customers transact through your app
- You need programmatic access to checkout initiation, status checks, and transaction history
If you just need to send someone a link or sell a product without writing code, use Payment Links or the Storefront instead.
API key requirement
Checkout API requests must be authenticated with a Checkout API key from the same environment you are using.
| Environment | Key to use |
|---|---|
| Sandbox | A sandbox Checkout API key for testing. |
| Production | A production Checkout API key after your account is approved for live mode. |
If you generate keys for multiple products, make sure you use the key created for Checkout API. Product keys are scoped to their own Seev services.
Before your first request
- Create checkout from a backend or server function, never directly from browser code.
- Keep your secret API key in server-side environment variables.
- Create and save your own order before requesting a checkout session.
- Choose a stable internal order ID for idempotency and reconciliation if you want retry protection.
- Prepare a callback route and a signed webhook endpoint.
- Start in sandbox and test success, failure, and repeated submission.
How it works
Your server Seev API Customer
│ │ │
│── create session ─▶│ │
│◀── checkout_url ───│ │
│ │ │
│─── redirect ───────────────────────▶ │
│ │◀── pays ─────────│
│ │── redirect ─────▶│
│ │ (to redirect URL)│
│◀── session ref ────────────────────── │
│ │ │
│── verify session ─▶│ │
│◀── result ─────────│ │
│ │ │
│─── fulfil order ───────────────────▶ │- Your server creates a checkout session with the customer and order details.
- Seev returns a checkout URL — redirect the customer there.
- The customer completes payment using a method enabled on the hosted checkout page.
- Seev redirects the customer back to your
redirect_urlwith a session reference. - Your server verifies the session before fulfilling the order.
API routes
Use these routes from your backend.
| Action | Method | Route |
|---|---|---|
| Create checkout session | POST | https://api.seevplus.com/api/v1/developer/payments |
| Verify checkout session | GET | https://api.seevplus.com/api/v1/developer/payments/{sessionRef} |
Use https://api.seevplus.com as the base URL for Checkout API integrations.
Official SDKs, browser packages, mobile SDKs, and platform plugins such as WordPress or WooCommerce are coming soon. For production integrations today, use the REST API from your backend.
Create a checkout session
Create checkout sessions from your backend with a Checkout API key. The
endpoint accepts Authorization: Bearer $SEEV_CHECKOUT_API_KEY; X-API-Key: $SEEV_CHECKOUT_API_KEY may be used instead of Authorization.
Idempotency-Key is optional. When supplied, it is forwarded to the payment
gateway. Without it, every request creates a new payment.
curl -X POST "https://api.seevplus.com/api/v1/developer/payments" \
-H "Authorization: Bearer $SEEV_CHECKOUT_API_KEY" \
-H "Idempotency-Key: order_123_attempt_1" \
-H "Content-Type: application/json" \
-d '{
"type": "checkout",
"recipient": {
"name": "Kwame Asante",
"email": "kwame@example.com"
},
"items": [
{
"name": "Web Development",
"description": "Landing page design",
"quantity": 1,
"price": 800,
"image": "https://example.com/web-development.png"
},
{
"name": "Hosting (1 year)",
"description": "Cloud hosting plan",
"quantity": 1,
"price": 200,
"image": ""
}
],
"currency": "GHS",
"channels": ["mobile_money", "crypto"],
"redirect_url": "https://yourapp.com/payment/callback",
"meta": {
"orderId": "order_123"
}
}'The request body is the same as the Seev gateway initiation API. Use either
amount or items; the gateway calculates the final amount. Amount values
and item prices are expressed in the currency’s smallest unit, so 10000
means GHS 100.00. Keep redirect_url and meta exactly as shown. Do not add
organizationId or user_id; SeevPlus adds the correct organization context
internally. Existing merchant-defined meta values are preserved.
The response is the gateway initiation response unchanged. A successful response includes the hosted checkout URL:
{
"success": true,
"data": {
"amount": 1000,
"channels": ["mobile_money", "crypto"],
"checkout_url": "https://pay.seevplus.com/PAY-20260718-f23159df-9df8-4e69-8306-c11d71ead351",
"currency": "GHS",
"env": "production",
"expires_at": "2026-07-18T21:08:46.776302Z",
"items": [
{
"id": "f0c72f6b-59fc-4371-b68b-540f54d12f5b",
"session_id": "d636387f-6872-469e-be31-76a79301fcb1",
"name": "Web Development",
"description": "Landing page design",
"quantity": 1,
"price": 800,
"image": "https://example.com/web-development.png"
},
{
"id": "62342bee-7eeb-4f31-984a-96718e2fd997",
"session_id": "d636387f-6872-469e-be31-76a79301fcb1",
"name": "Hosting (1 year)",
"description": "Cloud hosting plan",
"quantity": 1,
"price": 200,
"image": ""
}
],
"recipient": {
"email": "kwame@example.com",
"name": "Kwame Asante"
},
"redirect_url": "https://yourapp.com/payment/callback",
"reference": "PAY-20260718-f23159df-9df8-4e69-8306-c11d71ead351",
"status": "pending"
},
"request_id": "fb4f88c-9429-41d7-b3ca-5e4226a50736",
"timestamp": "2026-07-18T20:38:46.779595765Z"
}Redirect the customer to data.checkout_url. SeevPlus records its internal
transaction from the gateway-calculated amount, currency, status, reference,
checkout URL, and expiry.
The response is passed through from the payment gateway, so gateway fields
such as env, redirect_url, item IDs, item session IDs, empty values, and
future response fields are preserved.
Official SDKs are coming soon. For production integrations today, create checkout sessions with the SeevPlus REST API from your backend.
Payment initiation parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
type | "checkout" | "invoice" | "payment_link" | Yes | Payment context. Use checkout for custom app or storefront checkout flows. |
recipient.name | string | Yes | Customer’s full name. |
recipient.email | string | Yes | Customer’s valid email address. |
recipient.phone | string | No | Customer’s phone number. |
amount | integer | Yes, or items | Payment amount in the currency’s smallest unit, such as pesewas for GHS. |
items | array | Yes, or amount | Line items with name, quantity, and price; the gateway calculates the final amount. |
currency | string | Yes | Supported currency code such as GHS, USD, EUR, GBP, NGN, USDC, or USDT. |
channels | string[] | No | Optional checkout payment-channel restrictions, such as ["mobile_money"]. |
redirect_url | string | Yes | Valid HTTP or HTTPS URL where the customer returns after checkout. |
meta | object | No | Merchant-defined JSON metadata passed through to the gateway. |
Idempotency-Key header | string | No | Optional unique request key used to prevent duplicate payment initiation. Without it, every request creates a payment. |
Idempotency behavior
| Scenario | Response |
|---|---|
| New payment request | HTTP 201 |
Identical retry with the same Idempotency-Key | HTTP 200 with the existing payment |
Same Idempotency-Key reused with a different request | HTTP 409 |
| In-progress request whose checkout session is not attached yet | HTTP 202 |
If an initiation failed before checkout was created, use a new idempotency key for a deliberate retry.
Existing keys
SeevPlus stores only a one-way hash of newly issued checkout secrets. Checkout keys created before this route was introduced must be rotated once before they can authenticate here. Plaintext secret keys are never persisted.
This endpoint currently records and initiates payments only. Production outbound developer webhooks and durable gateway-event processing are intentionally outside this phase.
Verify the payment
Always verify the payment on your server before fulfilling the order. The redirect alone is not proof of payment — it can be triggered manually by anyone with your redirect URL.
Use the SeevPlus wrapper for gateway session lookup. Developers should use the
gateway reference returned during initiation, or the corresponding session
reference received after redirect.
No API key or Authorization header is required for this GET endpoint. A successful request returns the current gateway session payload, allowing clients to check payment status without calling the gateway API directly.
curl -X GET \
"https://api.seevplus.com/api/v1/developer/payments/$SESSION_REF"Check the returned status before fulfilling the order:
{
"success": true,
"data": {
"id": "checkout_xyz",
"reference": "PAY-20260701-abc123",
"status": "completed",
"amount": 10000,
"final_amount": 10000,
"currency": "GHS"
}
}Official SDK verification helpers are coming soon. For production integrations today, verify payments with the SeevPlus REST API from your backend.
Treat completed or success as paid. Treat pending, failed, or cancelled as not fulfilled.
| Property | Description |
|---|---|
data.id | The checkout session ID |
data.status | Raw status string (completed, success, failed, pending, cancelled) |
data.reference | Transaction reference for your records |
data.amount | Amount paid in the smallest currency unit |
data.final_amount | Final amount confirmed by the payment session |
data.currency | Payment currency |
For webhook-based verification (recommended for fulfilment), see Webhooks.
Supported payment methods
By default, all methods enabled for the checkout are shown. Mobile money is currently available for live checkout.
| Value | Channel |
|---|---|
mobile_money | MTN MoMo, Telecel Cash, Airtel Money |
Card, direct bank-transfer checkout, and crypto should not be offered to a customer until they are selectable on the live checkout page.
See Payment Methods for current availability and customer instructions.
Common integration problems
The API returns unauthorized
Confirm that the key is a Checkout API key, belongs to the selected organization, and matches sandbox or production. A rotated, deleted, or partially copied secret will not work.
Checkout is created but the customer is not fulfilled
Do not fulfil from the redirect alone. Verify the session on your server and process a valid signed success webhook idempotently.
A retry creates another checkout
Generate one stable idempotency key for the logical order and reuse it for retries. Do not generate a new random key on every attempt.
Production is blocked
Complete organization verification, switch the Developer Dashboard to production, and create a separate production key. Sandbox credentials cannot process production activity.