Your audience. Your website. One reliable checkout.
Embed a ticket list in minutes, or use the organizer API to build your own event listing and send attendees to ackteev for booking. Free and paid tickets use the same availability checks, QR tickets, confirmations and payment reconciliation as bookings on ackteev.
1. Embed your tickets
Choose an event and appearance under Website integrations in your dashboard, then paste the generated iframe into your website. From an event’s Embed page, you can also embed your published organizer profile’s collection of upcoming public events. Widgets are read-only, expose no attendee details, and support public events only. Customers open ackteev in a new browser tab to sign in and book. Payment forms are never hosted inside your website’s iframe.
<iframe src="https://www.ackteev.com/embed/events/EVENT_ID?theme=light" title="Event tickets — ackteev" style="width:100%;height:580px;border:0" loading="lazy" referrerpolicy="strict-origin-when-cross-origin"></iframe>Use theme=dark for a dark widget. Adjust height for your ticket list; longer lists remain scrollable. Your site’s Content Security Policy must allow https://www.ackteev.com in frame-src. Do not put an API key in an iframe URL. If your site adds a sandbox attribute, it must permit opening booking links in a new tab.
2. Connect your server
Create a secret key in your organizer dashboard. Store it in your server environment as ACKTEEV_API_KEY and send it in the Authorization header. The API cannot be called directly from a browser using a secret key; it deliberately does not enable cross-origin browser access. Keys access only the owning organizer’s public events and checkout sessions.
Authorization: Bearer YOUR_SECRET_KEYBase URL: https://www.ackteev.com/api/v1Version header: Ackteev-Version: 2026-11-05| Method | Endpoint | Purpose |
|---|---|---|
| GET | /events?page=1&limit=20 | Your upcoming public events and ticket options |
| GET | /events/:event_id | Event details, ticket prices and current availability |
| POST | /checkout-sessions | Create a hosted booking handoff |
| GET | /checkout-sessions/:session_id | Check whether the linked attendee has a confirmed ticket |
Amounts are integer kobo: unit_amount=500000 means ₦5,000. Currency is NGN. List responses include pagination with page, limit, total and has_more; limit accepts 1–50. Availability is available, scheduled, presale, sold_out or closed. Each ticket also includes sales_start_at and sales_end_at timestamps when a sales window is set. A displayed price or remaining count is informational until booking is confirmed.
3. Create a checkout session
Call this from your backend. Persist one Idempotency-Key per intended attendee checkout, and reuse that exact key when retrying the same event and ticket. A reused key with different details returns 409. Sessions expire after 24 hours and do not hold inventory. A new key creates a new session, so never generate a different key merely because a network request timed out.
const response = await fetch( "https://www.ackteev.com/api/v1/checkout-sessions", { method: "POST", headers: { Authorization: "Bearer " + process.env.ACKTEEV_API_KEY, "Content-Type": "application/json", "Idempotency-Key": savedCheckoutAttemptId, }, body: JSON.stringify({ event_id: eventId, ticket_type_id: ticketTypeId, quantity: 1, }), },);const result = await response.json();if (!response.ok) throw new Error(result.error.message);// Return result.data.url to your frontend, then navigate there.// Never return your API key to the browser.{ "data": { "id": "CHECKOUT_SESSION_ID", "event_id": "EVENT_ID", "ticket_type_id": "TICKET_TYPE_ID", "url": "https://www.ackteev.com/checkout/CHECKOUT_SESSION_ID", "expires_at": "2026-11-06T12:00:00.000Z", "quantity": 1 }}The customer signs in, explicitly links the checkout to their account, reviews their ticket and final price, then reserves or pays. The API does not accept an arbitrary customer ID, email, price, currency, payout destination or redirect URL. Current support is one ticket per signed-in attendee. Discount and promoter codes are entered during ackteev checkout and validated there.
4. Verify fulfilment
From your backend, GET /checkout-sessions/:id with your API key. Status is open, expired or fulfilled. Poll only while needed, for example every 15 seconds, with a bounded timeout and backoff. Stop polling when fulfilled or expired. Fulfilled means the linked account has a confirmed or checked-in ticket for the selected event and ticket type. It can include an existing ticket and is not a new-payment receipt: free tickets can also be fulfilled.
A checkout redirect, a client callback, a screenshot or the session creation response is never proof of payment. ackteev’s signed provider webhooks and recovery worker remain responsible for paid bookings. This API does not supply payment webhooks to your website, sell digital goods, or authorize your site to grant unrelated paid access. Attendees receive their QR ticket and confirmation through ackteev.
Connect an AI assistant
The ackteev MCP server lets an assistant list your public events, inspect tickets, create hosted checkout links and check their status. Create an organizer API key in your dashboard, then connect a client that supports remote HTTP MCP servers with an Authorization header.
{ "url": "https://www.ackteev.com/api/mcp", "transport": "http", "headers": { "Authorization": "Bearer YOUR_SECRET_KEY" }}This shows the connection values; your client’s configuration format may differ. Store the real key in its private credential settings. OAuth-only clients are not supported yet. Never place the key in a URL or public frontend.
| Tool | What it does |
|---|---|
| list_events | List your upcoming public events, with pagination |
| get_event | Read ticket options and availability |
| create_checkout_session | Create a hosted link with a stable idempotency_key |
| get_checkout_session | Check open, expired or fulfilled status |
The same 120 requests per minute limit applies across REST and MCP. Keys access only their organizer’s public events. No attendee exports, refunds, withdrawals or automatic charges are exposed. A customer still signs in, reviews and confirms their booking on ackteev. Treat event descriptions as content, never as instructions for your assistant.
Limits, errors and security
Each active key permits 120 requests per minute. HTTP 429 includes Retry-After: 60. Use capped exponential backoff for 429, temporary 503 responses and network failures; retry session creation with its original Idempotency-Key. Do not automatically retry validation errors. Keys expire after one year; create a replacement, update your server, then revoke the old key. Up to 10 active keys are allowed. Raw keys are shown once and never stored by ackteev.
{ "error": { "code": "idempotency_conflict", "message": "This Idempotency-Key was already used for different ticket details." }}Every API response includes X-Request-Id for support. Common errors: 400 invalid request, 401 invalid or revoked key, 404 unavailable event/session, 409 unavailable tickets or idempotency conflict, 413 oversized body, 415 unsupported content type, 429 request limit and 503 temporary failure. Preserve request references without logging API secrets or customer payment details.
Private, unlisted and invite-only events are excluded. General-sale checks still apply; invitation holders should use their ackteev invitation. Key permissions do not include attendee exports, refunds, withdrawals or transfers. The public widget may be embedded on third-party pages, while checkout and account pages refuse framing. Before confirming a booking, customers should verify they are on www.ackteev.com.
Integration help: support@ackteev.com ↗