Skip to content

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:

https://public-api.fixr.co

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:

curl https://public-api.fixr.co/accounts/this \
  -H "X-Api-Token: <your API key>"

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:

{
  "code": 3,
  "message": "An authentication error occurred. Please log in again."
}

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:

{
  "code": 4,
  "message": "Permission denied."
}

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:

{
  "detail": "Sorry, you have sent too many requests. Try again in 6 seconds."
}

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:

GET /accounts/events?limit=50&offset=100

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_time and last_entry are in UTC, for example 2026-11-14T22:00:00Z. Ticket types' sale_start, sale_end and last_entry are in UTC too.
  • open_time_local, close_time_local and last_entry_local are the same times as shown at the venue, with no timezone, for example 2026-11-14T22:00:00. The event's timezone field gives the venue's timezone, for example Europe/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_local and last_entry_local
  • Ticket types: sale_start_local, sale_end_local and last_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}/publish to 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_local and currency. last_entry_local defaults to the close time.
  • Venue. venue_id is a FIXR venue ID. There is no venue endpoint, but every event in the API includes its venue's venue_id in the venue object.
  • Currency. currency must be one of the available_currencies returned by GET /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_reference to store your own ID for an event. It must be unique within your account. If you send the same event twice with the same external_reference, the API rejects the second request instead of creating a duplicate.
  • Ticket prices. target_price is the ticket's face value, and FIXR adds booking and processing fees on top. If you set absorb_booking_fee to true, target_price is instead the total the customer pays, and the fees come out of it. You can't change absorb_booking_fee after 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.