diff --git a/static/openapi/catalog.json b/static/openapi/catalog.json
index bdf9032..1ce528e 100644
--- a/static/openapi/catalog.json
+++ b/static/openapi/catalog.json
@@ -2,7 +2,7 @@
"openapi": "3.0.0",
"info": {
"title": "viagogo Catalog API",
- "version": "1.0.0.40",
+ "version": "1.0.0.48",
"x-logo": {
"url": "https://img.vggcdn.net/img/assets/logo/viagogo_logo_apidocs.png",
"backgroundColor": "#222222"
@@ -1034,6 +1034,584 @@
]
}
},
+ "/catalog/listingoffers": {
+ "post": {
+ "tags": [
+ "Listing Offers"
+ ],
+ "summary": "Create a new instant liquidity offer (buyer bid) for a specific event.",
+ "operationId": "ListingOffers_CreateOffer",
+ "requestBody": {
+ "x-name": "body",
+ "content": {
+ "application/json": {
+ "schema": {
+ "nullable": true,
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateListingOfferRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ }
+ },
+ "403": {
+ "$ref": "#/components/responses/forbidden",
+ "description": null
+ },
+ "400": {
+ "$ref": "#/components/responses/validation_failed",
+ "description": null
+ },
+ "401": {
+ "$ref": "#/components/responses/requires_authentication",
+ "description": null
+ },
+ "500": {
+ "$ref": "#/components/responses/internal_server_error",
+ "description": null
+ }
+ },
+ "security": [
+ {
+ "OAuth2": [
+ "manage:listingoffers"
+ ]
+ }
+ ]
+ }
+ },
+ "/catalog/listingoffers/event/{eventId}": {
+ "get": {
+ "tags": [
+ "Listing Offers"
+ ],
+ "summary": "List caller's live offers (Active + Paused) for a specific event.\nRequires exactly one seating dimension: sectionId (+ optional rowId) OR ticketClassId.",
+ "operationId": "ListingOffers_ListOffers",
+ "parameters": [
+ {
+ "name": "eventId",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ },
+ {
+ "name": "sectionId",
+ "in": "query",
+ "schema": {
+ "type": "integer",
+ "format": "int32",
+ "nullable": true
+ }
+ },
+ {
+ "name": "rowId",
+ "in": "query",
+ "schema": {
+ "type": "integer",
+ "format": "int32",
+ "nullable": true
+ }
+ },
+ {
+ "name": "ticketClassId",
+ "in": "query",
+ "schema": {
+ "type": "integer",
+ "format": "int32",
+ "nullable": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ }
+ },
+ "404": {
+ "$ref": "#/components/responses/not_found",
+ "description": null
+ },
+ "403": {
+ "$ref": "#/components/responses/forbidden",
+ "description": null
+ },
+ "401": {
+ "$ref": "#/components/responses/requires_authentication",
+ "description": null
+ },
+ "500": {
+ "$ref": "#/components/responses/internal_server_error",
+ "description": null
+ }
+ },
+ "security": [
+ {
+ "OAuth2": [
+ "manage:listingoffers"
+ ]
+ }
+ ]
+ }
+ },
+ "/catalog/listingoffers/event/{eventId}/all": {
+ "get": {
+ "tags": [
+ "Listing Offers"
+ ],
+ "summary": "All offers (non-deleted) for a specific event — active, paused, fulfilled and expired.\nRequires exactly one seating dimension: sectionId (+ optional rowId) OR ticketClassId.",
+ "operationId": "ListingOffers_GetAllOffers",
+ "parameters": [
+ {
+ "name": "eventId",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ },
+ {
+ "name": "sectionId",
+ "in": "query",
+ "schema": {
+ "type": "integer",
+ "format": "int32",
+ "nullable": true
+ }
+ },
+ {
+ "name": "rowId",
+ "in": "query",
+ "schema": {
+ "type": "integer",
+ "format": "int32",
+ "nullable": true
+ }
+ },
+ {
+ "name": "ticketClassId",
+ "in": "query",
+ "schema": {
+ "type": "integer",
+ "format": "int32",
+ "nullable": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ }
+ },
+ "404": {
+ "$ref": "#/components/responses/not_found",
+ "description": null
+ },
+ "403": {
+ "$ref": "#/components/responses/forbidden",
+ "description": null
+ },
+ "401": {
+ "$ref": "#/components/responses/requires_authentication",
+ "description": null
+ },
+ "500": {
+ "$ref": "#/components/responses/internal_server_error",
+ "description": null
+ }
+ },
+ "security": [
+ {
+ "OAuth2": [
+ "manage:listingoffers"
+ ]
+ }
+ ]
+ }
+ },
+ "/catalog/listingoffers/{id}": {
+ "get": {
+ "tags": [
+ "Listing Offers"
+ ],
+ "summary": "Get a single offer by ID.",
+ "operationId": "ListingOffers_GetOffer",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ }
+ },
+ "404": {
+ "$ref": "#/components/responses/not_found",
+ "description": null
+ },
+ "403": {
+ "$ref": "#/components/responses/forbidden",
+ "description": null
+ },
+ "401": {
+ "$ref": "#/components/responses/requires_authentication",
+ "description": null
+ },
+ "500": {
+ "$ref": "#/components/responses/internal_server_error",
+ "description": null
+ }
+ },
+ "security": [
+ {
+ "OAuth2": [
+ "manage:listingoffers"
+ ]
+ }
+ ]
+ },
+ "delete": {
+ "tags": [
+ "Listing Offers"
+ ],
+ "summary": "Soft-delete an offer.",
+ "operationId": "ListingOffers_DeleteOffer",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": null
+ },
+ "403": {
+ "$ref": "#/components/responses/forbidden",
+ "description": null
+ },
+ "401": {
+ "$ref": "#/components/responses/requires_authentication",
+ "description": null
+ },
+ "500": {
+ "$ref": "#/components/responses/internal_server_error",
+ "description": null
+ }
+ },
+ "security": [
+ {
+ "OAuth2": [
+ "manage:listingoffers"
+ ]
+ }
+ ]
+ },
+ "patch": {
+ "tags": [
+ "Listing Offers"
+ ],
+ "summary": "Update mutable fields on an Active or Paused offer.",
+ "operationId": "ListingOffers_UpdateOffer",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "requestBody": {
+ "x-name": "body",
+ "content": {
+ "application/json": {
+ "schema": {
+ "nullable": true,
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/PatchListingOfferRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ }
+ },
+ "403": {
+ "$ref": "#/components/responses/forbidden",
+ "description": null
+ },
+ "400": {
+ "$ref": "#/components/responses/validation_failed",
+ "description": null
+ },
+ "401": {
+ "$ref": "#/components/responses/requires_authentication",
+ "description": null
+ },
+ "500": {
+ "$ref": "#/components/responses/internal_server_error",
+ "description": null
+ }
+ },
+ "security": [
+ {
+ "OAuth2": [
+ "manage:listingoffers"
+ ]
+ }
+ ]
+ }
+ },
+ "/catalog/listingoffers/{id}/state": {
+ "patch": {
+ "tags": [
+ "Listing Offers"
+ ],
+ "summary": "Transition offer state: Active (1) to resume, Paused (4) to pause.",
+ "operationId": "ListingOffers_SetOfferState",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "requestBody": {
+ "x-name": "body",
+ "content": {
+ "application/json": {
+ "schema": {
+ "nullable": true,
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/SetOfferStateRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ }
+ },
+ "403": {
+ "$ref": "#/components/responses/forbidden",
+ "description": null
+ },
+ "400": {
+ "$ref": "#/components/responses/validation_failed",
+ "description": null
+ },
+ "401": {
+ "$ref": "#/components/responses/requires_authentication",
+ "description": null
+ },
+ "500": {
+ "$ref": "#/components/responses/internal_server_error",
+ "description": null
+ }
+ },
+ "security": [
+ {
+ "OAuth2": [
+ "manage:listingoffers"
+ ]
+ }
+ ]
+ }
+ },
+ "/catalog/listingoffers/bidderbalance": {
+ "get": {
+ "tags": [
+ "Listing Offers"
+ ],
+ "summary": "Get the caller's outstanding bidder balance — total redeemable coupon value\nprojected into the requested currency. This is the spendable amount used by\nthe matching service when gating bids; eligibility (opt-in / daily-limit /\nblocks) is intentionally not applied here.",
+ "operationId": "ListingOffers_GetBidderBalance",
+ "parameters": [
+ {
+ "name": "currencyCode",
+ "in": "query",
+ "schema": {
+ "type": "string",
+ "default": "USD"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/octet-stream": {
+ "schema": {
+ "type": "string",
+ "format": "binary"
+ }
+ }
+ }
+ },
+ "404": {
+ "$ref": "#/components/responses/not_found",
+ "description": null
+ },
+ "403": {
+ "$ref": "#/components/responses/forbidden",
+ "description": null
+ },
+ "401": {
+ "$ref": "#/components/responses/requires_authentication",
+ "description": null
+ },
+ "500": {
+ "$ref": "#/components/responses/internal_server_error",
+ "description": null
+ }
+ },
+ "security": [
+ {
+ "OAuth2": [
+ "manage:listingoffers"
+ ]
+ }
+ ]
+ }
+ },
+ "/catalog/venues/configurations/{configId}": {
+ "get": {
+ "tags": [
+ "Venue Configurations"
+ ],
+ "summary": "Get a venue configuration",
+ "operationId": "VenueConfigurations_GetVenueConfiguration",
+ "parameters": [
+ {
+ "name": "configId",
+ "in": "path",
+ "required": true,
+ "description": "The venue configuration identifier",
+ "schema": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/hal+json": {
+ "schema": {
+ "$ref": "#/components/schemas/VenueConfigurationResource"
+ }
+ }
+ }
+ },
+ "404": {
+ "$ref": "#/components/responses/not_found",
+ "description": null
+ },
+ "403": {
+ "$ref": "#/components/responses/forbidden",
+ "description": null
+ },
+ "401": {
+ "$ref": "#/components/responses/requires_authentication",
+ "description": null
+ },
+ "500": {
+ "$ref": "#/components/responses/internal_server_error",
+ "description": null
+ }
+ },
+ "security": [
+ {
+ "OAuth2": [
+ "read:venue_configurations"
+ ]
+ }
+ ]
+ }
+ },
"/catalog/venues": {
"get": {
"tags": [
@@ -1375,6 +1953,11 @@
"type": "string",
"description": "The status of the event. Can be `Normal`, `Postponed`, `Cancelled`, `Rescheduled`, `Relocated`, `RelocatedAndRescheduled`, `Draft`, `Contingent` and `Deleted`"
},
+ "venue_config_id": {
+ "type": "integer",
+ "description": "The venue configuration identifier for this event.",
+ "format": "int32"
+ },
"_links": {
"nullable": true,
"oneOf": [
@@ -2034,6 +2617,203 @@
}
}
},
+ "CreateListingOfferRequest": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "EventId",
+ "Quantity",
+ "TicketBidPrice",
+ "BidCurrencyCode"
+ ],
+ "properties": {
+ "EventId": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "Quantity": {
+ "type": "integer",
+ "format": "int32",
+ "maximum": 20.0,
+ "minimum": 1.0
+ },
+ "TicketBidPrice": {
+ "type": "number",
+ "format": "decimal",
+ "minimum": 1.0
+ },
+ "BidCurrencyCode": {
+ "type": "string",
+ "maxLength": 3,
+ "minLength": 3
+ },
+ "AutoRelistEnabled": {
+ "type": "boolean"
+ },
+ "RelistMarginPercentage": {
+ "type": "number",
+ "format": "decimal",
+ "minimum": 0.0
+ },
+ "OfferCount": {
+ "type": "integer",
+ "format": "int32",
+ "maximum": 100.0,
+ "minimum": 1.0
+ },
+ "SectionId": {
+ "type": "integer",
+ "format": "int32",
+ "nullable": true
+ },
+ "RowId": {
+ "type": "integer",
+ "format": "int32",
+ "nullable": true
+ },
+ "TicketClassId": {
+ "type": "integer",
+ "format": "int32",
+ "nullable": true
+ },
+ "ExpiresAt": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ }
+ }
+ },
+ "PatchListingOfferRequest": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "TicketBidPrice": {
+ "type": "number",
+ "format": "decimal",
+ "minimum": 1.0,
+ "nullable": true
+ },
+ "Quantity": {
+ "type": "integer",
+ "format": "int32",
+ "maximum": 20.0,
+ "minimum": 1.0,
+ "nullable": true
+ },
+ "ExpiresAt": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "AutoRelistEnabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "RelistMarginPercentage": {
+ "type": "number",
+ "format": "decimal",
+ "minimum": 0.0,
+ "nullable": true
+ },
+ "OfferCount": {
+ "type": "integer",
+ "format": "int32",
+ "maximum": 100.0,
+ "minimum": 1.0,
+ "nullable": true
+ }
+ }
+ },
+ "SetOfferStateRequest": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "State"
+ ],
+ "properties": {
+ "State": {
+ "description": "Target state: Active (1) to resume, Paused (4) to pause.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/InstantLiquidityOfferState"
+ }
+ ]
+ }
+ }
+ },
+ "InstantLiquidityOfferState": {
+ "type": "integer",
+ "description": "",
+ "x-enumNames": [
+ "Active",
+ "Fulfilled",
+ "Deleted",
+ "Paused"
+ ],
+ "enum": [
+ 1,
+ 2,
+ 3,
+ 4
+ ]
+ },
+ "VenueConfigurationResource": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "config_id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "sections": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VenueConfigSectionResource"
+ }
+ }
+ }
+ },
+ "VenueConfigSectionResource": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "section_id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "section_name": {
+ "type": "string"
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VenueConfigSectionRowResource"
+ }
+ }
+ }
+ },
+ "VenueConfigSectionRowResource": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "row_id": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "row_name": {
+ "type": "string"
+ },
+ "ticket_class_id": {
+ "type": "integer",
+ "format": "int32",
+ "nullable": true
+ },
+ "ticket_class_name": {
+ "type": "string",
+ "nullable": true
+ }
+ }
+ },
"Venues": {
"type": "object",
"additionalProperties": false,
@@ -2278,8 +3058,10 @@
"security": [
{
"OAuth2": [
+ "manage:listingoffers",
"read:categories",
"read:events",
+ "read:venue_configurations",
"read:venues"
]
}
@@ -2298,6 +3080,10 @@
"name": "Events",
"description": "View events on the viagogo platform"
},
+ {
+ "name": "Listing Offers",
+ "description": "Manage instant liquidity offers (buyer bids) on the viagogo platform"
+ },
{
"name": "Resource_Event",
"description": "An event on the viagogo platform.\n",
@@ -2318,11 +3104,20 @@
"description": "An venue on the viagogo platform.\n",
"x-displayName": "Venue"
},
+ {
+ "name": "Resource_VenueConfigurationResource",
+ "description": "\n",
+ "x-displayName": "VenueConfigurationResource"
+ },
{
"name": "Resource_Venues",
"description": "\n",
"x-displayName": "Venues"
},
+ {
+ "name": "Venue Configurations",
+ "description": "View venue configurations on the viagogo platform"
+ },
{
"name": "Venues",
"description": "View venues on the viagogo platform"
@@ -2334,6 +3129,8 @@
"tags": [
"Categories",
"Events",
+ "Listing Offers",
+ "Venue Configurations",
"Venues"
]
},
@@ -2350,6 +3147,7 @@
"Resource_Events",
"Resource_MapEventResponseModel",
"Resource_Venue",
+ "Resource_VenueConfigurationResource",
"Resource_Venues"
]
}