Introduction
Welcome to the Ticketbutler API! This is a REST API and provide access to the Ticketbutler platform from a code perspective.
The default version is v3
.
Using this API it is possible to interact with the platform for listing events and creating orders. The API is JSON-REST based with conventional GET, POST, PUT and DELETE actions.
See examples of using the API using CURL in the right hand side.
Remark: In all examples you’ll need to replace the domain name test.ticketbutler.io
with the domain name for your Ticketbutler platform.
Any questions you might have, please reach out to our tech support team via email [email protected].
Authentication
To authorize, use this code:
# With shell, you can just pass the correct header with each request
curl -X GET https://test.ticketbutler.io/api/v3/ping/ \
-H 'Authorization: Token ticketbutler-auth-token'
Make sure to replace
ticketbutler-auth-token
with your API key.
For clients to allow access to the API a token key is used for authentication.
The API expects the API key to be included in all API requests to the server in a header that looks like the following:
Authorization: Token ticketbutler-auth-token
You find your Ticketbutler API key via the organiser dashboard. Login and go to:
“General settings > API access”
If you don’t already have one please go to https://you.ticketbutler.io/en/create/ and follow the signup process.
Events
The following section describe how to interact with the events. The example responses provided are simplified, where fields not described might be removed or renamed in the future.
Customisation of events is currently done by the Ticketbutler support team, therefore, if you have an event where you want something specific configures, please get in touch on [email protected]. Events can be tailored to multiple ways e.g. only paid by vouchers or by invoice, using a connected Stripe account, using custom order email templates, using a custom ticket template.
Get All Events
curl -X GET https://test.ticketbutler.io/api/v3/events/ \
-H 'Authorization: Token ticketbutler-auth-token'
The above command returns JSON structured like this:
[
{
"uuid":"d7d02d945c8a46d1bf9112b6a29b53a6",
"title":"Weekend hack",
"start_date":"2019-06-29T07:45:00+02:00",
"images":[],
"url":"https://test.ticketbutler.io/da/e/weekend-hack/",
"address": { ... },
"is_expired":false,
"price_min":0.0,
"price_max":0.0,
"currency":"DKK",
"description":"",
"summary":""
},
{
"uuid":"887d9eb1bd1d400490deead624269c13",
"title":"Beer tasting",
"start_date":"2019-06-30T13:45:00+02:00",
"images":[],
"url":"https://test.ticketbutler.io/da/e/beer-tasting/",
"address": { ... },
"is_expired":false,
"price_min":0.0,
"price_max":0.0,
"currency":"DKK",
"description":"This is rich html describing the event",
"summary":"This is a short summary of the event"
}
]
This endpoint retrieves all events.
HTTP Request
GET https://test.ticketbutler.io/api/v3/events/
Query Parameters
Parameter | Default | Description |
---|---|---|
old | false | If set to true, the result will also include expired events. |
Create an event
curl -X POST https://test.ticketbutler.io/api/v3/events/ \
-H 'Auhorization: Token ticketbutler-auth-token'
-H 'Content-Type: application/json'
-d @new_event.json
The above command uses object new_event.json with JSON structured like this:
{
"title": "Testing event",
"start_date": "2019-11-06T09:45:00+01:00",
"end_date": "2019-11-06T18:00:00+01:00",
"ticket_types": [
{
"title": "Ticket",
"price": 400.00,
"amount_total": 100
}
],
"is_members_only": false,
"team": "19ed41947c2c4511a334fa94edd2cbb9",
"eventsettings": {},
"address": {
"first_name": "John",
"last_name": "Doe",
"email": "[email protected]",
"phone": "42424242"
},
"description": "This is an event descriptiopn"
}
The above command returns JSON structured like this:
{
"uuid": "263c931867d04f62a2a26641e6605558",
"title": "Testing event",
"start_date": "2019-11-06T09:45:00+01:00",
"end_date": "2019-11-06T18:00:00+01:00",
"ticket_types": [
{
"uuid": "7d06db6942b54a1cb27e5ef609e941ce",
"title": "Ticket",
"price": 400,
"amount": 100,
"amount_total": 100,
"is_members_only": false
}
],
"eventsettings": {
"refund_email_text": "",
"reminder_email": true,
"reminder_email_text": "",
"ticket_limit": 20,
"ticket_limit_members_only": 1,
"order_ticket_limit": 0,
"is_no_show_fee": true,
"show_waiting_list": false,
"event_ticket_limit_sold_out": false,
"invoice_payment_only": false,
"invoice_payment_optional": false,
"organizer_absorb_fees": false,
"fee_type": "attendee",
"event_type": "on-show",
"vat_exempt": false,
"event_ticket_limit_amount_initially": 0,
"has_event_ticket_limit": false,
"barcode_active": false,
"has_end_date": false,
"ticket_email_text": null
},
"team": "Default",
"address": {
"first_name": "",
"last_name": "",
"title": "",
"venue": null,
"business_name": "",
"cvr": "",
"street": "",
"street_2": "",
"city": "",
"postcode": "",
"country": "",
"phone": "42424242",
"email": "",
"language": ""
},
"pin": "6053",
"is_members_only": false,
"description": "This is an event description",
"summary": ""
}
HTTP Request
POST https://test.ticketbutler.io/api/v3/events/
JSON Payload
title: public title for event.
start_date: event start datetime object
end_date (optional): event end datetime object
ticket_types: A list of ticket types in a format:
[ { "title": "Ticket", "price": 400.00, "amount_total": 100 } ]
is_members_only: true/false
if the event is only available for members of the team
team: team name
or uuid
eventsettings: extra event settings, options are as follows:
Field | Type | Description | Default |
---|---|---|---|
refund_email_text |
string |
Text that will be sent on refund | null |
reminder_email |
boolean |
Send email reminders to attendees before event | false |
reminder_email_text |
string |
Text that will be sent to attendees before the event | null |
ticket_limit |
integer |
Maximum amount of tickets to be selected on purchase | 9 |
ticket_limit_members_only |
integer |
Maximum amount of tickets to be selected for members | 9 |
ticket_email_text |
string |
Text that will be sent alongside tickets | null |
address: Address for the event. Possible fields are:
Field | Type |
---|---|
first_name |
string |
last_name |
string |
title |
string |
venue |
string |
business_name |
string |
cvr |
string |
street |
string |
street_2 |
string |
city |
string |
postcode |
string |
country |
string |
phone |
string |
email |
string |
language |
string |
description: Add an event description of the event. This can optionally be formatted as HTML.
Get Specific Event
curl -X GET https://test.ticketbutler.io/api/v3/events/df388ddd483c49e48e2e9ed7382592a3/ \
-H 'Authorization: Token ticketbutler-auth-token'
The above command returns JSON structured like this:
{
"title":"Weekend hack",
"uuid":"887d9eb1bd1d400490deead624269c13",
"url":"https://test.ticketbutler.io/da/e/weekend-hack/",
"description":"",
"address":{ ... },
"has_discount_code":false,
"has_ticket_sold":true,
"images":[],
"is_free_event":true,
"is_expired":false,
"pin_str":"6124",
"price_range":{"min":0.0,"max":0.0},
"start_date":"2019-06-30T13:45:00+02:00",
"ticket_types":[
{
"uuid":"5025811e9d8346379d1db8a527909d0b",
"title":"free",
"price":0.0,
"active":true,
"amount":996,
"amount_sold":4,
"amount_total":1000,
"is_tickets_sold":true,
"price_verbose":"gratis",
"is_free":true,
"sold_out":false,
"is_members_only":false,
"start_date":null
}
],
"eventsettings":{
"reminder_email":true,
"ticket_limit":9,
"order_ticket_limit":0,
"is_no_show_fee":false,
"show_waiting_list":true,
"invoice_payment_only":false,
"invoice_payment_optional":false,
"organizer_absorb_fees":false,
"fee_type":"attendee",
"event_type":"fee",
"vat_exempt":false,
"end_date_provided":false,
"barcode_active":false
},
"team_uuid":"531a80891a844fda9068be2c58905121",
"team":"Emil"
}
This endpoint retrieves detailed info on a specific event.
HTTP Request
GET https://test.ticketbutler.io/api/v3/events/<UUID>/
Query Parameters
Parameter | Description |
---|---|
UUID | The unique identifier of the event. |
Update event
curl -X POST https://test.ticketbutler.io/api/v3/events/ \
-H 'Authorization: Token ticketbuler-auth-token'
-H 'Content-Type: application/json'
-d @event_data.json
The above command uses object event_data.json with JSON structured like this:
{
"title": "Testing event",
"start_date": "2019-11-06T09:45:00+01:00",
"end_date": "2019-11-06T18:00:00+01:00",
"ticket_types": [ ... ],
"eventsettings": { ... },
"team": "Default",
"address": { ... },
"is_members_only": false,
"description": "This is an event description",
"summary": ""
}
HTTP Request
POST https://test.ticketbutler.io/api/v3/events/<event_uuid>/
Query parameters
event_uuid: unique event identifier, hex format
JSON payload
Ticket types is a mandatory field! If not sent, ticket types will be deleted. Other fields are optional. Refer to the descriptions above for each field explanations.
Note: when updating the total amount of tickets in ticket_types
, use amount
instead of amount_total
Important: provide pk
to edit the ticket, otherwise it is going to be overriden or deleted.
ticket_types
structure:
{
"pk": 13,
"title": "Free ticket",
"price": 0,
"active": true,
"amount": 100,
"amount_sold": 0,
"amount_total": 100,
"is_members_only": false,
"description": null,
"start_date": null,
"sort_id": null
}
Delete event
curl -X DELETE https://test.ticketbutler.io/api/v3/events/<event_uuid>/ \
-H 'Authorization: Token ticketbutler-auth-token'
-H 'Content-Type: application/json'
-d @data.json
The above command uses object data.json with JSON structured like this:
{
"delete_reason": "A valid reason goes here"
}
HTTP Request
DELETE https://test.ticketbutler.io/api/v3/events/<event_uuid>/
Query parameters
event_uuid: unique event identifier, hex format
JSON payload
delete_reason: Text that will be sent when sending out event cancelled emails. Min lenght=5
Ticket types
The following section describe the use of ticket types.
Get event ticket types
curl https://test.ticketbutler.io/api/v3/events/01d46daed83b41e3b71f3790a37549e0/ticket-types/
-H 'Authorization: Token ticketbutler-auth-token' \
-H 'Content-Type: application/json'
The above command returns json formatted as following:
[
{
"pk": 18,
"uuid": "b5ebf80886c44b88842a7df6e1a329f9",
"title": "Free ticket",
"price": 0,
"active": true,
"amount": 100,
"amount_sold": 0,
"amount_total": 100,
"constraint_definition": null,
"is_tickets_sold": false,
"invoice_price": null,
"price_verbose": "gratis",
"is_free": true,
"sold_out": false,
"is_members_only": false,
"description": null,
"start_date": null,
"fee": 3.9,
"sort_id": null
}
]
Request
GET https://test.ticketbutler.io/api/v3/events/<uuid>/ticket-types/
URL parameters
uuid: Unique event identifier in hex
format.
Create Ticket Type
curl -X POST https://test.ticketbutler.io/api/v3/events/01d46daed83b41e3b71f3790a37549e0/ticket-types/ \
-H 'Authorization: Token ticketbutler-auth-token' \
-H 'Content-Type: application/json'
-d @new_ticket_type.json
The above command required the
new_ticket_type.json
file structures as:
{
"title": "Sample ticket",
"price": 0,
"amount_total": 100,
"is_members_only": false,
}
The above command returns the following response:
{
"uuid": "6a547b3c0bde434aa595bfb37b4f2851",
"title": "Sample ticket",
"price": 0,
"amount": 100,
"amount_total": 100,
"is_members_only": false,
"is_free": true,
"amount_sold": 0
}
HTTP Request
POST https://test.ticketbutler.io/api/v3/events/<event_uuid>/ticket-types/
URL Parameters
event_uuid: unique event identifier the ticket will be attached to
JSON Payload
title: naming for the ticket type
price: the price the ticket will be sold for. Send 0
to make it free.
amount_total: amount of tickets available in total
is_members_only: is ticket available only for team members. (optional, default=false
)
Get Specific Ticket Type
curl https://test.ticketbutler.io/api/v3/events/01d46daed83b41e3b71f3790a37549e0/ticket-types/01d46daed83b41e3b71f3790a37549e0/ \
-H 'Authorization: Token ticketbutler-auth-token' \
-H 'Content-Type: application/json'
The above comand returns the following response:
{
"uuid": "01d46daed83b41e3b71f3790a37549e0",
"title": "Sample ticket",
"price": 0,
"amount": 100,
"amount_total": 100,
"is_members_only": false,
"is_free": true,
"amount_sold": 0
}
HTTP Request
GET https://test.ticketbutler.io/api/v3/events/<event_uuid>/ticket_types/<ticket_type_uuid>/
URL Parameters
event_uuid: unique event identifier
ticket_type_uuid: unique ticket type identifier
Update Ticket Type
curl -X PATCH https://test.ticketbutler.io/api/v3/events/01d46daed83b41e3b71f3790a37549e0/ticket-types/01d46daed83b41e3b71f3790a37549e0/
-H 'Authorization: Token ticketbutler-auth-token' \
-H 'Content-Type: application/json'
-d @ticket_type.json
The above command requires
ticket_type.json
file structured as:
{
"title": "Best ticket",
"price": 0,
"amount": 50,
}
And it returns the following result:
{
"uuid": "01d46daed83b41e3b71f3790a37549e0",
"title": "Best ticket",
"price": 0,
"amount": 50,
"amount_total": 51,
"is_members_only": false,
"is_free": true,
"amount_sold": 1
}
HTTP Response
GET https://test.ticketbutler.io/api/v3/events/<event_uuid>/ticket-types/<ticket_type_uuid>/
URL Parameters
event_uuid: unique event identifier
ticket_type_uuid: unique ticket type identifier
JSON Payload
title: naming for the ticket type (optional)
price: the price the ticket will be sold for. Send 0
to make it free. If a ticket has been sold, it cannot be updated (optional)
amount_total: amount of tickets in total. Has to be more than sold. (optional)
amount: amountn of tickets available. Has to be more than sold. (optional)
is_members_only: is ticket available only for team members. (optional, default=false
)
Note: If you provide amount
, the amount_total
will be automatically calculcated. If both fields provided, amount_total
will be ignored.
Response
The request returns updated ticket_type
object.
Delete Ticket type
curl -X DELETE https://test.ticketbutler.io/api/v3/events/01d46daed83b41e3b71f3790a37549e0/ticket-types/01d46daed83b41e3b71f3790a37549e0/
-H 'Authorization: Token ticketbutler-auth-token' \
-H 'Content-Type: application/json'
HTTP Request
DELETE https://test.ticketbutler.io/api/v3/events/<event_uuid>/ticket-types/<ticket_type_uuid>/
URL Parameters
event_uuid: unique event identifier
ticket_type_uuid: unique ticket type identifier
Response
This API endpoints returns either empty 200 OK
response or 400 BAD REQUEST
with explanation.
Data Collection
The following section describe the use of data collection for your events.
Questions are seperated into collections and there are two types of collections:
-
Ticket Type question collection
-
Purchase question collection
Collecting data
Please refer to order data collection or ticket data collection.
Get Ticket Type Questions
curl https://test.ticketbutler.io/api/v3/events/887d9eb1bd1d400490deead624269b22/ticket-type-questions/ \
-H 'Authorization: Token ticketbutler-auth-token'
The above command will produce the following JSON response:
{
"uuid": "dd7147bf99744728ba0a7bae6fb13f58",
"active": true,
"questions": [
{
"uuid": "907f76ba4a2d444ab700aa942df751f4",
"sort_id": 0,
"heading": "Hello world",
"active": true,
"required": true,
"variation": "TEXT",
"choices": []
},
{
"uuid": "ccb2d0a70a3e41248561c3535a96d62e",
"sort_id": 1,
"heading": "Choice",
"active": true,
"required": true,
"variation": "SELECT",
"choices": [
{
"uuid": "7bfaca169164478b8bad88bda1737747",
"sort_id": 0,
"label": "Blah",
"description": null
},
{
"uuid": "5d218d8067be4272b85e27a7ea96e2ff",
"sort_id": 1,
"label": "Bah",
"description": null
}
]
}
]
}
HTTP Request
GET https://test.ticketbutler.io/api/v3/events/<event_uuid>/ticket-type-questions/
URL Parameters
event_uuid: Unique event identifier in hex
format.
Get Purchase Questions
curl https://test.ticketbutler.io/api/v3/events/887d9eb1bd1d400490deead624269b22/purchase-questions/ \
-H 'Authorization: Token ticketbutler-auth-token'
The above command will produce a result structured as follows:
{
"uuid": "89c0c918bf1a42fa906b75b4fc7c9878",
"active": true,
"questions": [
{
"uuid": "e43d798c2c954493bafebeea357ff35b",
"sort_id": 0,
"heading": "Guess a number",
"active": true,
"required": false,
"variation": "NUMBER",
"choices": []
}
]
}
HTTP Request
GET https://test.tickdtbutler.io/api/v3/events/<event_uuid>/purchase-questions/
URL Parameters
event_uuid: Unique event identifier in hex
format.
Create/Update Ticket Type Questions
curl -X POST https://test.ticketbutler.io/api/v3/events/887d9eb1bd1d400490deead624269b22/ticket-type-questions/ \
-H 'Authorization: Token ticketbutler-auth-token' \
-H 'Content-Type: application/json' \
-d questions.json
The above command requires
questions.json
file structures as:
{
"questions": [
{
"uuid":"ba47cf1896944d879300e7611f539afa",
"sort_id":1,
"heading":"Already existing question",
"active":true,
"required":false,
"variation":"TEXT",
"choices":[]
},
{
"new":true,
"variation":"TEXT",
"sort_id":1,
"ticket_type":"all",
"heading":"New question"
}
]
}
Example output:
{
"questions": [
{
"uuid": "ba47cf1896944d879300e7611f539afa",
"sort_id": 1,
"heading": "Already existing question",
"active": true,
"required": false,
"variation": "TEXT",
"choices": []
},
{
"uuid": "1bcc415f8de046b6b8e8468e67d0601e",
"sort_id": 1,
"heading": "New question",
"active": true,
"required": false,
"variation": "TEXT",
"choices": []
}
]
}
Use the same request to update/create new questions.
HTTP Request
POST https://test.ticketbutler.io/api/v3/events/<event_uuid>/ticket-type-questions/
URL Parameters
event_uuid: Unique event identifier in hex
format.
JSON Payload
Always provide all the previous questions with their UUIDs, otherwise they will be removed!
uuid (optional): unique question identifier. If ommited, the question will be removed and replaced with a new one.
sort_id: position the question will appear when collecting data
heading: the displayed question when collecting data from the user
active: should the question be asked
variation: question type. Choices can be:
TEXTAREA
TEXT
SELECT
SELECT_MULTIPLE
CHECKBOX
NUMBER
NAME
COMPANY
EMAIL
choices: if selected variation
is either SELECT
or SELECT_MULTIPLE
provide the options here in the format:
[
{
"sort_id": 0,
"label": "Option",
"uuid": "9edeb863aa6e464aa4e03ce4a8bda976"
}
]
UUID is not a mandatory field. If options already exists, but they are not provided in the array, they will be removed!
Get Specific Question
curl https://test.ticketbutler.io/api/v3/events/887d9eb1bd1d400490deead624269b22/questions/1bcc415f8de046b6b8e8468e67d0601e/ \
-H 'Authorization: Token ticketbutler-auth-token'
The above command will return the following:
{
"uuid": "1bcc415f8de046b6b8e8468e67d0601e",
"sort_id": 1,
"heading": "New Question",
"active": false,
"required": false,
"variation": "TEXT",
"choices": []
}
HTTP Request
GET https://test.ticketbutler.io/api/v3/events/<event_uuid>/questions/<question_uuid>/
URL Parameters
event_uuid: Unique event identifier in hex
format.
question_uuid: Unique question identifier in hex
format.
Update Specific Question
curl -X PATCH https://test.ticketbutler.io/api/v3/events/887d9eb1bd1d400490deead624269b22/questions/1bcc415f8de046b6b8e8468e67d0601e/ \
-H 'Authorization: Token ticketbutler-auth-token'
-H 'Content-Type: application/json'
-d @updated_question.json
The above command requires
updated_question.json
file structured as:
{
"sort_id": 2,
"heading": "Change Question Heading",
"active": true,
"required": true,
"variation": "TEXT",
"choices": []
}
Example output:
{
"uuid": "1bcc415f8de046b6b8e8468e67d0601e",
"sort_id": 2,
"heading": "Change Question Heading",
"active": true,
"required": true,
"variation": "TEXT",
"choices": []
}
HTTP Request
PATCH https://test.ticketbutler.io/api/v3/events/<event_uuid>/questions/<question_uuid>/
URL Parameters
event_uuid: unique event identifier in hex
format
question_uuid: unique question identifier in hex
format
JSON Payload
Please refer to updating questions in bulk
Delete specific question
curl -X DELETE https://test.ticketbutler.io/api/v3/events/887d9eb1bd1d400490deead624269b22/questions/1bcc415f8de046b6b8e8468e67d0601e/ \
-H 'Authorization: Token ticketbutler-auth-token'
The above command will return empty
200 OK
response if request was successful.
To see more about adding/updating/deleting questions, please refer to updating questions in bulk
HTTP Request
DELETE https://test.ticketbutler.io/api/v3/events/<event_uuid>/questions<question_uuid>/
URL Parameters
event_uuid: unique event identifier in hex
format
question_uuid: unique question identifier in hex
format
Orders
In general to place an order you first need to know what event you’re attaching the order, for this see the Events endpoints. The order placed needs to be paid for, where the payment can be skipped by configuring the event as a free event or a variation of external payments not done directly via Ticketbutler. E.g. an order can be paid for by predefined vouchers (emailed to [email protected]) or an invoice will be send from an external accounting system.
Example flow
The following flow describe how to use the API to create an order where it’s paid for by a voucher. Prior this, an event is creted via the dashboard and the vouchers are uploaded to the event.
- Get all events via the API.
- Find the UUID of the event you want to place an order in.
- With the UUID from 2. get the details for the specific event via the API.
- Find the UUID of the ticket type(s) the order should contain.
- With the UUID from 4. and order details as an JSON object, place the order via the API.
- If everything went well, an email is automatically send to the email in the order details.
This flow is one example on how this can be done via the Ticketbutler API. It is e.g. the same if the event is configured to be free, payment by invoice or Stripe externally.
Create Order
curl -X POST https://test.ticketbutler.io/api/v3/orders/ \
-H 'Authorization: Token ticketbutler-auth-token' \
-H "Content-Type: application/json" \
-d @order_new.json
The above command uses object
order_new.json
with JSON structured like this:
{
"event":"887d9eb1bd1d400490deead624269b22",
"address": {
"first_name": "John",
"last_name": "Doe",
"email": "[email protected]",
"phone": "42424242"
},
"ticket_types": [
{
"uuid": "5025811e9d8346379d1db8a332909d0b",
"amount": 1
}
],
"external_order_id": "Rdasf32lkj12X"
}
The above command returns JSON structured like this:
{
"address":{
"first_name":"John",
"last_name":"Doe",
"phone":"42424242",
"email":"[email protected]"
},
"uuid":"8fe33ab1934e46aebbdd2d9ff0a66e41",
"order_id":"Jca161",
"external_order_id": "Rdasf32lkj12X",
"email":"[email protected]",
"state":"PAID",
"created":"2019-06-03T01:09:45.615201+02:00",
"organizer_absorb_fees":false,
"refunded":false,
"event":{
"uuid":"887d9eb1bd1d400490deead624269c13",
"title":"custom ticket",
"start_date":"2019-06-30T13:45:00+02:00"
},
"ticket_pdf_absolute_url":"https://test.ticketbutler.io/da/purchase/8fe33ab1934e46aebbdd2d9ff0a66e41/tickets-as-pdf/",
"state_verbose":"PAID"
}
This endpoint creates an order.
HTTP Request
POST https://test.ticketbutler.io/api/v3/orders/
JSON Payload
event: The UUID of the event to create an order
address: Details on the person creating the order e.g. first name, last name and email.
The address include the following:
{
“first_name”: <STRING>
,
“last_name”: <STRING>
,
“email”: <EMAIL>
,
“phone”: <STRING> (Optional)
}
ticket_types: A list of ticket types and amount of each to place for the order.
The is as following:
[{“uuid”: <UUID-STRING>
, “amount”: <NUMBER>
}]
external_order_id: (Optional) Reference to this order provided externally from this sytem.
RESPONSE
A JSON object with description of the order created.
ERRORS
Errors specific to creating an order are as follows:
Error Code | Meaning |
---|---|
400 | Insufficient tickets available |
400 | Insufficient vouchers available |
400 | Event expired |
400 | Order details insufficient |
The above errors have attached messages in the body and HTTP status codes in the header.
Get a Specific Order
curl -X GET https://test.ticketbutler.io/api/v3/orders/8fe33ab1934e46aebbdd2d9ff0a66e41/ \
-H 'Authorization: Token ticketbutler-auth-token'
The above command returns JSON structured like this:
{
"address":{
"first_name":"John",
"last_name":"Doe",
"phone":"42424242",
"email":"[email protected]"
},
"uuid":"8fe33ab1934e46aebbdd2d9ff0a66e41",
"order_id":"Jca161",
"email":"[email protected]",
"state":"PAID",
"created":"2019-06-03T01:09:45.615201+02:00",
"organizer_absorb_fees":false,
"refunded":false,
"event":{
"uuid":"887d9eb1bd1d400490deead624269c13",
"title":"custom ticket",
"start_date":"2019-06-30T13:45:00+02:00"
},
"ticket_pdf_absolute_url":"https://test.ticketbutler.io/da/purchase/8fe33ab1934e46aebbdd2d9ff0a66e41/tickets-as-pdf/",
"state_verbose":"PAID"
}
This endpoint retrieves a specific order.
HTTP Request
GET https://test.ticketbutler.io/api/v3/orders/<UUID>/
URL Parameters
Parameter | Description |
---|---|
UUID | The UUID of the order to retrieve |
Get events orders
curl https://test.ticketbutler.io/api/v3/events/887d9eb1bd1d400490deead624269b22/orders/
-H 'Authorization: Token Token ticketbutler-auth-token' \
-H 'Content-Type: application/json'
The above command produces the following JSON:
{
"uuid": "5217f0ee68fb45e5ae56113227ee169b",
"orders": [
{
"uuid": "66903ee51840422e888ad2d318f969d7",
"order_id": "dZy1",
"currency": "DKK",
"order_lines": [
{
"uuid": "84e5a220fda84cc9ba1acc570fd658df",
"discount_total": null,
"has_ticket_type_date": false,
"ticket_type_date": "2019-10-21T08:45:00Z",
"quantity": 3,
"title": "Free tickets",
"price": "0.00",
"total": "0.00",
"type": "ticket"
}
],
"state": "PAID",
"date": "2019-10-14T08:25:08.306841Z",
"vat_exempt": false,
"vat_rate": "25",
"address": {
"first_name": "First",
"last_name": "Last Name",
"email": "[email protected]",
"phone": "42424242"
},
"tickets": [
{
"id": 1,
"uuid": "bd446b152bc543d89d0e8b273ae1f248",
"external_uuid": null,
"checked_in": false,
"ticket_refund": false,
"full_name": "First Last Name",
"ticket_type_pk": 3,
"ticket_type_name": "Free tickets",
"has_ticket_type_date": false,
"ticket_type_date": "2019-10-21T08:45:00Z",
"purchase_uuid": "66903ee51840422e888ad2d318f969d7",
"email": "[email protected]",
"questions": []
},
{
"id": 2,
"uuid": "98327e7b522742df9ce504e016898949",
"external_uuid": null,
"checked_in": false,
"ticket_refund": false,
"full_name": "First Last Name",
"ticket_type_pk": 3,
"ticket_type_name": "Free tickets",
"has_ticket_type_date": false,
"ticket_type_date": "2019-10-21T08:45:00Z",
"purchase_uuid": "66903ee51840422e888ad2d318f969d7",
"email": "[email protected]",
"questions": []
},
{
"id": 3,
"uuid": "e5e30e25ea8a440cb207896418d7c041",
"external_uuid": null,
"checked_in": false,
"ticket_refund": false,
"full_name": "First Last Name",
"ticket_type_pk": 3,
"ticket_type_name": "Free tickets",
"has_ticket_type_date": false,
"ticket_type_date": "2019-10-21T08:45:00Z",
"purchase_uuid": "66903ee51840422e888ad2d318f969d7",
"email": "[email protected]",
"questions": []
}
]
}
]
}
This endpoint retrieves all orders made for the event
HTTP Request
GET https://test.ticketbutler.io/api/v3/events/<UUID>/orders/
URL Parameters
Parameter | Description |
---|---|
UUID | The UUID of the event to retrieve |
Update order
curl -X PATCH https://test.ticketbutler.io/api/v3/orders/887d9eb1bd1d400490deead624269b22/ \
-H 'Authorization: Token ticketbutler-auth-token' \
-H 'Content-Type: application/json' \
-d @order_new.json
The above command requires the following
.json
file.
{
"address": {
"first_name": "First",
"last_name": "Last",
"title": "Developer",
"venue": "Ticketbutler",
"business_name": "Ticketbutler",
"cvr": "123456",
"street": "Street name 1",
"city": "Copenhagen",
"postcode": 2000,
"country": "Denmark",
"phone": "42424242",
"email": "[email protected]"
}
}
The above request produces the following result:
{
"address": {...},
"uuid": "9572227c20e14c7a9e15c778cfeb3e9a",
"user": {...},
"id": 3,
"identifier": 3,
"email": "[email protected]",
"state": "REFUND",
"created": "2019-10-14T15:02:03.308296+02:00",
"full_name": "This is awesome Last Name",
"purchase_is_free": true,
"organizer_absorb_fees": false,
"fee_amount": 0,
"fee_percentage": "0.00",
"fee_total": "0.00",
"first_name": "This is awesome",
"order_id": "dZy3",
"external_order_id": null,
"total_and_all_fees_decimal": 0,
"total_amount": 3,
"vat_total": "0.00",
"fee_total_vat": "0.00",
"send_sms_tickets": false,
"fee_per_sms": 5,
"discount_code": null,
"refund_date": "2019-10-14T15:02:23.112952+02:00",
"refund_email_send": "2019-10-14T15:02:23.177217+02:00",
"refund_url": "/api/purchases/9572227c20e14c7a9e15c778cfeb3e9a/refund/",
"refunded": true,
"event": {...},
"ticket_download_url": "/da/purchase/9572227c20e14c7a9e15c778cfeb3e9a/tickets-download/",
"ticket_download_absolute_url": "http://localhost:8000/da/purchase/9572227c20e14c7a9e15c778cfeb3e9a/tickets-download/",
"ticket_pdf_url": "/da/purchase/9572227c20e14c7a9e15c778cfeb3e9a/tickets-as-pdf/",
"ticket_pdf_absolute_url": "http://localhost:8000/da/purchase/9572227c20e14c7a9e15c778cfeb3e9a/tickets-as-pdf/",
"receipt_as_web_url": "/da/purchase/9572227c20e14c7a9e15c778cfeb3e9a/reciept-as-web/",
"earliest_date": "2019-10-21T08:45:00Z",
"customer_id": null,
"payment_method_id": null,
"pay_by_invoice": false,
"state_verbose": "REFUNDED"
}
HTTP Request
PATCH https://test.ticketbutler.io/api/v3/orders/<order_uuid>/
JSON Payload
Send the address component as ilustrated on the right.
Refund an order
curl -X DELETE https://test.ticketbutler.io/api/v3/orders/887d9eb1bd1d400490deead624269b22/ \
-H 'Authorization: Token ticketbutler-auth-token' \
-H 'Content-Type: application/json'
The above request produces the following result:
{
"purchase": {
"address": {...},
"uuid": "9c41c64801714b9b8934586131fb3a7b",
"user": {...},
"id": 2,
"identifier": 2,
"email": "[email protected]",
"state": "PAID",
"created": "2019-10-14T11:45:52.291073+02:00",
"full_name": "Rimvydas Zilinskas",
"purchase_is_free": true,
"organizer_absorb_fees": false,
"fee_amount": 0,
"fee_percentage": "0.00",
"fee_total": "0.00",
"first_name": "Rimvydas",
"order_id": "dZy2",
"external_order_id": null,
"total_and_all_fees_decimal": 0,
"total_amount": 1,
"vat_total": "0.00",
"fee_total_vat": "0.00",
"send_sms_tickets": false,
"fee_per_sms": 5,
"discount_code": null,
"refund_date": null,
"refund_email_send": null,
"refund_url": "/api/purchases/9c41c64801714b9b8934586131fb3a7b/refund/",
"refunded": false,
"event": {...},
"earliest_date": "2019-10-21T08:45:00Z",
"customer_id": null,
"payment_method_id": null,
"pay_by_invoice": false,
"state_verbose": "PAID"
},
"is_refunded": true,
"is_refundable": true
}
HTTP Request
DELETE https://test.ticketbutler.io/api/v3/orders/<order_uuid>/
URL parameters
order_id: Unique order identifier
Response
If the order has already been refunded you will receive a 400 Bad Request
response.
If you do not have sufficient rights, it will return a 401 Unauthorized
response.
Collect Order Data
curl -X POST https://test.ticketbutler.io/api/v3/orders/8fe33ab1934e46aebbdd2d9ff0a66e41/questions/
-H 'Authorization: Token ticketbutler-auth-token'
-H 'Content-Type: application/json'
-d @data.json
The above command requires
data.json
file with the following structure:
[
{
"uuid": "0b4db2cc5cd341bb909fbef25faa5da1",
"value": "Girls!"
},
{
"uuid": "e3cf1eafe67940babc77262ae51bbc74",
"value": ["9600a47e5f4747eab3612ca68ea7a5df"]
}
]
The above command produces the following result:
{
"purchase": "0a7d7f04d1b84eb189d813e0f611c90a",
"answers": [
{
"uuid": "6b14536276a2481fa1a0a992dec97b53",
"question": "0b4db2cc5cd341bb909fbef25faa5da1",
"variation": "TEXT",
"question_heading": "Who runs the world",
"answer_value": "It i!",
"answered_choices": []
},
{
"uuid": "3e56230222934e07b34970fc0b10427f",
"question": "e3cf1eafe67940babc77262ae51bbc74",
"variation": "SELECT_MULTIPLE",
"question_heading": "We will",
"answer_value": "",
"answered_choices": [
{
"uuid": "9600a47e5f4747eab3612ca68ea7a5df",
"choice_heading": "Rock you"
}
]
}
]
}
Endpoint for storing answer data from the order. To see all the purchase questions please refer to retrieving purchase questions
HTTP Request
POST https://test.ticketbutler.io/api/v3/orders/<order_uuid>/questions/
URL Parameters
order_uuid: unique order identifier generated when creating the order.
JSON payload
JSON payload has to be an array of objects!
uuid: unique question identifier, please refer to retrieving questions to get the UUIDs.
value: unique identifier for the answer choice or the answer value. Questions with the following types will use the string value of the value
field.
TEXTAREA TEXT NUMBER NAME COMPANY EMAIL
Questions with the following will try parsing the UUID and will throw exceptions if the values are not valid UUIDs:
SELECT SELECT_MULTIPLE
SELECT_MULTIPLE
requires that values would be enclosed into an array ([]
).
Notes
If the question is already answered and not included in the payload it will not be changed.
If a question with multiple choices is added with, all the previous selections will be deselected
Get Collected Data from order
curl https://test.ticketbutler.io/api/v3/orders/8fe33ab1934e46aebbdd2d9ff0a66e41/questions/
-H 'Authorization: Token ticketbutler-auth-token'
The above command will produce the following result:
{
"purchase": "0a7d7f04d1b84eb189d813e0f611c90a",
"answers": [
{
"uuid": "6b14536276a2481fa1a0a992dec97b53",
"question": "0b4db2cc5cd341bb909fbef25faa5da1",
"variation": "TEXT",
"question_heading": "Who runs the world",
"answer_value": "It i!",
"answered_choices": []
},
{
"uuid": "3e56230222934e07b34970fc0b10427f",
"question": "e3cf1eafe67940babc77262ae51bbc74",
"variation": "SELECT_MULTIPLE",
"question_heading": "We will",
"answer_value": "",
"answered_choices": [
{
"uuid": "9600a47e5f4747eab3612ca68ea7a5df",
"choice_heading": "Rock you"
}
]
}
]
}
HTTP Request
GET https://test.ticketbutler.io/api/v3/orders/<order_uuid>/questions/
URL Parameters
order_uuid: unique order identifier generated when creating the order.
Discount codes
The following section describe how to interact with discounts codes which are related to an event.
If you’re looking for discount codes across the platform see Generic Discount Codes find the relevant details.
To interact with discount codes you first need to know what event you are attaching the discount codes to. See Events endpoints to find the relevant details.
Create a discount code
curl -X POST https://test.ticketbutler.io/api/v3/5cfec30f741045e884000469431dca50/discount-code/ \
-H 'Authorization: Token ticketbutler-auth-token' \
-H 'Content-Type: application/json' \
-d @discount_code_new.json
The above command requires a
discount_code_new.json
file with the following structure:
[
{
"amount": "1000.00",
"code": "hello_world",
"usage_tickets_limit": 1,
"discount_type": "PER_TICKET"
}
]
And it produces the following result:
[
{
"id": 8,
"active": true,
"amount": "1000.00",
"code": "hello_world",
"toggle_url": "/api/event/5cfec30f741045e884000469431dca50/discount-code/8/",
"usage_tickets_limit": 1,
"amount_times_applied": 0,
"discount_type": "PER_TICKET"
}
]
HTTP request
POST https://test.ticketbutler.io/api/v3/events/<event_uuid>/discount-code/
URL parameters
event_uuid: unique event identifier
JSON payload
amount: numeric amount the discount gives
code: code the user will have to enter to receive the code
usage_tickets_limit: how many tickets can the discount be applied to
ticket_type_uuid (optional): apply the discount code only for specific ticket types. UUID has to be in hex format
Get event discount codes
This endpoint retrieves all discount codes tied to the event.
curl -X GET https://test.ticketbutler.io/api/v3/5cfec30f741045e884000469431dca50/discount-code/ \
- H 'Authorization: Token ticketbutler-auth-token' \
- H 'Content-Type: application/json'
The above command produces the following result:
[
{
"id": 2,
"active": true,
"amount": "1000.00",
"code": "hello_world",
"toggle_url": "/api/event/5cfec30f741045e884000469431dca50/discount-code/1/",
"usage_tickets_limit": 1,
"amount_times_applied": 0,
"discount_type": "PER_TICKET",
"ticket_type_uuid": "6e11de9ef2d84b9daf68b1ecfe75baaf"
},
{
"id": 1,
"active": true,
"amount": "1000.00",
"code": "hello_world",
"toggle_url": "/api/event/5cfec30f741045e884000469431dca50/discount-code/1/",
"usage_tickets_limit": 1,
"amount_times_applied": 0,
"discount_type": "PER_TICKET"
}
]
URL parameters
event_uuid: unique event identifier. Has to be in hex format.
Response
If a discount code is tied to a ticket type, then ticket_type_uuid
will appear on the list as well.
Toggle discount code
This endpoints toggles the state of discount code to active/inactive
.
curl -X POST https://test.ticketbutler.io/api/v3/5cfec30f741045e884000469431dca50/discount-code/1/ \
- H 'Authorization: Token ticketbutler-auth-token' \
- H 'Content-Type: application/json'
The above request produces the following response:
{
"id": 7,
"active": true,
"amount": "1000.00",
"code": "hello_world",
"toggle_url": "/api/event/5cfec30f741045e884000469431dca50/discount-code/1/",
"usage_tickets_limit": 1,
"amount_times_applied": 0,
"discount_type": "PER_TICKET",
"ticket_type_uuid": "6e11de9ef2d84b9daf68b1ecfe75baaf"
}
Request
POST https://test.ticketbutler.io/api/v3/<event_uuid>/discount-code/<code_id>/
URL parameters
event_uuid: unique event identifier. Has to be in hex format.
code_id: primary key of discount code. Has to be in numeric representation.
Delete discount codes
curl -X DELETE https://test.ticketbutler.io/api/v3/5cfec30f741045e884000469431dca50/discount-code/1/
-H 'Authorization: Token ticketbutler-auth-token' \
-H 'Content-Type: application/json'
The above comman produces returns response status 200 OK, 404 the discount code was not found or already used.
Request
DELETE https://test.ticketbutler.io/api/v3/<event_uuid>/discount-code/<code_id>/
URL parameters
event_uuid: unique event identifier. Has to be in hex format.
code_id: primary key of discount code. Has to be in numeric representation.
Generic Discount codes
The following section describe how to interact with discounts codes which are available across all events. This is a powerfull type of discount code which should be used with special consideration. In some cases you might have multiple events which have the same discount codes, where you would like to have those discount codes only used a certain amount of times. E.g. a sponsor can receive a discount code of value 100% to any day of a 3 day festival.
Create a discount code
curl -X POST https://test.ticketbutler.io/api/v3/discount-code/ \
-H 'Authorization: Token ticketbutler-auth-token' \
-H 'Content-Type: application/json' \
-d @discount_code_new.json
The above command requires a
discount_code_new.json
file with the following structure:
[
{
"amount": "1000.00",
"code": "hello_world",
"usage_tickets_limit": 1,
"discount_type": "PER_TICKET"
}
]
And it produces the following result:
[
{
"id": 8,
"active": true,
"amount": "1000.00",
"code": "hello_world",
"toggle_url": "/api/event/discount-code/8/",
"usage_tickets_limit": 1,
"amount_times_applied": 0,
"discount_type": "PER_TICKET"
}
]
HTTP request
POST https://test.ticketbutler.io/api/v3/discount-code/
JSON payload
amount: numeric amount the discount gives
code: code the user will have to enter to receive the code
usage_tickets_limit: how many tickets can the discount be applied to
ticket_type_uuid (optional): apply the discount code only for specific ticket types. UUID has to be in hex format
Get discount codes
This endpoint retrieves all discount codes tied to the platform.
curl -X GET https://test.ticketbutler.io/api/v3/discount-code/ \
- H 'Authorization: Token ticketbutler-auth-token' \
- H 'Content-Type: application/json'
The above command produces the following result:
[
{
"id": 2,
"active": true,
"amount": "1000.00",
"code": "hello_world",
"toggle_url": "/api/discount-code/1/",
"usage_tickets_limit": 1,
"amount_times_applied": 0,
"discount_type": "PER_TICKET",
"ticket_type_uuid": "6e11de9ef2d84b9daf68b1ecfe75baaf"
},
{
"id": 1,
"active": true,
"amount": "1000.00",
"code": "hello_world",
"toggle_url": "/api/event/5cfec30f741045e884000469431dca50/discount-code/1/",
"usage_tickets_limit": 1,
"amount_times_applied": 0,
"discount_type": "PER_TICKET"
}
]
Response
If a discount code is tied to a ticket type, then ticket_type_uuid
will appear on the list as well.
Toggle discount code
This endpoints toggles the state of discount code to active/inactive
.
curl -X POST https://test.ticketbutler.io/api/v3/discount-code/1/ \
- H 'Authorization: Token ticketbutler-auth-token' \
- H 'Content-Type: application/json'
The above request produces the following response:
{
"id": 7,
"active": true,
"amount": "1000.00",
"code": "hello_world",
"toggle_url": "/api/discount-code/1/",
"usage_tickets_limit": 1,
"amount_times_applied": 0,
"discount_type": "PER_TICKET",
"ticket_type_uuid": "6e11de9ef2d84b9daf68b1ecfe75baaf"
}
Request
POST https://test.ticketbutler.io/api/v3/discount-code/<code_id>/
URL parameters
code_id: primary key of discount code. Has to be in numeric representation.
Delete discount codes
curl -X DELETE https://test.ticketbutler.io/api/v3/discount-code/1/
-H 'Authorization: Token ticketbutler-auth-token' \
-H 'Content-Type: application/json'
The above command produces returns response status 200 OK, 404 the discount code was not found or already used.
Request
DELETE https://test.ticketbutler.io/api/v3/discount-code/<code_id>/
URL parameters
code_id: primary key of discount code. Has to be in numeric representation.
Tickets
The following section describes how to interact with tickets.
Get event tickets
Returns all the tickets purchased for the event.
curl -X GET https://test.ticketbutler/io/api/v3/events/5cfec30f741045e884000469431dca50/tickets/ \
-H 'Authorization: Token ticketbutler-auth-token' \
-H 'Content-Type: application/json'
The above command produces the following result:
[
{
"id": 1121,
"uuid": "957e996e16d94aff959800a03bf8c726",
"checked_in": false,
"ticket_refund": false,
"full_name": "John Doe",
"ticket_type_pk": 40,
"ticket_type_name": "Ticket name",
"has_ticket_type_date": false,
"ticket_type_date": "2019-10-20T14:00:00Z",
"purchase_uuid": "a925fcd275734032806f44c76133995d",
"email": "[email protected]"
},
{
"id": 1120,
"uuid": "293ba402a7354bb4be8bee544a188cb5",
"checked_in": false,
"ticket_refund": false,
"full_name": "John Doe",
"ticket_type_pk": 40,
"ticket_type_name": "Ticket name",
"has_ticket_type_date": false,
"ticket_type_date": "2019-10-20T14:00:00Z",
"purchase_uuid": "188e722af9a243018525fa5979836e7d",
"email": "[email protected]"
}
]
HTTP request
GET https://test.ticketbutler.io/api/v3/events/<event_uuid>/tickets/
Query parameters
event_uuid: unique event identifier
Response
Response will always be a list of ticket objects.
Get specific ticket
curl https://test.ticketbutler.io/api/v3/tickets/957e996e16d94aff959800a03bf8c726/ \
-H 'Authorization: Token ticketbutler-auth-token' \
-H 'Content-Type: application/json'
The above command produces the following result:
{
"id": 1068,
"uuid": "957e996e16d94aff959800a03bf8c726",
"external_uuid": null,
"checked_in": false,
"ticket_refund": false,
"full_name": "John Doe",
"ticket_type_pk": 40,
"ticket_type_name": "Other ticket",
"has_ticket_type_date": false,
"ticket_type_date": "2019-10-20T14:00:00Z",
"purchase_uuid": "729706a9e909485c8055867f251e6239",
"email": "[email protected]",
"url": "http://localhost:8000/t/nz9lb/",
"lead_tracking_reference": null
}
HTTP request
GET https://test.ticketbutler.io/api/v3/tickets/<ticket_uuid>/
Query params
event_uuid: unique ticket identifier. HEX format.
Update ticket details
curl -X PATCH https://test.ticketbutler.io/api/v3/tickets/957e996e16d94aff959800a03bf8c726/ \
-H 'Authorization: Token ticketbutler-auth-token' \
-H 'Content-Type: application/json'
-d @updated_ticket.json
The above command required a
updated_ticket
JSON file structured as shown:
{
"full_name": "Full Name",
"checked_in": true,
"external_uuid": "external_uuid",
"lead_tracking_reference": "127812kjg1278"
}
The command produces the following result:
{
"id": 1068,
"uuid": "957e996e16d94aff959800a03bf8c726",
"external_uuid": "external_uuid",
"checked_in": true,
"ticket_refund": false,
"full_name": "Full Name",
"ticket_type_pk": 40,
"ticket_type_name": "Other ticket",
"has_ticket_type_date": false,
"ticket_type_date": "2019-10-20T14:00:00Z",
"purchase_uuid": "729706a9e909485c8055867f251e6239",
"email": "[email protected]",
"url": "http://localhost:8000/t/nz9lb/",
"lead_tracking_reference": null
}
HTTP Request
PATCH https://test.ticketbutler.io/api/v3/tickets/<uuid>/
URL parameters
uuid: ticket unique identifier in hex
format
JSON payload
full_name (optional): The name displayed on the ticket
checked_in (optional): Ticket checked in status true/false
Collect Ticket Data
Endpoint for storing answers for each seperate ticket.
curl -X POST https://test.ticketbutler.io/api/v3/tickets/bd446b152bc543d89d0e8b273ae1f248/questions/
-H 'Authorization: Token ticketbutler-auth-token'
-H 'Content-Type: application/json'
-d @data.json
The above command requires
data.json
file structured like:
[
{
"uuid": "0b4db2cc5cd341bb909fbef25faa5da1",
"value": "Girls!"
},
{
"uuid": "e3cf1eafe67940babc77262ae51bbc74",
"value": ["9600a47e5f4747eab3612ca68ea7a5df"]
}
]
The above command produces the following result:
{
"ticket": "bd446b152bc543d89d0e8b273ae1f248",
"answers": [
{
"uuid": "6b14536276a2481fa1a0a992dec97b53",
"question": "0b4db2cc5cd341bb909fbef25faa5da1",
"variation": "TEXT",
"question_heading": "Is this real life?",
"answer_value": "Is this just fantasy?",
"answered_choices": []
},
{
"uuid": "3e56230222934e07b34970fc0b10427f",
"question": "e3cf1eafe67940babc77262ae51bbc74",
"variation": "SELECT_MULTIPLE",
"question_heading": "Caught in a landslide",
"answer_value": "",
"answered_choices": [
{
"uuid": "b2dbe84db06c4d58976312233df67eff",
"choice_heading": "No escape from reality"
},
]
}
]
}
HTTP Request
POST https://test.ticketbutler.io/api/v3/tickets/<order_uuid>/questions/
URL Parameters
ticket_uuid: unique ticket identifier generated when creating the order.
JSON payload
JSON payload has to be an array of objects!
uuid: unique question identifier, please refer to retrieving questions to get the UUIDs.
value: unique identifier for the answer choice or the answer value. Questions with the following types will use the string value of the value
field.
TEXTAREA TEXT NUMBER NAME COMPANY EMAIL
Questions with the following will try parsing the UUID and will throw exceptions if the values are not valid UUIDs:
SELECT SELECT_MULTIPLE
SELECT_MULTIPLE
requires that values would be enclosed into an array ([]
).
Notes
If the question is already answered and not included in the payload it will not be changed.
If a question with multiple choices is added with, all the previous selections will be deselected.
Get Collected Ticket Data
curl https://test.ticketbutler.io/api/v3/tickets/bd446b152bc543d89d0e8b273ae1f248/questions/
-H 'Authorization: Token ticketbutler-auth-token'
The above command will produce the following result:
{
"ticket": "bd446b152bc543d89d0e8b273ae1f248",
"answers": [
{
"uuid": "6b14536276a2481fa1a0a992dec97b53",
"question": "0b4db2cc5cd341bb909fbef25faa5da1",
"variation": "TEXT",
"question_heading": "Open your eyes",
"answer_value": "Look up to the skies and see",
"answered_choices": []
},
{
"uuid": "3e56230222934e07b34970fc0b10427f",
"question": "e3cf1eafe67940babc77262ae51bbc74",
"variation": "SELECT_MULTIPLE",
"question_heading": "I'm just a poor boy",
"answer_value": "",
"answered_choices": [
{
"uuid": "b2dbe84db06c4d58976312233df67eff",
"choice_heading": "I need no simpathy"
}
]
}
]
}
HTTP Request
GET https://test.ticketbutler.io/api/v3/tickets/<ticket_uuid>/questions/
URL Parameters
ticket_uuid: unique ticket identifier generated when creating the order.
Get Ticket Specific Questions
Each ticket type might have specific questions to be answered. This endpoint will return all the question relating to the ticket.
curl https://test.ticketbutler.io/api/v3/tickets/bd446b152bc543d89d0e8b273ae1f248/questions/all/
-H 'Authorization: Token ticketbutler-auth-token'
The above command will produce the following result
[
{
"uuid": "f265d98cc0cf4e139400201135d7d058",
"sort_id": 0,
"heading": "Because I'm easy come, easy go",
"active": true,
"required": false,
"variation": "NAME",
"choices": []
},
{
"uuid": "17bd24b567564ee9924f7865ec0e5169",
"sort_id": 1,
"heading": "Little high, little low",
"active": true,
"required": true,
"variation": "TEXT",
"choices": []
}
]
HTTP Request
GET https://test.ticketbutler.io/api/v3/tickets/<ticket_uuid>/questions/
URL Parameters
ticket_uuid: unique ticket identifier generated when creating the order.
Get Unanswered Questions
This endpoint returns the ticket specific questions that have not yet been answered
curl https://test.ticketbutler.io/api/v3/tickets/bd446b152bc543d89d0e8b273ae1f248/questions/unanswered/
-H 'Authorization: Token ticketbutler-auth-token'
The above command will produce the following result
[
{
"uuid": "f265d98cc0cf4e139400201135d7d058",
"sort_id": 0,
"heading": "Any way the wind blows doesn't really matter to me, to me",
"active": true,
"required": false,
"variation": "NAME",
"choices": []
}
]
HTTP Request
GET https://test.ticketbutler.io/api/v3/tickets/<ticket_uuid>/questions/unanswered/
URL Parameters
ticket_uuid: unique ticket identifier generated on creation of order.
Platform Data Exporting
The following endpoints are to support accounting and reporting staff of activities across all the events on the platform.
Get all newsletter signups
curl -X GET https://test.ticketbutler.io/api/v3/whitelabel/newsletters/?format=xlsx \
-H 'Authorization: Token ticketbutler-auth-token'
This produces a Excel spreadsheet
curl -X GET https://test.ticketbutler.io/api/v3/whitelabel/newsletters/?format=json \
-H 'Authorization: Token ticketbutler-auth-token'
This produces a json object
HTTP request
POST https://test.ticketbutler.io/api/v3/whitelabel/newsletters/?format=[xlsx|json]
Response with the following columns as either JSON or Excel spreadsheet
date_joined: When the user came to the platform initally
newsletter_event: The first event the user signed up to the newsletter at
first_name: First name
last_name: Last name
email: Email address
Get Order by Month
This endpoint retrieves all orders for a given month. The endpoint will return 200 and then send an email to
curl -X GET https://test.ticketbutler.io/api/v3/whitelabel/orders/ \
- H 'Authorization: Token ticketbutler-auth-token' \
- H 'Content-Type: application/json'
Query parameters
year: A given year, if not provided current year.
month: A given month, if not provided current month.
email: Email to receive the report if non provided the one setup for receiving accounting emails from the platform.
Sends an email with attached Excel spreadsheet including the following columns
Order ID: Unique ID of the order
Order date: When was the order placed
Status: The current status of the order [PAID, REFUNDED]
Ticket amount: Total value of the tickets
Total order size: Total value of the order
Hereof moms/VAT on ticket amount: What is the VAT of the tickets
Ticket fee substracted the payout: What is the amount paid out excluding service fees
Hereof moms/VAT of ticket fee substracted: VAT of pay out
Event name: The event name the order was placed for
Event ID: The unique event ID the order was placed for
Number of tickets: How many tickets were included in this order
Business name: If a business placed the order what business name is it
Webhooks
The following seciton describe the functionality of Webhooks in Ticketbutler platform.
The webhooks are send according to how they’re setup for the team or across the platform aka. whitelabel. E.g. whenever a purchase is paid. The format of the data is JSON
.
In the following remember to replace the url for your platform and not use “test.ticketbutler.io”. If you need a staging environment we can support you with that.
Don’t hesitate to reach out to the Ticketbutler support team on [email protected] if you need assistance or training.
Webhook structure
When an action is triggered, the Ticketbutler platform will fire off webhooks that are listening to specific changes. The structure of webhook is as follows.
This is an example webhook when an event is updated
{
"id": "28fc84c2-0420-4d26-b805-a18163740bd0",
"uuid": "28fc84c2-0420-4d26-b805-a18163740bd0",
"scope": "team",
"action": "event.updated",
"live": true,
"whitelabel": "Ticketbutler",
"data": {
"uuid": "316225ff-074c-41f6-8f22-6e85d37672e3",
"title": "Testing",
"summary": "",
"description": ""
}
}
This is an example webhook when a user sign up for
{
"uuid": "e2a31221-2761-48db-8a1f-f8f1af919f2q",
"scope": "whitelabel",
"action": "purchase.newsletter",
"live": true,
"whitelabel": "Ticketbutler",
"data": {
"Tickets": [
{
"Ordre ID": "UWb116798",
"Ordredato": "2021-10-22T10:57:52.034176+00:00",
"Status": "NEW",
"Fornavn": "Foo",
"Efternavn": "Bar",
"Telefon": "+4542424242",
"E-mail": "[email protected]",
"Nyhedsbrev": true,
"Billet ID": 123527,
"Billettype": "free",
"Checked ind": false,
"Kommentar": "",
"Text question for each attendee": "Response ticket 1",
"Drop-down for each attendee": "A",
"Type": "TICKET"
},
{
"Ordre ID": "UWb116798",
"Ordredato": "2021-10-22T10:57:52.034176+00:00",
"Status": "NEW",
"Fornavn": "Flip",
"Efternavn": "Flop",
"Telefon": "+4542424242",
"E-mail": "[email protected]",
"Nyhedsbrev": true,
"Billet ID": 123528,
"Billettype": "free",
"Checked ind": false,
"Kommentar": "",
"Text question for each attendee": "Response ticket 2",
"Drop-down for each attendee": "B",
"Type": "TICKET"
}
]
}
}
Actions
We have the following states that will fire off a webhook by our system:
Model | Action | Action name | Description |
---|---|---|---|
All | All | all | When anything is happening in the system notify |
Event | All | event.all | When anything is happening to an event |
Event | Add | event.added | A new event is created |
Event | Update | event.updated | An event is updated |
Event | Remove | event.removed | An event is deleted |
Purchase | All | purchase.all | When anything is happening to a purchase |
Purchase | Paid | purchase.paid | A purchase payment has been finalised |
Purchase | Cancelled | purchase.cancelled | A purchase has been started and cancelled before completion |
Purchase | Refunded | purchase.refunded | A purchase has been refunded |
Purchase | Newsletter | purchase.newsletter | A purchase is paid and the user has signed up for the newsletter |
Ticket | Check-in | ticket.checkin | A ticket has been checked in |
Ticket | Paid | ticket.paid | The ticket has been fully registrered and purchase paid for |
Ticket | Refunded | ticket.refund | The ticket has been cancelled after it was fully registred |
Ticket | Update | ticket.updated | Details of the ticket has been updated e.g. full name or email |
If you have other needs don’t hessitate to reach out to [email protected] to discuss how we can support your usecases.
HTTP Request
Example of request to get all available actions
curl -X GET https://test.ticketbutler.io/webhooks/v1/actions/
-H 'Athorization: Token ticketbutler-auth-token'
This should return a JSON object with a list of available actions
[
"all",
"event.all",
"event.added",
"event.updated",
"event.removed",
"purchase.all",
"purchase.cancelled",
"purchase.newsletter",
"purchase.paid",
"purchase.refunded",
"ticket.checkin"
]
GET https://test.ticketbutler.io/webhooks/v1/actions/
This endpoint return all the actions available to your user. The actions are define in the above section and correspond to when something happens in the system.
Scope
You can choose between two levels of reporting, either team
scoped or whitelabel
scope. The whitelabel
scope entail all actions done across all teams on the whitelabel will fire a webhook. Which one to choose depends
on the use-case of your receiving systems. E.g. you might want to know about all events created across the whitelabel, however, each team have separate CRM or accounting systems and should therefore receive data separately.
NOTE: To manage the Whitelabel scope webhooks you have to be an owner of the Whitelabel. This is not something you can set manually. Contact [email protected] if you’re in about the permission level of your API user.
Test access to the webhooks
To setup a webhook you send HTTP POST
request using any tools (CURL, Insomnia, POSTMAN, …).
For testing out webhooks you can use a service like this https://webhook.site/ (Terms and Privacy applies).
HTTP Request
Example of request to register a URL endpoint for receiving webhooks
curl -X GET https://test.ticketbutler.io/webhooks/v1/
-H 'Athorization: Token ticketbutler-auth-token'
This should return a HTTP response dependent on the status of the request
e.g.
HTTP/1.1 200 OK
or
HTTP/1.1 401 Unauthorized
GET https://test.ticketbutler.io/webhooks/v1/
This endpoint ensure there is access to the webhooks with the user corresponding to the API Token you’re using. It is a good place to start to ensure you have the format of the request right where we often see the authorisation header needs adjustments to allow access to the webhooks API.s
Whitelabel Create Webhook
HTTP Request
Example of request to register a URL endpoint for receiving webhooks for the whole whitelabel
curl -X POST https://test.ticketbutler.io/webhooks/v1/whitelabel/hooks/
-H 'Athorization: Token ticketbutler-auth-token'
-H 'Content-Type: application/json'
-d @new_webhook.json
NOTE: The above command uses object new_webhook.json with JSON structure like this:
{
"url": "URL",
"action": "MODEL.ACTION"
}
E.g. data
{
"url": "https://example.com/webhooks/b38406bf-22c0-4225-854f-r2u88qae7f42",
"action": "all"
}
This should return the following body
{
"uuid": "28fc84c204204d26b805a18163740bd0",
"action": "all",
"active": true,
"created": "2022-04-20T22:18:08.357360+02:00",
"updated": "2022-04-20T22:18:08.357423+02:00",
"scope": "whitelabel",
"url": "https://example.com/webhooks/b38406bf-22c0-4225-854f-r2u88qae7f42"
}
POST https://test.ticketbutler.io/webhooks/v1/whitelabel/hooks/
Body parameters
Parameter | Description |
---|---|
url | Target URL to send POST request to |
action | Action from the table above, when the webhook will be fired |
Whitelabel List Webhooks
HTTP Request
Example of request to get all registred whitelabel wide webhooks
curl -X GET https://test.ticketbutler.io/webhooks/v1/whitelabel/hooks/
-H 'Athorization: Token ticketbutler-auth-token'
This should return a JSON object with a list of available webhooks across the whitelabel (excluding team specific)
[
{
"uuid": "1175bd2b3766474ca6920b71570968f0",
"action": "all",
"active": false,
"created": "2022-04-20T22:18:08.357360+02:00",
"updated": "2022-04-20T22:18:08.357423+02:00",
"scope": "whitelabel",
"url": "https://example.com/webhooks/b38406bf-22c0-4225-854f-r2u88qae7f42"
},
{
"uuid": "cae24d1c0d814b91ae7d7e500f85c2f6",
"action": "event.create",
"active": true,
"created": "2022-04-20T22:27:15.397676+02:00",
"updated": "2022-04-20T22:27:15.397767+02:00",
"scope": "whitelabel",
"url": "https://example.com/webhooks/b38406bf-22c0-4225-854f-r2u88qae7f42"
}
]
GET https://test.ticketbutler.io/webhooks/v1/whitelabel/hooks/
This endpoint return all the webhooks that are created for the whitelabel scope.
Whitelabel Get Webhook
HTTP Request
Example of request to get the cofiguration of a specific webhook for a whitelabel
curl -X GET https://test.ticketbutler.io/webhooks/v1/whitelabel/hooks/cae24d1c0d814b91ae7d7e500f85c2f6/
-H 'Athorization: Token ticketbutler-auth-token'
This should return a JSON object with a single webhook
{
"uuid": "cae24d1c0d814b91ae7d7e500f85c2f6",
"action": "event.create",
"active": true,
"created": "2022-04-20T22:27:15.397676+02:00",
"updated": "2022-04-20T22:27:15.397767+02:00",
"scope": "whitelabel",
"url": "https://example.com/webhooks/b38406bf-22c0-4225-854f-r2u88qae7f42"
}
GET https://test.ticketbutler.io/webhooks/v1/whitelabel/hooks/<UUID>/
This endpoint return a specific webhook at the whitelabel scope.
Whitelabel Delete Webhook
HTTP Request
Example of request to get the cofiguration of a specific webhook for a whitelabel
curl -X DELETE https://test.ticketbutler.io/webhooks/v1/whitelabel/hooks/cae24d1c0d814b91ae7d7e500f85c2f6/
-H 'Athorization: Token ticketbutler-auth-token'
This should return a JSON response and HTTP code 202
{
"detail": "Webhook deleted"
}
DELETE https://test.ticketbutler.io/webhooks/v1/whitelabel/hooks/<UUID>/
This endpoint delete a specific webhook at the whitelabel scope. REMARK it’s deleted for good!
Whitelabel Update Webhook
HTTP Request
Example of request to register a URL endpoint for receiving webhooks for the whole whitelabel
curl -X POST https://test.ticketbutler.io/webhooks/v1/whitelabel/hooks/28fc84c204204d26b805a18163740bd0/
-H 'Athorization: Token ticketbutler-auth-token'
-H 'Content-Type: application/json'
-d @new_webhook.json
NOTE: The above command uses object new_webhook.json with JSON structure like this:
{
"url": "URL",
"action": "MODEL.ACTION",
"active": "true|false"
}
E.g. data
{
"url": "https://example.com/webhooks/b38406bf-22c0-4225-854f-r2u88qae7f42",
"action": "all"
}
This should return the following body
{
"uuid": "28fc84c204204d26b805a18163740bd0",
"action": "all",
"active": true,
"created": "2022-04-20T22:18:08.357360+02:00",
"updated": "2022-04-20T22:18:08.357423+02:00",
"scope": "whitelabel",
"url": "https://example.com/webhooks/b38406bf-22c0-4225-854f-r2u88qae7f42"
}
or data
{
"active": false
}
This should return the following body
{
"uuid": "28fc84c204204d26b805a18163740bd0",
"action": "all",
"active": false,
"created": "2022-04-20T22:18:08.357360+02:00",
"updated": "2022-04-20T22:18:08.357423+02:00",
"scope": "whitelabel",
"url": "https://example.com/webhooks/b38406bf-22c0-4225-854f-r2u88qae7f42"
}
PATCH https://test.ticketbutler.io/webhooks/v1/whitelabel/hooks/<UUID>/
Body parameters
Parameter | Description |
---|---|
url | Target URL to send POST request to |
action | Action from the table above, when the webhook will be fired |
active | Should the webhook be active or not |
Zapier
Purchases
REMARK The Zapier integration is subject to change without warning. Therefore, make sure to sign up for getting notified upon changes by sending an email to [email protected].
When a purchase is completed in Ticketbutler via Zapier the outline of the data which is sent from Ticketbutler to Zapier. Find rough outline and example to the right of this text.
This data is used in your Zaps e.g. creating a record in a CRM every time a purchase is completed with buyer information.
If the event has extra questions to be answered during the purchase either for order details or to each attendee those will be included under the “custom_questions” section in the top level or under each ticket.
The outline of the structure of the purchase data which is sent to Zapier
{
"uuid": "",
"scope": "whitelabel",
"action": "purchase.paid",
"live": true,
"team": "",
"data": {
"address": {
"first_name": "",
"full_name": "",
"last_name": "",
"title": "",
"venue": null,
"business_name": "",
"cvr": "",
"additional_info": "",
"street": "",
"street_2": "",
"city": "",
"postcode": "",
"country": "",
"phone": "",
"email": "",
"language": "en"
},
"custom_questions": {
// Map of custom questions to the person placing the purchase otherwise null
},
"event": {
"address": {
"first_name": "",
"full_name": "",
"last_name": "",
"title": "",
"venue": "",
"business_name": "",
"cvr": "",
"additional_info": "",
"street": "",
"street_2": "",
"city": "",
"postcode": "",
"country": "",
"phone": "",
"email": "",
"language": "en"
},
"description": "",
"end_date": null,
"event_full_url": "https://example.com/en/e/URL/",
"image": {
"main": false
},
"start_date": "",
"summary": "",
"tags": [
{
"uuid": "",
"name": ""
}
],
"team": {
"slug": "",
"uuid": "",
"name": ""
},
"title": "",
"uuid": ""
},
"external_order_id": null,
"is_tickets_send": false,
"is_cancelled": false,
"order_id": "",
"state": "",
"ticket_count": ,
"tickets": [
// List of tickets and their details
{
"attribute_selected": null,
"checked_in": false,
"company_name": "",
"custom_questions": {
// Map of custom questions if there are any otherwise null
},
"email": "",
"external_uuid": "",
"full_name": "",
"purchase_uuid": "",
"ticket_download_absolute_url": "https://",
"ticket_paid": false,
"ticket_refund": false,
"ticket_type": {
"active": true,
"amount_total": ,
"description": ,
"price": "00.00",
"sales_end_date": ,
"sales_start_date": ,
"start_date": ,
"title": "",
"uuid": ""
},
"uuid": ""
}
],
"uuid": ""
}
}
Example output of a purchase when it has been completed in Ticketbutler and sent to Zapier
{
"uuid": "07fe6740-d598-477f-a718-c9fd87539e62",
"scope": "team",
"action": "purchase.paid",
"live": true,
"team": "dinner-party",
"data": {
"address": {
"first_name": "John",
"full_name": "John Doe",
"last_name": "Doe",
"title": "",
"venue": null,
"business_name": "",
"cvr": "",
"additional_info": "",
"street": "",
"street_2": "",
"city": "",
"postcode": "",
"country": "",
"phone": "+4589801280",
"email": "[email protected]",
"language": "en"
},
"custom_questions": null,
"event": {
"address": {
"first_name": "Event Manager Dream",
"full_name": "Event Manager Dream Team",
"last_name": "Team",
"title": "",
"venue": "The Event Hub",
"business_name": "The Event Hub",
"cvr": "12345678",
"additional_info": "",
"street": "Event Street 12",
"street_2": "",
"city": "",
"postcode": "",
"country": "Denmark",
"phone": "+4589801280",
"email": "[email protected]",
"language": "en"
},
"description": "",
"end_date": null,
"event_full_url": "https://example.com/en/e/zapier-integration/",
"image": {
"main": false
},
"start_date": "2022-07-05T12:15:00+02:00",
"summary": "",
"tags": [
{
"uuid": "b067c8ff071e42aab702f71408965553",
"name": "Dinner Party"
}
],
"team": {
"slug": "dinner-party",
"uuid": "83a0ecfa-142c-47e4-abe9-2b0ee4846453",
"name": "Dinner Party"
},
"title": "Zapier integration",
"uuid": "49c45738-afe5-4015-9552-eb230f4e7df3"
},
"external_order_id": null,
"is_tickets_send": false,
"is_cancelled": false,
"order_id": "UWb127908",
"state": "PAID",
"ticket_count": 1,
"tickets": [
{
"attribute_selected": null,
"checked_in": false,
"company_name": "Ticketbutler",
"custom_questions": {
"uuid": "6e5d867cc4a94190bf4b8b63156e85a5",
"answers": [
{
"uuid": "b422a63431bf4d10a4d7421b85688d18",
"answer_collection": 15874,
"question": 1186,
"variation": "COMPANY",
"question_heading": "Company",
"answer_value": "Ticketbutler",
"answered_choices": []
},
{
"uuid": "fffb227e68564b4fb64e6be70d356821",
"answer_collection": 15874,
"question": 1187,
"variation": "NAME",
"question_heading": "Full name",
"answer_value": "John Doe",
"answered_choices": []
},
{
"uuid": "gggb227e68573h2jg12h3be70d356821",
"answer_collection": 15874,
"question": 1188,
"variation": "TEXT",
"question_heading": "Job Title",
"answer_value": "CFO",
"answered_choices": []
}
]
},
"email": "[email protected]",
"external_uuid": null,
"full_name": "John Doe",
"purchase_uuid": "79e84df7-08c0-4532-b20c-f7f9898413d4",
"ticket_download_absolute_url": "https://example.com/en/purchase/89e84df708c04532b20cf7f9898413d4/tickets-download/8f2425082919442ca7e473121eaf153d/",
"ticket_paid": false,
"ticket_refund": false,
"ticket_type": {
"active": true,
"amount_total": 100,
"description": null,
"price": "10.00",
"sales_end_date": null,
"sales_start_date": null,
"start_date": null,
"title": "Admission",
"uuid": "d9c396b9-99e1-4250-9f96-f6f5d1c25aef"
},
"uuid": "9f242508-2918-442c-a7e4-73121eaf153d"
}
],
"uuid": "79e84df7-08c0-4532-b20c-f7f9898413d4"
}
}
Errors
The Ticketbutler API uses the following error codes:
Error Code | Meaning |
---|---|
400 | Bad Request – Your request is missing something |
401 | Unauthorized – Your API key is incorrect |
403 | Forbidden – The requested is not allowed, get an upgrade (Observer, Organiser, Admin) |
404 | Not Found – The specified object could not be found |
405 | Method Not Allowed – You tried to access an object with an invalid method |
406 | Not Acceptable – You requested a format that isn’t json |
410 | Gone – The object requested has been removed from our servers |
429 | Too Many Requests – You’re requesting too many objects! Slow down! |
500 | Internal Server Error – We had a problem with our server. We got notified so try again later. |
503 | Service Unavailable – We’re temporarially offline for maintanance. Please try again later. |