API¶
Overview¶
FIXR has an API that lets event organisers read and manage the events on their FIXR organiser account. With it you can:
- read your account's details
- list and retrieve your events and their ticket types, including sales figures
- create and update events, and publish them
- create and update ticket types
Every request acts on the organiser account that the API key belongs to. A key can't read or change another account's events.
The Schema at the bottom of this page lists every endpoint with its request and response fields.
Base URL¶
All endpoints are served from:
Requests and responses are JSON. Paths have no trailing slash: /accounts/events works, /accounts/events/ returns 404 Not Found.
Authentication¶
The API is authenticated using an API key. Please contact FIXR to get a key for your account, and tell us which scopes it needs.
Send the key in the X-Api-Token header of every request. Send the key on its own, with no prefix such as Bearer:
Keep your API key secret. Anyone who has it can use the API as your account, within the key's scopes. Only call the API from your own servers. Never put the key in a web page, a mobile app, or anything else that runs on a customer's device.
FIXR only stores a hash of your key, so we can't send it to you again. If you lose a key, or think someone else has it, contact FIXR to revoke it and get a new one.
The API rejects a request with 403 Forbidden if its key is missing or unrecognised, has been revoked, or belongs to an account that hasn't been verified. The API sends 403 here, not 401:
Scopes¶
Each API key has one or more scopes, which set the endpoints it can use.
| Scope | Lets the key |
|---|---|
accounts:read |
Read your account's details, such as its name, links, tracking IDs and available currencies. |
events:read |
List and retrieve your events and their ticket types, including quantities sold and revenue. |
events:write |
Create, update and publish events, and create and update their ticket types. |
accounts:read and events:read only read data. events:write changes what you have on sale, so only ask for it if your integration creates or edits events.
Scopes don't include each other. For example, events:write doesn't let a key list or retrieve events, so if your integration needs to do both, its key needs events:read as well. The create, update and publish endpoints still return the event or ticket type they changed.
If a key calls an endpoint that its scopes don't cover, the API rejects the request with 403 Forbidden:
Give each key only the scopes it needs. If you have more than one integration, use a separate key for each. To change the scopes on a key, contact FIXR.
Scopes by endpoint¶
| Method | Path | Does | Scope |
|---|---|---|---|
GET |
/accounts/this |
Retrieve your account | accounts:read |
GET |
/accounts/events |
List your events | events:read |
POST |
/accounts/events |
Create an event | events:write |
GET |
/accounts/events/{event_id} |
Retrieve an event | events:read |
PUT, PATCH |
/accounts/events/{event_id} |
Update an event | events:write |
POST |
/accounts/events/{event_id}/publish |
Publish an event (make it live) | events:write |
GET |
/accounts/events/{event_id}/ticket-types |
List an event's ticket types | events:read |
POST |
/accounts/events/{event_id}/ticket-types |
Create a ticket type | events:write |
GET |
/accounts/events/{event_id}/ticket-types/{ticket_type_id} |
Retrieve a ticket type | events:read |
PUT, PATCH |
/accounts/events/{event_id}/ticket-types/{ticket_type_id} |
Update a ticket type | events:write |
Rate Limit¶
The API is rate limited to 2000 requests per hour per API key.
If you exceed this limit, the API will respond with a 429 Too Many Requests status code. The response body will contain a JSON object with details about the rate limit:
The response will also include a Retry-After header indicating the number of seconds to wait before making another request.
Errors¶
Errors use standard HTTP status codes, with a JSON body that explains what went wrong.
| Status | When |
|---|---|
400 Bad Request |
The request data isn't valid. detail lists the problems, by field. |
403 Forbidden |
The key is missing or not valid (code 3, see Authentication), or lacks the scope that the endpoint needs (code 4, see Scopes). |
404 Not Found |
The event or ticket type doesn't exist or isn't on your account, or the path is wrong. |
409 Conflict |
The event can't be published because its close time has passed. |
429 Too Many Requests |
You have gone over the rate limit. |
For example, a 400 response looks like this:
{
"code": 7,
"message": "Some invalid data was sent. Please check and try again.",
"detail": {
"currency": ["Currency USD is not available for this account."]
}
}
Pagination¶
The list endpoints return results one page at a time. Set the page size with limit (the default is 20), and skip results with offset:
Each page looks like this, with the results in data:
{
"count": 142,
"next": "https://public-api.fixr.co/accounts/events?limit=50&offset=150",
"next_offset": 150,
"previous": "https://public-api.fixr.co/accounts/events?limit=50&offset=50",
"data": []
}
To get every result, keep requesting the next URL until it is null.
Listing events¶
GET /accounts/events returns your events in order of open time, earliest first. You can filter and sort the list with these query parameters:
| Parameter | Example | Returns |
|---|---|---|
open_time_after, open_time_before |
open_time_after=2026-11-01T00:00:00Z |
Events that open at or after, or at or before, the given time. |
close_time_after, close_time_before |
close_time_before=2026-12-01T00:00:00Z |
Events that close at or after, or at or before, the given time. |
status |
status=Live |
Live or Draft events. To get both, repeat the parameter: status=Live&status=Draft. |
is_private |
is_private=false |
Only private (true) or only public (false) events. |
is_timed_entry |
is_timed_entry=true |
Only timed-entry (true) or only other (false) events. |
ordering |
ordering=-close_time |
Events sorted by open_time (the default) or close_time. Add - in front for latest first. |
expand |
expand=ticket_types |
Each event with its full ticket types, instead of only their IDs. |
The status filter takes Live or Draft with a capital letter, but the status field in responses is lower case (live, draft).
Give filter times a timezone, such as Z for UTC. If you use an offset such as +01:00, encode the + in the URL as %2B.
expand=ticket_types also works on GET /accounts/events/{event_id}.
Dates and times¶
An event takes place in its venue's timezone, so the API gives each time in two forms:
open_time,close_timeandlast_entryare in UTC, for example2026-11-14T22:00:00Z. Ticket types'sale_start,sale_endandlast_entryare in UTC too.open_time_local,close_time_localandlast_entry_localare the same times as shown at the venue, with no timezone, for example2026-11-14T22:00:00. The event'stimezonefield gives the venue's timezone, for exampleEurope/London.
When you create or update an event or ticket type, send times as the venue's local time in the form YYYY-MM-DDThh:mm:ss, with no offset or Z. The API rejects any time that has a timezone. Use these fields:
- Events:
open_time_local,close_time_localandlast_entry_local - Ticket types:
sale_start_local,sale_end_localandlast_entry_local
Creating events and ticket types¶
- New events are drafts. Add ticket types to the event, then publish it with
POST /accounts/events/{event_id}/publishto put it live. Publishing an event that is already live changes nothing. - Required fields. Creating an event requires
name,venue_id,open_time_local,close_time_localandcurrency.last_entry_localdefaults to the close time. - Venue.
venue_idis a FIXR venue ID. There is no venue endpoint, but every event in the API includes its venue'svenue_idin thevenueobject. - Currency.
currencymust be one of theavailable_currenciesreturned byGET /accounts/this. - Fixed after creation. You can't change an event's venue or currency after you create it. You can't update a live event once it has finished, or publish an event whose close time has passed.
- Your own IDs. Use
external_referenceto store your own ID for an event. It must be unique within your account. If you send the same event twice with the sameexternal_reference, the API rejects the second request instead of creating a duplicate. - Ticket prices.
target_priceis the ticket's face value, and FIXR adds booking and processing fees on top. If you setabsorb_booking_feetotrue,target_priceis instead the total the customer pays, and the fees come out of it. You can't changeabsorb_booking_feeafter you create the ticket type.
Schema¶
The schema below lists every endpoint with its request and response fields. You can also download it in OpenAPI format from https://public-api.fixr.co/schema.
Sending requests
You can't send authenticated requests from this page. Send them from your own server, or with a tool such as curl, using the X-Api-Token header described in Authentication. Requests go to your live FIXR account, so anything you create, update or publish really happens.