Power your events with Tixdorm's backend. List events, sell tickets, manage attendees, and accept payments — all through a simple REST API. No need to build ticketing infrastructure from scratch.
The Tixdorm Partner API lets you build ticketing, registration, and check-in flows directly into your own website or application. You handle the frontend and customer experience; Tixdorm handles the backend — events database, ticket inventory, hosted checkout, QR code generation, email delivery, and real-time attendance tracking.
Common use cases:
Multi-tenant by design. Each integration gets its own organization, API keys, webhooks, and data isolation. Your data stays yours.
/dashboard/partners and submit a Partner API access request. An admin will approve it.sk_live_xxx) is shown exactly once — copy and store it securely.Authorization header:curl -H "Authorization: Bearer sk_live_xxx" https://api.tixdorm.com/v1/events
You're live. All 12 endpoints are available immediately.
https://api.tixdorm.com/v1
All requests go through api.tixdorm.com. Every response includes CORS headers, so you can call the API directly from the browser.
Every request requires a secret API key sent in theAuthorization header using the Bearer scheme:
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Key types
Each key pair has two components:
pk_live_xxx) — Identifies your organization. Can be safely exposed.sk_live_xxx) — Authenticates all API requests. Keep this server-side and never expose it in client-side code.Environments
Two environments are available:
_test_ prefix — use for development and testing. No real payments processed._live_ prefix — use for live traffic. Real payments are processed.Security best practices
/v1/eventsResponse
{
"ok": true,
"data": [
{
"id": "uuid",
"title": "Tolu W. Art Exhibition",
"slug": "tolu-w-art-exhibition",
"description": "An evening of contemporary art...",
"location": "Lagos, Nigeria",
"starts_at": "2026-07-01T18:00:00Z",
"ends_at": "2026-07-01T22:00:00Z",
"status": "published",
"capacity": 500,
"event_type": "in_person",
"cover_image_url": "https://...",
"is_paid": true,
"price_cents": 5000,
"currency": "NGN",
"created_at": "2026-06-01T10:00:00Z",
"updated_at": "2026-06-15T12:00:00Z"
}
]
}/v1/events/{event_id}Response
{
"ok": true,
"data": {
"id": "uuid",
"title": "Tolu W. Art Exhibition",
"ticket_tiers": [
{
"id": "uuid",
"name": "VIP",
"price_cents": 15000,
"quantity": 50,
"sold_count": 12,
"is_active": true
}
]
}
}/v1/eventsRequest Body
{
"title": "My Event", // required
"description": "Event details...",
"venue": "Lagos, Nigeria",
"start_date": "2026-07-01T10:00:00Z", // required
"end_date": "2026-07-01T18:00:00Z",
"capacity": 500,
"event_type": "in_person" // "in_person", "virtual", or "hybrid"
}Response
{
"ok": true,
"data": { "id": "uuid", "title": "My Event", ... }
}/v1/events/{event_id}Request Body
{
"title": "Updated Title",
"venue": "New Venue, Abuja",
"capacity": 1000,
"event_type": "hybrid"
}Response
{
"ok": true,
"data": { "id": "uuid", "title": "Updated Title", ... }
}/v1/events/{event_id}/ticketsResponse
{
"ok": true,
"data": [
{
"id": "uuid",
"name": "General Admission",
"description": "Standard entry to the event",
"price_cents": 5000,
"quantity": 200,
"sold_count": 45,
"is_active": true,
"sales_start": "2026-06-01T00:00:00Z",
"sales_end": "2026-07-01T00:00:00Z"
}
]
}/v1/ticketsRequest Body
{
"event_id": "evt_uuid", // required
"name": "VIP Pass", // required
"description": "Includes meet-and-greet",
"price": 15000, // in cents (NGN 150)
"quantity": 100,
"sales_start": "2026-06-01T00:00:00Z",
"sales_end": "2026-07-01T00:00:00Z",
"visibility": "public" // "public" or "hidden"
}Response
{
"ok": true,
"data": { "id": "uuid", "name": "VIP Pass", ... }
}/v1/checkoutRequest Body
{
"event_id": "evt_uuid", // required
"ticket_id": "tier_uuid", // required
"quantity": 2,
"customer_name": "John Doe", // required
"customer_email": "john@example.com", // required
"success_url": "https://yoursite.com/success",
"cancel_url": "https://yoursite.com/cancel"
}Response
{
"ok": true,
"data": {
"checkout_id": "chk_xxx",
"checkout_url": "https://tixdorm.com/checkout/chk_xxx?..."
}
}/v1/events/{event_id}/attendeesResponse
{
"ok": true,
"data": [
{
"id": "uuid",
"buyer_name": "John Doe",
"buyer_email": "john@example.com",
"buyer_phone": "+2348012345678",
"tier_id": "uuid",
"amount_paid_cents": 5000,
"status": "valid",
"purchased_at": "2026-06-20T14:30:00Z",
"validated_at": null,
"ticket_tiers": { "name": "General Admission" }
}
]
}/v1/attendeesRequest Body
{
"event_id": "evt_uuid", // required
"ticket_id": "tier_uuid",
"name": "Jane Doe", // required
"email": "jane@example.com", // required
"phone": "+2348012345678"
}Response
{
"ok": true,
"data": {
"id": "uuid",
"event_id": "evt_uuid",
"buyer_name": "Jane Doe",
"buyer_email": "jane@example.com",
"status": "valid"
}
}/v1/checkinRequest Body
{
"ticket_id": "tkt_uuid" // required
}Response
{
"ok": true,
"data": {
"status": "checked_in",
"timestamp": "2026-06-23T12:00:00Z",
"ticket_id": "tkt_uuid"
}
}/v1/tickets/{ticket_id}/qrResponse
{
"ok": true,
"data": {
"qr_url": "https://supabase.co/functions/v1/scan-validate?token=abc...",
"ticket_url": "https://tixdorm.com/t/abc...",
"ticket_id": "tkt_uuid",
"event_id": "evt_uuid"
}
}/v1/events/{event_id}/broadcastRequest Body
{
"subject": "Venue Update", // required
"message": "The venue has changed to Harbour Point. See you there!" // required
}Response
{
"ok": true,
"data": {
"sent": 45,
"failed": 0,
"total": 45
}
}The hosted checkout is a Tixdorm-managed payment page at https://tixdorm.com/checkout/$id. It handles the entire purchase flow so you don't need to build a checkout UI.
POST /v1/checkout with the event, ticket tier, customer info, and return URLs.checkout_url returned in the response.success_url with the ticket ID as a query parameter.Note: For paid events, you must have Flutterwave payment processing configured on your Tixdorm account. Contact support to enable it.
Supported Events
Delivery Format
Webhooks are delivered as HTTP POST requests to your configured endpoint URL. Each request includes:
{
"event": "attendee.created",
"timestamp": "2026-06-23T12:00:00Z",
"data": {
"attendee_id": "uuid",
"event_id": "uuid",
"attendee_name": "John Doe",
"attendee_email": "john@example.com"
}
}Headers
Content-Type: application/json
X-Tixdorm-Signature: sha256=abc...
X-Tixdorm-Event: attendee.created
X-Tixdorm-Delivery-Id: uuid
Signature Verification
Every webhook includes an HMAC SHA256 signature. Verify it using your webhook secret to confirm the payload came from Tixdorm:
const crypto = require('crypto');
function verifyWebhook(payload, signature, secret) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(JSON.stringify(payload))
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}Retry Schedule
If your endpoint doesn't respond with a 2xx status within 5 seconds, Tixdorm retries up to 5 times with exponential backoff: 1 minute → 5 minutes → 30 minutes → 6 hours → 24 hours. After the final attempt, the delivery is marked as failed and no more retries occur.
Managing Webhooks
Configure webhooks from your Partner API dashboard. You can add multiple endpoints, each with its own signing secret. View delivery logs including status, HTTP response code, and response body for debugging.
The current rate limit is 100 requests per minute per API key. Exceeding this limit returns a 429 Too Many Requests response.
If your integration requires higher limits, contact support at support@tixdorm.com with your expected traffic and use case.
All errors follow a consistent format:
{
"ok": false,
"error": "A human-readable description of the problem"
}HTTP Status Codes
The Partner API is completely free. There are no tiered plans, no monthly fees, and no hidden costs. You only pay the standard 5% platform fee on paid ticket transactions (free events incur no fees).
How do I get API access?
Go to your dashboard → Partners → Request Access. An admin will review and approve your request. Once approved, you can generate API keys immediately.
Can I use the API without a hosted checkout page?
Yes. The checkout endpoint is optional. You can create tickets and attendees programmatically using the POST /v1/attendees endpoint, and build your own purchase flow.
What happens if my webhook endpoint is down?
Tixdorm retries delivery up to 5 times over 24 hours (1min → 5min → 30min → 6h → 24h). After all attempts fail, the delivery is marked as failed and logged in your webhook delivery history.
Can I have multiple API keys?
Yes. You can generate multiple key pairs for different environments (sandbox vs production) or different applications. Each key pair is independently managed and revocable.
How do I handle paid ticket payments?
The hosted checkout page handles payment via Flutterwave. You need Flutterwave configured on your Tixdorm account. Contact support to set this up.
Is my data isolated from other partners?
Yes. Every API key belongs to a single organization. All database queries are scoped to your organization. No cross-tenant data access is possible.
Can I customize the checkout page?
The hosted checkout uses Tixdorm's branded design by default. You can also build your own checkout flow using the attendees and tickets endpoints.
What languages can I use with the API?
Any language that can make HTTP requests. The API is RESTful with JSON request/response bodies. See the code examples above for Node.js, Python, and Ruby webhook verification.
# List all events
curl -H "Authorization: Bearer sk_live_xxx" \
https://api.tixdorm.com/v1/events
# Create an event
curl -X POST \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{"title":"My Event","start_date":"2026-07-01T10:00:00Z","venue":"Lagos"}' \
https://api.tixdorm.com/v1/events
# Create a ticket tier
curl -X POST \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{"event_id":"evt_uuid","name":"VIP","price":15000,"quantity":100}' \
https://api.tixdorm.com/v1/tickets
# Check in an attendee
curl -X POST \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{"ticket_id":"tkt_uuid"}' \
https://api.tixdorm.com/v1/checkinNeed help with the API? Here's how to reach us: