Developer Docs
DoorSplit API
Integrate event discovery, ticket sales, and door management into your website or app. All public endpoints work without authentication.
https://api.doorsplit.appJSON responsesGetting 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 IDdata-event-idShow a single eventdata-layout"card" (default), "list", or "compact"data-accent-colorCSS color for buttons and accentsdata-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 elementDiscover Events
Search and list published events. Great for building custom event listings, calendars, or aggregator sites. No authentication required.
/discover/eventsPublicReturns all published events. Filter by organization or date range.
Query parameters:
org_id — filter by organization UUIDdate_from — ISO 8601 start datedate_to — ISO 8601 end datecurl "https://api.doorsplit.app/discover/events?org_id=abc-123&date_from=2026-06-01T00:00:00Z"/orgs/{slug}PublicLook up an organization by its URL-friendly slug (e.g. the-midnight-club).
/orgs/{slug}/eventsPublicList all published events for an organization by slug. Useful for building a venue or band's upcoming shows page.
/events/{event_id}PublicGet 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.
/checkout/fee-estimatePublicPreview 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
}/checkout/sessionsPublic or BearerCreate 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"
}'/checkout/sessions/{session_id}PublicCheck 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.
/ticketsBearerList the authenticated user's tickets. Returns ticket ID, event, status (valid/used/cancelled), QR code info, and purchase details.
/tickets/{ticket_id}BearerGet a single ticket with its pre-signed QR code URL. Users can view their own tickets.
/tickets/{ticket_id}/validatePublicLightweight public check — returns whether a ticket is valid without marking it as used. Useful for external validation systems.
/tickets/{ticket_id}/cancelBearerCancel 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.
/tickets/{ticket_id}/scanBearerMark a single ticket as used. Returns 409 if already scanned, 410 if cancelled. Requires event collaborator or org admin access.
/ticket-groups/{group_id}PublicGet 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.
/ticket-groups/{group_id}/scanBearerAdmit 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"
}/events/{event_id}/door-paymentBearerCreate 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.
/eventsBearerCreate a new event with name, venue, date, pricing tiers, and capacity. Requires org admin of the event's organization.
/events/{event_id}BearerUpdate event details, pricing, or status. Setting status to completed triggers automatic revenue payouts to all collaborator organizations via Stripe.
/events/{event_id}/collaboratorsBearerAdd a user or organization as an event collaborator. Set their role (admin/manager) and revenue share percentage.
/events/{event_id}/guest-ticketsBearerIssue 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.
/organizationsBearerCreate an organization. The creator becomes org admin automatically.
/organizationsBearerList organizations the authenticated user belongs to.
/organizations/{org_id}/stripe-connectBearerStart Stripe Connect onboarding. Returns an onboarding URL to redirect the org admin to Stripe's hosted setup page.
/organizations/{org_id}/payouts/instantBearerRequest 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.
| Method | Endpoint | Description |
|---|---|---|
| GET | /discover/events | List published events with filters |
| GET | /orgs/{slug} | Get org by slug |
| GET | /orgs/{slug}/events | Published events for an org |
| GET | /events | List events (public or full for organizers) |
| GET | /events/{event_id} | Get event details |
| POST | /events | Create an event |
| PUT | /events/{event_id} | Update event (status triggers payouts) |
| DELETE | /events/{event_id} | Delete an event |
| GET | /events/{event_id}/collaborators | List collaborators |
| POST | /events/{event_id}/collaborators | Add collaborator |
| PUT | /events/{event_id}/collaborators/{id} | Update collaborator role |
| DELETE | /events/{event_id}/collaborators/{id} | Remove collaborator |
| POST | /events/{event_id}/guest-tickets | Issue guest ticket |
| POST | /events/{event_id}/poster | Upload poster (presigned URL) |
| GET | /events/{event_id}/poster | Get poster URL |
| DELETE | /events/{event_id}/poster | Delete poster |
| POST | /checkout/fee-estimate | Preview fee breakdown |
| POST | /checkout/sessions | Create checkout session |
| GET | /checkout/sessions/{id} | Get checkout status |
| POST | /events/{event_id}/door-payment | Create door payment (QR/tap) |
| GET | /events/{id}/door-payment/{sid}/status | Poll door payment status |
| POST | /terminal/connection-tokens | Stripe Terminal token |
| GET | /tickets | List your tickets |
| GET | /tickets/{ticket_id} | Get ticket + QR code |
| GET | /tickets/{ticket_id}/validate | Validate ticket |
| POST | /tickets/{ticket_id}/scan | Scan ticket at door |
| POST | /tickets/{ticket_id}/cancel | Cancel ticket |
| GET | /ticket-groups/{group_id} | Get group summary |
| POST | /ticket-groups/{group_id}/scan | Admit from group |
| GET | /users/me | Get your profile |
| PUT | /users/me | Update your profile |
| GET | /users/me/identities | List linked login methods |
| POST | /organizations | Create organization |
| GET | /organizations | List your organizations |
| GET | /organizations/{org_id} | Get organization |
| PUT | /organizations/{org_id} | Update organization |
| POST | /organizations/{org_id}/users | Add user to org |
| GET | /organizations/{org_id}/users | List org members |
| DELETE | /organizations/{org_id}/users/{uid} | Remove user from org |
| POST | /organizations/{org_id}/stripe-connect | Start Stripe onboarding |
| GET | /organizations/{org_id}/stripe-connect | Stripe Connect status |
| POST | /organizations/{org_id}/payouts/instant | Request instant payout |
| POST | /organizations/{org_id}/logo | Upload logo (presigned URL) |
| GET | /organizations/{org_id}/logo | Get logo URL |
| DELETE | /organizations/{org_id}/logo | Delete logo |
| POST | /organizations/{org_id}/image | Upload hero image |
| GET | /organizations/{org_id}/image | Get hero image URL |
| DELETE | /organizations/{org_id}/image | Delete 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.
Need help? support@doorsplit.app