For sale / not for sale
Sometimes you don't want ticket buyers to be able to choose from all seats in a venue.
For example:
- the event organizer decides to sell tickets through multiple ticketing companies. You're selling tickets for Section A, and your competitor is selling tickets for Section B. You want all seats in Section B to be visible but unselectable for your customers.
- you don't want to sell all sections in a large venue right away, but only after a number of seats have been sold in other sections.
In those cases, you can use the 'for sale' and 'not for sale' API calls to mark seats, areas, tables or categories as for sale or not for sale, without having to change the status of those objects. Doing so is much more convenient and faster than sending status changes in batch.
You can also specify the for sale configuration when you create an event or a top-level season.
You can embed the event manager to allow your admin users to modify the for sale configuration.
Note that ’for sale and ‘not for sale’ do not replace seat bookings. Each time you assign a seat to someone, you must also use our status change API, otherwise the availability management will not work properly. One of the reasons is that changes made by ‘for sale’ and ‘not for sale’ don’t support live updates, so they are not pushed to all ticket buyers. As a result, ticket buyers may not see the correct availability information unless there is also the correct status change API call.
In effect, it is a condition of use of seats.io that there is a strict mirroring between assigning a seat and a /change-object-status or /book API call. Breach of this would constitute a breach of our terms of use.
There’s a rate limit of 10 calls per event per day on the for sale/not for sale API calls, which means you’ll get an error if you try more often. See below for more info.
This means you can mark seats as not-for-sale even before they are created. This allows you to add extra seats to a chart, that are immediately unavailable for sale: just mark them as not-for-sale first, then draw them on the seating chart.
Seats.io accounts created before March 11 2024 can mark whole sections or rows not for sale. Newer accounts can't.
We removed this functionality because it had a confusing side-effect: it you marked a booth called 'A' as not for sale, all seats in row 'A' became not for sale as well.
Mark objects as not-for-sale
This API call marks the passed in objects, area places and categories as not for sale, while marking all other objects as for sale.
- Text
- PHP
- C#
- Java
- Python
- Ruby
- Javascript
- Go
POST https://api-{region}.seatsio.net/events/{eventKey}/actions/mark-as-not-for-sale
$seatsioClient->events->markAsNotForSale("event34", ["A-1", "A-2"], [ "GA1" => 3], ["category1", "category2"]);
await Client.Events.MarkAsNotForSaleAsync("event34", new [] { "A-1", "A-2" }, new () {{ "GA1", 3 }}, new [] { "category1", "category2" });
client.events.markAsNotForSale("event34", List.of("A-1", "A-2"), Map.of("GA1", 3), List.of("category1", "category2"));
client.events.mark_as_not_for_sale("event34", objects=["A-1", "A-2"], area_places={"GA1": 3}, categories=["category1", "category2"])
client.events.mark_as_not_for_sale key: 'event34', objects: ['A-1', 'A-2'], area_places: {'GA1' => 3}, categories: ['category1', 'category2']
await client.events.markAsNotForSale('eventKey', ['A-1', 'A-2'], { 'GA1': 3 }, ['category1', 'category2']);
err = client.Events.MarkAsNotForSale("eventKey", &events.ForSaleConfigParams{
Objects: []string{"A-1", "A-2"},
AreaPlaces: map[string]int{"GA1": 3},
Categories: []string{"category1", "category2"},
})
Request
{
"objects": ["A-1", "A-2"],
"areaPlaces": {"GA1": 3},
"categories": ["category1", "category2"]
}
- objects: optional array of strings. Can contain table labels, booth labels, area labels or seat labels.
- areaPlaces: optional object, which indicates how many places per general admission area should be not for sale. An area can also be passed into
objects
. In that case, it's made completely not for sale. - categories optional array of strings. Can contain category keys or labels.
Objects that satisfy objects
, areaPlaces
or categories
will become unselectable. All other objects are selectable, unless their status is not equal to 'free'.
Examples
To mark seats A-1 and A-2 as not for sale:
{
"objects": ["A-1", "A-2"]
}
To mark 10 places in GA1 as not for sale:
{
"areaPlaces": {"GA1": 10}
}
To mark all objects in category 'category1' as not for sale:
{
"categories": ["category1"]
}
Example request
curl https://api-{region}.seatsio.net/events/event34/actions/mark-as-not-for-sale \
-u aSecretKey: -X POST -H 'Content-Type: application/json' -d '{"objects": ["A-1", "A-2"]}'
Response
{
"rateLimitRemainingCalls": 9,
"rateLimitResetDate": "2021-10-01T23:00:00Z"
}
There's a rate limit of 10 calls per day per event. If that rate limit if reached, a 429 (Too Many Requests) is returned. The Retry-After header indicates how many seconds you have to wait before trying again.
Mark objects as for sale
This API call marks the passed in objects, area places and categories as for sale, while marking all other objects as not for sale.
- Text
- PHP
- C#
- Java
- Python
- Ruby
- Javascript
- Go
POST https://api-{region}.seatsio.net/events/{eventKey}/actions/mark-as-for-sale
$seatsioClient->events->markAsForSale("event34", ["A-1", "A-2"], [ "GA1" => 3], ["category1", "category2"]);
await Client.Events.MarkAsForSaleAsync("event34", new [] { "A-1", "A-2" }, new () {{ "GA1", 3 }}, new [] { "category1", "category2" });
client.events.markAsForSale("event34", List.of("A-1", "A-2"), Map.of("GA1", 3), List.of("category1", "category2"));
client.events.mark_as_for_sale("event34", objects=["A-1", "A-2"], area_places={"GA1": 3}, categories=["category1", "category2"])
client.events.mark_as_for_sale key: 'event34', objects: ['A-1', 'A-2'], area_places: {'GA1' => 3}, categories: ['category1', 'category2']
await client.events.markAsForSale('eventKey', ['A-1', 'A-2'], { 'GA1': 3 }, ['category1', 'category2']);
err = client.Events.MarkAsForSale("eventKey", &events.ForSaleConfigParams{
Objects: []string{"A-1", "A-2"},
AreaPlaces: map[string]int{"GA1": 3},
Categories: []string{"category1", "category2"},
})
Request
{
"objects": ["A-1", "A-2"],
"areaPlaces": {"GA1": 3},
"categories": ["category1", "category2"]
}
- objects: optional array of strings. Can contain table labels, booth labels, area labels or seat labels.
- areaPlaces: optional object, which indicates how many places per general admission area should be for sale. An area can also be passed into
objects
. In that case, it's made completely for sale. - categories optional array of strings. Can contain category keys or labels.
Only objects that satisfy objects
, areaPlaces
or categories
will become selectable (and bookable). All other objects are not selectable, and trying to book them results in a bad request.
Note that even though object is marked for sale, it's still not selectable if its status is not free.
Examples
To mark seats A-1 and A-2 for sale:
{
"objects": ["A-1", "A-2"]
}
To mark 10 places in GA1 as for sale:
{
"areaPlaces": {"GA1": 10}
}
To mark all objects in category 'category1' for sale:
{
"categories": ["category1"]
}
Example request
curl https://api-{region}.seatsio.net/events/event34/actions/mark-as-for-sale \
-u aSecretKey: -X POST -H 'Content-Type: application/json' -d '{"objects": ["A-1", "A-2"]}'
Response
{
"rateLimitRemainingCalls": 9,
"rateLimitResetDate": "2021-10-01T23:00:00Z"
}
There's a rate limit of 10 calls per day per event. If that rate limit if reached, a 429 (Too Many Requests) is returned. The Retry-After header indicates how many seconds you have to wait before trying again.
Mark all objects as for sale
This API call marks all objects as for sale, which means resetting the list of objects and categories that were previously passed in by mark-as-for-sale or mark-as-not-for-sale.
- Text
- PHP
- C#
- Java
- Python
- Ruby
- Javascript
- Go
POST https://api-{region}.seatsio.net/events/{eventKey}/actions/mark-everything-as-for-sale
$seatsioClient->events->markEverythingAsForSale("event34");
await Client.Events.MarkEverythingAsForSaleAsync("event34");
client.events.markEverythingAsForSale("event34");
client.events.mark_everything_as_for_sale("event34")
client.events.mark_everything_as_for_sale key: 'event34'
await client.events.markEverythingAsForSale('eventKey');
err = client.Events.MarkEverythingAsForSale('eventKey')
Example request
curl https://api-{region}.seatsio.net/events/event34/actions/mark-everything-as-for-sale \
-u aSecretKey: -X POST
Response
204 - No Content
Rate limiting
The above API endpoints are rate limited: you can only call it 10 times per 24 hours.
Of course, this rate limit applies per event: If you have used up all 10 saves for event A, you will still be able to change the for-sale configuration for event B.
If that limit of 10 is reached, a 429 (Too Many Requests) is returned.
The Retry-After
header indicates how many seconds you have to wait before trying again.
If you only mark seats as for-sale, that were previously marked as not-for-sale, the call is not counted for the rate limit.
In other words: you can always change the for-sale configuration of an event to open up more seats for sale.
This allows you to start sales with just a portion of your floor plan as available, and then to gradually open up the rest of the seats.
So this operation will count for the rate limit:
And this will not count for the rate limit: