Developer Docs

DoorSplit API

Integrate event discovery, ticket sales, and door management into your website or app. All public endpoints work without authentication.

Base URL: https://api.doorsplit.appJSON responses

Getting Started

Authentication

Many endpoints are public and require no authentication (discovering events, validating tickets, fee estimates). For endpoints that manage data, send a Bearer token:

Authorization: Bearer <your-jwt-token>

Tokens are obtained via OIDC login through the DoorSplit app. All responses are JSON. Errors return { "error": "message" }.

Embed Widget

The easiest way to add DoorSplit events to your website. No API calls needed — just a script tag. The widget fetches events automatically and renders styled cards with ticket links.

Show all events for your organization:

<div id="doorsplit-events"></div>
<script src="https://api.doorsplit.app/widget/v1/embed.js"
  data-org-slug="YOUR_ORG_SLUG"
  async></script>

Show a single event:

<div id="doorsplit-events"></div>
<script src="https://api.doorsplit.app/widget/v1/embed.js"
  data-event-id="EVENT_ID"
  async></script>

Attributes

data-org-slugShow events by org slug (recommended)
data-org-idShow events by org ID
data-event-idShow a single event
data-layout"card" (default), "list", or "compact"
data-accent-colorCSS color for buttons and accents
data-max-eventsMaximum events to display (default 50)
data-checkout"popup" (default) or "redirect"
data-theme"light" (default) or "dark"
data-containerID of the target DOM element

Discover Events

Search and list published events. Great for building custom event listings, calendars, or aggregator sites. No authentication required.

GET/discover/eventsPublic

Returns all published events. Filter by organization or date range.

Query parameters:

org_id — filter by organization UUID
date_from — ISO 8601 start date
date_to — ISO 8601 end date
curl "https://api.doorsplit.app/discover/events?org_id=abc-123&date_from=2026-06-01T00:00:00Z"
GET/orgs/{slug}Public

Look up an organization by its URL-friendly slug (e.g. the-midnight-club).

GET/orgs/{slug}/eventsPublic

List all published events for an organization by slug. Useful for building a venue or band's upcoming shows page.

GET/events/{event_id}Public

Get full details for a single event — name, venue, date/time, tiered pricing, poster URL. Authenticated callers with event access also receive private fields like capacity and tickets sold.

Event Details

Public event responses include these fields (private fields like capacity and tickets_sold are only included for authenticated organizers):

{
  "event_id": "uuid",
  "org_id": "uuid",
  "name": "Friday Night Rock",
  "description": "Live rock music...",
  "venue": "The Midnight Club",
  "venue_address": "123 Main St",
  "event_date": "2026-05-15T20:00:00Z",
  "door_time": "19:00",
  "start_time": "20:00",
  "end_time": "23:00",
  "price": "25.00",
  "tier1_price": "15.00",
  "tier1_end_date": "2026-04-15T23:59:59Z",
  "tier2_price": "20.00",
  "tier2_end_date": "2026-05-10T23:59:59Z",
  "currency": "USD",
  "poster_url": "https://..."
}

Checkout & Fees

Create Stripe Checkout sessions for ticket purchases. The API handles pricing tiers, service fees, and ticket creation automatically.

POST/checkout/fee-estimatePublic

Preview the fee breakdown before creating a checkout session. Shows face value, service fee, and buyer total. Use this to display transparent pricing to buyers.

curl -X POST https://api.doorsplit.app/checkout/fee-estimate \
  -H "Content-Type: application/json" \
  -d '{"event_id": "EVENT_ID", "quantity": 2}'

// Response:
{
  "face_value_cents": 2000,
  "service_fee_cents": 235,
  "buyer_total_cents": 2235,
  "platform_fee_cents": 140,
  "stripe_fee_cents": 95
}
POST/checkout/sessionsPublic or Bearer

Create a Stripe Checkout Session. Returns a checkout_url — redirect the buyer there to complete payment. Guest checkout requires customer_email; authenticated users are linked automatically.

curl -X POST https://api.doorsplit.app/checkout/sessions \
  -H "Content-Type: application/json" \
  -d '{
    "event_id": "EVENT_ID",
    "quantity": 2,
    "customer_email": "buyer@example.com",
    "success_url": "https://yoursite.com/success?session_id={CHECKOUT_SESSION_ID}",
    "cancel_url": "https://yoursite.com/events/EVENT_ID"
  }'
GET/checkout/sessions/{session_id}Public

Check payment status after Stripe redirects back. Returns payment_status and ticket IDs when paid.

Tickets

Retrieve and manage tickets. Users can view their own tickets; organizers can list tickets for their events.

GET/ticketsBearer

List the authenticated user's tickets. Returns ticket ID, event, status (valid/used/cancelled), QR code info, and purchase details.

GET/tickets/{ticket_id}Bearer

Get a single ticket with its pre-signed QR code URL. Users can view their own tickets.

GET/tickets/{ticket_id}/validatePublic

Lightweight public check — returns whether a ticket is valid without marking it as used. Useful for external validation systems.

POST/tickets/{ticket_id}/cancelBearer

Cancel a ticket. Users can cancel their own tickets.

Scanning at the Door

Scan tickets and admit groups at the event entrance. These endpoints require event collaborator or org admin access.

POST/tickets/{ticket_id}/scanBearer

Mark a single ticket as used. Returns 409 if already scanned, 410 if cancelled. Requires event collaborator or org admin access.

GET/ticket-groups/{group_id}Public

Get a ticket group summary — total tickets, how many are valid/used/cancelled. When someone bought multiple tickets, they share a single QR code (group). The door person scans it and sees how many to admit.

POST/ticket-groups/{group_id}/scanBearer

Admit N people from a group. For example: 3 tickets purchased, only 2 people present — admit 2 and the QR stays valid for 1 remaining ticket.

curl -X POST https://api.doorsplit.app/ticket-groups/GROUP_ID/scan \
  -H "Authorization: Bearer TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"count": 2}'

// Response:
{
  "admitted": 2,
  "remaining": 1,
  "total": 3,
  "message": "Admitted 2, 1 remaining"
}
POST/events/{event_id}/door-paymentBearer

Create a payment session for walk-up purchases. Returns a QR code (checkout mode) or a PaymentIntent client_secret (tap-to-pay mode) for the buyer to pay at the door.

Event Management

Create, update, and manage events. Requires org admin or event collaborator access.

POST/eventsBearer

Create a new event with name, venue, date, pricing tiers, and capacity. Requires org admin of the event's organization.

PUT/events/{event_id}Bearer

Update event details, pricing, or status. Setting status to completed triggers automatic revenue payouts to all collaborator organizations via Stripe.

POST/events/{event_id}/collaboratorsBearer

Add a user or organization as an event collaborator. Set their role (admin/manager) and revenue share percentage.

POST/events/{event_id}/guest-ticketsBearer

Issue a free guest ticket by email. If the email belongs to an existing user, the ticket is linked to their account.

Organizations

Manage organizations (bands, venues, promoters) and Stripe Connect payouts.

POST/organizationsBearer

Create an organization. The creator becomes org admin automatically.

GET/organizationsBearer

List organizations the authenticated user belongs to.

POST/organizations/{org_id}/stripe-connectBearer

Start Stripe Connect onboarding. Returns an onboarding URL to redirect the org admin to Stripe's hosted setup page.

POST/organizations/{org_id}/payouts/instantBearer

Request an instant payout for an event's ticket revenue. A 3% convenience fee is deducted. Standard payouts (on event completion) are free.

Full API Reference

Complete list of all non-admin API endpoints. Admin-only endpoints (requiring an API key) are omitted.

MethodEndpointDescription
GET/discover/eventsList published events with filters
GET/orgs/{slug}Get org by slug
GET/orgs/{slug}/eventsPublished events for an org
GET/eventsList events (public or full for organizers)
GET/events/{event_id}Get event details
POST/eventsCreate an event
PUT/events/{event_id}Update event (status triggers payouts)
DELETE/events/{event_id}Delete an event
GET/events/{event_id}/collaboratorsList collaborators
POST/events/{event_id}/collaboratorsAdd collaborator
PUT/events/{event_id}/collaborators/{id}Update collaborator role
DELETE/events/{event_id}/collaborators/{id}Remove collaborator
POST/events/{event_id}/guest-ticketsIssue guest ticket
POST/events/{event_id}/posterUpload poster (presigned URL)
GET/events/{event_id}/posterGet poster URL
DELETE/events/{event_id}/posterDelete poster
POST/checkout/fee-estimatePreview fee breakdown
POST/checkout/sessionsCreate checkout session
GET/checkout/sessions/{id}Get checkout status
POST/events/{event_id}/door-paymentCreate door payment (QR/tap)
GET/events/{id}/door-payment/{sid}/statusPoll door payment status
POST/terminal/connection-tokensStripe Terminal token
GET/ticketsList your tickets
GET/tickets/{ticket_id}Get ticket + QR code
GET/tickets/{ticket_id}/validateValidate ticket
POST/tickets/{ticket_id}/scanScan ticket at door
POST/tickets/{ticket_id}/cancelCancel ticket
GET/ticket-groups/{group_id}Get group summary
POST/ticket-groups/{group_id}/scanAdmit from group
GET/users/meGet your profile
PUT/users/meUpdate your profile
GET/users/me/identitiesList linked login methods
POST/organizationsCreate organization
GET/organizationsList your organizations
GET/organizations/{org_id}Get organization
PUT/organizations/{org_id}Update organization
POST/organizations/{org_id}/usersAdd user to org
GET/organizations/{org_id}/usersList org members
DELETE/organizations/{org_id}/users/{uid}Remove user from org
POST/organizations/{org_id}/stripe-connectStart Stripe onboarding
GET/organizations/{org_id}/stripe-connectStripe Connect status
POST/organizations/{org_id}/payouts/instantRequest instant payout
POST/organizations/{org_id}/logoUpload logo (presigned URL)
GET/organizations/{org_id}/logoGet logo URL
DELETE/organizations/{org_id}/logoDelete logo
POST/organizations/{org_id}/imageUpload hero image
GET/organizations/{org_id}/imageGet hero image URL
DELETE/organizations/{org_id}/imageDelete hero image
GET/search/organizations?q=...Search orgs by name
GET/search/users?q=...Search users by email/name

* Public endpoints return limited fields. Authenticated organizers receive full event data including capacity, tickets_sold, and collaborators.