Tixdorm API

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.

Overview
What the Partner API is and how it fits into your platform.

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:

  • A media site publishing events and selling tickets inline
  • A booking platform offering event registration as a service
  • A community hub managing member events and check-in
  • A festival organizer running multiple events with a unified backend

Multi-tenant by design. Each integration gets its own organization, API keys, webhooks, and data isolation. Your data stays yours.

Getting Started
From zero to your first API call in 5 minutes.
  1. Request access — Go to your Tixdorm dashboard at /dashboard/partners and submit a Partner API access request. An admin will approve it.
  2. Generate API keys — Once approved, generate a key pair from the same page. Your secret key (sk_live_xxx) is shown exactly once — copy and store it securely.
  3. Make your first request — Use the secret key in the Authorization header:
curl -H "Authorization: Bearer sk_live_xxx" https://api.tixdorm.com/v1/events

You're live. All 12 endpoints are available immediately.

Base URL
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.

Authentication
How to securely authenticate every API request.

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:

  • Public Key (pk_live_xxx) — Identifies your organization. Can be safely exposed.
  • Secret Key (sk_live_xxx) — Authenticates all API requests. Keep this server-side and never expose it in client-side code.

Environments

Two environments are available:

  • sandbox
    Keys with _test_ prefix — use for development and testing. No real payments processed.
  • production
    Keys with _live_ prefix — use for live traffic. Real payments are processed.

Security best practices

  • Store secret keys in environment variables, never in code or client-side JS
  • Rotate keys periodically from the dashboard
  • If a key is compromised, revoke it immediately and generate a new one
  • Full keys are shown only once at generation time; only masked keys are persisted

API Endpoints

Events

GET
/v1/events
List all published events on Tixdorm.

Response

{
  "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"
    }
  ]
}
GET
/v1/events/{event_id}
Get a single event by ID, including its ticket tiers.

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
      }
    ]
  }
}
POST
/v1/events
Create a new event under your organization.

Request 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", ... }
}
PATCH
/v1/events/{event_id}
Update one or more fields on an event you own.

Request Body

{
  "title": "Updated Title",
  "venue": "New Venue, Abuja",
  "capacity": 1000,
  "event_type": "hybrid"
}

Response

{
  "ok": true,
  "data": { "id": "uuid", "title": "Updated Title", ... }
}

Tickets

GET
/v1/events/{event_id}/tickets
List all ticket tiers for an event.

Response

{
  "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"
    }
  ]
}
POST
/v1/tickets
Create a new ticket tier for an event you own.

Request 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", ... }
}

Checkout

POST
/v1/checkout
Create a hosted Tixdorm checkout session for a buyer.

Request 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?..."
  }
}

Attendees

GET
/v1/events/{event_id}/attendees
List all ticket purchasers for an event you own.

Response

{
  "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" }
    }
  ]
}
POST
/v1/attendees
Manually register an attendee for an event you own (e.g. comp tickets, guest list).

Request 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"
  }
}

Check-In

POST
/v1/checkin
Validate a ticket and mark the attendee as checked in.

Request Body

{
  "ticket_id": "tkt_uuid"            // required
}

Response

{
  "ok": true,
  "data": {
    "status": "checked_in",
    "timestamp": "2026-06-23T12:00:00Z",
    "ticket_id": "tkt_uuid"
  }
}

QR Codes

GET
/v1/tickets/{ticket_id}/qr
Retrieve QR code URL and ticket portal link for a ticket.

Response

{
  "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"
  }
}

Broadcast

POST
/v1/events/{event_id}/broadcast
Send an email update to all verified attendees of an event you own.

Request 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
  }
}
Hosted Checkout
How the hosted checkout page works from end to end.

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.

  1. Create a checkout session — Call POST /v1/checkout with the event, ticket tier, customer info, and return URLs.
  2. Redirect the buyer — Send the customer to the checkout_url returned in the response.
  3. The buyer completes payment — The Tixdorm checkout page shows the event details, ticket info, and a confirmation button. For free events, the ticket is issued instantly. For paid events, payment is handled on Tixdorm's infrastructure (Flutterwave integration).
  4. Ticket email is sent — The buyer receives a beautifully designed email with their QR code entry pass, event details, and a link to their ticket portal.
  5. Return to your site — After completion, the buyer is redirected to your 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.

Webhooks
Receive real-time notifications when events happen in your integration.

Supported Events

event.created
An event was created
event.updated
An event was updated
ticket.created
A ticket tier was created
attendee.created
An attendee was manually registered
checkin.completed
An attendee was checked in

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.

Rate Limits
Understanding API request limits.

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.

Errors
How the API communicates errors.

All errors follow a consistent format:

{
  "ok": false,
  "error": "A human-readable description of the problem"
}

HTTP Status Codes

200
Success
201
Created successfully
400
Bad request — missing or invalid fields
401
Unauthorized — missing or invalid API key
404
Resource not found
405
Method not allowed on this endpoint
429
Rate limit exceeded
500
Internal server error
Pricing
What it costs to use the Tixdorm Partner API.

Free for all partners

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).

  • ✓ Unlimited events
  • ✓ Unlimited tickets
  • ✓ Hosted checkout
  • ✓ Webhook support
  • ✓ Email notifications + QR codes
  • ✓ All API endpoints
Frequently Asked Questions

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.

Code Examples
Quickstart snippets in popular languages.
# 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/checkin
Support

Need help with the API? Here's how to reach us: