curl --request GET \
--url https://api.tickable.io/events/{id}/availability \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.tickable.io/events/{id}/availability"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.tickable.io/events/{id}/availability', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tickable.io/events/{id}/availability",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tickable.io/events/{id}/availability"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tickable.io/events/{id}/availability")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tickable.io/events/{id}/availability")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"timeslot_id": "d4e5f6a7-8901-4b2c-3d4e-5f6a7b8c9d0e",
"title": "Morning Session",
"starts_at": "2026-06-15T10:00:00Z",
"ends_at": "2026-06-15T12:00:00Z",
"total_available": 200,
"remaining": 37,
"sale_closes_at": "2026-06-15T12:00:00Z",
"on_sale": true,
"ticket_types": [
{
"ticket_type_id": "b2c4e6a8-1234-4f5a-9c8d-0e1f2a3b4c5d",
"name": "Early Bird",
"price": 2500,
"visibility": "visible",
"remaining": 12,
"sold_out": false,
"on_sale": true,
"sale_opens_at": null,
"sale_closes_at": "2026-06-08T10:00:00Z"
}
]
}
],
"pagination": {
"total": 142,
"limit": 25,
"offset": 0,
"has_more": true
}
}{
"error": {
"type": "not_found_error",
"code": "resource_missing",
"message": "No such event.",
"request_id": "req_3f2a9c1b7d4e4f0a8b6c5d2e1f0a9b8c",
"param": "event_id"
}
}Get Availability
Places left per timeslot and ticket type, calculated exactly like the shop does (test orders take no place; cancelled tickets free theirs). Without from or until, only timeslots that are not over yet are returned, earliest first. Unlike the shop, the real number of places left is always returned. Requires the events.read scope.
curl --request GET \
--url https://api.tickable.io/events/{id}/availability \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.tickable.io/events/{id}/availability"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.tickable.io/events/{id}/availability', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tickable.io/events/{id}/availability",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tickable.io/events/{id}/availability"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tickable.io/events/{id}/availability")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tickable.io/events/{id}/availability")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"timeslot_id": "d4e5f6a7-8901-4b2c-3d4e-5f6a7b8c9d0e",
"title": "Morning Session",
"starts_at": "2026-06-15T10:00:00Z",
"ends_at": "2026-06-15T12:00:00Z",
"total_available": 200,
"remaining": 37,
"sale_closes_at": "2026-06-15T12:00:00Z",
"on_sale": true,
"ticket_types": [
{
"ticket_type_id": "b2c4e6a8-1234-4f5a-9c8d-0e1f2a3b4c5d",
"name": "Early Bird",
"price": 2500,
"visibility": "visible",
"remaining": 12,
"sold_out": false,
"on_sale": true,
"sale_opens_at": null,
"sale_closes_at": "2026-06-08T10:00:00Z"
}
]
}
],
"pagination": {
"total": 142,
"limit": 25,
"offset": 0,
"has_more": true
}
}{
"error": {
"type": "not_found_error",
"code": "resource_missing",
"message": "No such event.",
"request_id": "req_3f2a9c1b7d4e4f0a8b6c5d2e1f0a9b8c",
"param": "event_id"
}
}Authorizations
Pass as Authorization: Bearer {token}. Accepts either an OAuth2 JWT access token or an API key (tk_live_...) created from the Tickable dashboard.
Path Parameters
Event ID
"550e8400-e29b-41d4-a716-446655440000"
Query Parameters
Max results per page (default 25, max 100)
1 <= x <= 10025
Number of results to skip
x >= 00
Sort field and direction, e.g. created_at:desc
"created_at:desc"
Only timeslots starting at or after this date
"2026-06-15T00:00:00Z"
Only timeslots starting before this date
"2026-06-16T00:00:00Z"