API · Events
Events are the top-level objects in your account: a date and venue customers can buy tickets to.
GET /admin/events
Returns the events in your account, split into upcoming and past, plus aggregate stats for the period filter.
curl -H "Authorization: Bearer your-token-here" \
-H "Accept: application/json" \
https://app.usetix.io/admin/events
Query parameters:
| Parameter | Description |
|---|---|
period |
One of today, week, month, year, all. Filters past events and the stats. Upcoming events are not affected. Defaults to month. |
Response:
{
"upcoming_events": [
{
"id": 42,
"slug": "spring-showcase",
"title": "Spring Showcase",
"description": "Our annual seasonal event.",
"starts_at": "2026-05-01T19:00:00Z",
"ends_at": "2026-05-01T23:00:00Z",
"sales_starts_at": null,
"sales_ends_at": "2026-05-01T19:00:00Z",
"published": true,
"capacity": 500,
"venue": {
"id": 7,
"name": "The Venue",
"city": "Berlin"
}
}
],
"past_events": [],
"stats": {
"upcoming_count": 1,
"revenue": { "amount": "0.00", "currency": "EUR" },
"tickets_sold": 0
}
}
GET /admin/events/:slug
Returns a single event by its URL slug, plus live sales stats and a per-ticket-type breakdown — the same numbers your admin dashboard shows for that event.
curl -H "Authorization: Bearer your-token-here" \
-H "Accept: application/json" \
https://app.usetix.io/admin/events/spring-showcase
Response:
{
"id": 42,
"slug": "spring-showcase",
"title": "Spring Showcase",
"description": "Our annual seasonal event.",
"starts_at": "2026-05-01T19:00:00Z",
"ends_at": "2026-05-01T23:00:00Z",
"sales_starts_at": null,
"sales_ends_at": "2026-05-01T19:00:00Z",
"published": true,
"capacity": 500,
"venue": {
"id": 7,
"name": "The Venue",
"city": "Berlin"
},
"stats": {
"sold_count": 142,
"remaining_count": 358,
"sell_through_percentage": 28,
"total_orders": 87,
"total_revenue": { "amount": "3550.00", "currency": "EUR" },
"redemption_rate": 0.0,
"sales_velocity": 7.1,
"capacity_consumed": 145,
"capacity_remaining": 355
},
"tickets_breakdown": [
{
"title": "Early Bird",
"kind": "StandardTicket",
"color": "#3B82F6",
"sold": 100,
"reserved": 2,
"stock": 0,
"capacity": 102,
"price": { "amount": "20.00", "currency": "EUR" },
"revenue": { "amount": "2000.00", "currency": "EUR" }
},
{
"title": "Regular",
"kind": "StandardTicket",
"color": "#10B981",
"sold": 42,
"reserved": 1,
"stock": 355,
"capacity": 398,
"price": { "amount": "25.00", "currency": "EUR" },
"revenue": { "amount": "1050.00", "currency": "EUR" }
}
],
"performers": [
{
"id": 17,
"event_performer_id": 89,
"name": "DJ Snake",
"performer_type": "person",
"role": "headliner",
"genre": "Techno",
"position": 1,
"starts_at": "2026-05-01T22:00:00Z",
"ends_at": "2026-05-01T23:30:00Z",
"bio": "House DJ since 2010.",
"bio_html": "<div class=\"trix-content\"><p>House DJ since 2010.</p></div>",
"website_url": "https://djsnake.example.com",
"instagram_url": null,
"spotify_url": null,
"soundcloud_url": null,
"tiktok_url": null,
"youtube_url": null,
"image_url": null
}
],
"faq_items": [],
"custom_fields": []
}
Stats fields
| Field | Type | Notes |
|---|---|---|
sold_count |
integer | Tickets sold to date (paid orders only). For group tickets, each individual seat counts. |
remaining_count |
integer | Tickets still available across all types. -1 means at least one ticket type has unlimited stock. |
sell_through_percentage |
integer | null | Percentage of finite-stock tickets sold (0–100). null if the event has any unlimited-stock ticket or no stock at all. |
total_orders |
integer | Distinct paid orders for this event. |
total_revenue |
object | { "amount": "...", "currency": "..." }. Sum of paid order totals. |
redemption_rate |
decimal | Percentage of sold tickets already scanned at the door (0.0–100.0). |
sales_velocity |
decimal | Tickets sold per day since the first paid order. 0 for past or unsold events. |
capacity_consumed |
integer | Seats currently held against the event’s capacity (paid + reserved). Only present when capacity is set. |
capacity_remaining |
integer | capacity - capacity_consumed, floored at 0. Only present when capacity is set. |
Tickets breakdown
tickets_breakdown is an array, one entry per ticket type on the event, in display order. Use it to render a sell-through view per ticket type.
| Field | Type | Notes |
|---|---|---|
title |
string | Ticket title. |
kind |
string | StandardTicket or GroupTicket. |
color |
string | Hex color code used in the admin dashboard. |
sold |
integer | Paid units. For GroupTicket, this counts bundles, not individual seats — matches the stock unit. |
reserved |
integer | Units currently held in pending checkouts. |
stock |
integer | Remaining stock. -1 means unlimited. |
capacity |
integer | Original allocation, reconstructed as sold + reserved + stock. -1 for unlimited tickets. |
price |
object | { "amount": "...", "currency": "..." } for the ticket price. |
revenue |
object | { "amount": "...", "currency": "..." }. Total paid for this ticket type. |
Performers
performers is an array, one entry per performer assigned to the event, in display order (position ascending). The shape mirrors the standalone performers endpoint with extra fields describing the assignment (role, set time, etc.).
| Field | Type | Notes |
|---|---|---|
id |
integer | Internal performer ID — the same value used by GET /admin/performers/:id. |
event_performer_id |
integer | Internal ID of the assignment row, in case you need to PATCH/DELETE it directly. |
name |
string | Performer display name. |
performer_type |
string | person or performing_group. |
role |
string | headliner, support, or guest. |
genre |
string | null | Free-form genre tag set on the assignment. |
position |
integer | Sort order within the event’s lineup, lower first. |
starts_at |
string | null | ISO 8601 UTC. Set time within the event, if scheduled. |
ends_at |
string | null | ISO 8601 UTC. |
bio |
string | null | Plain-text bio (rich text body stripped of HTML). |
bio_html |
string | null | Sanitized HTML version of the bio, ready to embed. |
website_url |
string | null | External URL. |
instagram_url |
string | null | External URL. |
spotify_url |
string | null | External URL. |
soundcloud_url |
string | null | External URL. |
tiktok_url |
string | null | External URL. |
youtube_url |
string | null | External URL. |
image_url |
string | null | URL to the performer’s image, if attached. |
POST /admin/events
Creates a new draft event. Requires a write token. To attach an image, direct-upload the file first and pass its signed_id as the image field.
curl -X POST \
-H "Authorization: Bearer your-token-here" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"title": "Spring Showcase", "venue_id": 7, "starts_at": "2026-05-01T19:00:00Z", "ends_at": "2026-05-01T23:00:00Z", "sales_ends_at": "2026-05-01T19:00:00Z"}' \
https://app.usetix.io/admin/events
Body parameters:
| Field | Required | Notes |
|---|---|---|
title |
yes | Event title. |
venue_id |
yes | Internal ID of an existing venue in your account. |
starts_at |
yes | ISO 8601. Parsed in the venue’s timezone if no zone is included. |
ends_at |
yes | ISO 8601. |
sales_ends_at |
yes | ISO 8601. When ticket sales close. |
sales_starts_at |
no | ISO 8601. When sales open. Omit to open immediately. |
description |
no | Plain-text description. |
slug |
no | URL slug. Auto-generated from title if omitted. |
capacity |
no | Total seats across ticket types. Omit for uncapped. |
minimum_age |
no | Age restriction. |
customer_vat_rate_override |
no | Per-event VAT override (decimal percentage). |
image |
no | signed_id from a direct upload. |
background_image |
no | signed_id from a direct upload. |
Response: 201 Created with the event JSON and a Location header pointing at GET /admin/events/:slug.
PATCH /admin/events/:slug
Updates an existing event. Send only the fields you want to change.
curl -X PATCH \
-H "Authorization: Bearer your-token-here" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"title": "Updated title"}' \
https://app.usetix.io/admin/events/spring-showcase
Accepts the same body parameters as POST /admin/events.
Response: 200 OK with the updated event JSON.
DELETE /admin/events/:slug
Deletes an event. Events with paid orders cannot be deleted; the API returns 422 Unprocessable Entity in that case.
curl -X DELETE \
-H "Authorization: Bearer your-token-here" \
-H "Accept: application/json" \
https://app.usetix.io/admin/events/spring-showcase
Response: 204 No Content on success.
POST /admin/events/:slug/publication
Publishes the event, making it visible on the public shop. Requires a description and at least one ticket; otherwise returns 422 with the missing requirements.
curl -X POST \
-H "Authorization: Bearer your-token-here" \
-H "Accept: application/json" \
https://app.usetix.io/admin/events/spring-showcase/publication
Response: 200 OK with the event JSON (published: true).
DELETE /admin/events/:slug/publication
Unpublishes the event, removing it from the public shop. Existing orders are unaffected.
curl -X DELETE \
-H "Authorization: Bearer your-token-here" \
-H "Accept: application/json" \
https://app.usetix.io/admin/events/spring-showcase/publication
Response: 200 OK with the event JSON (published: false).
Event fields
| Field | Type | Notes |
|---|---|---|
id |
integer | Internal numeric ID. Stable. |
slug |
string | URL slug, used as the path parameter. The event’s public URL is https://<your-subdomain>.usetix.io/events/<slug>. |
title |
string | Event title. |
description |
string | null | Plain-text description. May contain newlines. |
starts_at |
string | ISO 8601 UTC. When doors/the event begin. |
ends_at |
string | ISO 8601 UTC. |
sales_starts_at |
string | null | When ticket sales open. null means sales are open immediately. |
sales_ends_at |
string | When ticket sales close. Always set; defaults to starts_at if you didn’t pick a custom value. |
published |
boolean | true if the event is live on the public shop, false for drafts. |
capacity |
integer | null | Total seats across all ticket types. null means uncapped. |
venue.id |
integer | Internal venue ID. |
venue.name |
string | Venue name. |
venue.city |
string | Venue city. |