Howler Top Up API
The Top Up API from Howler — 1 operation(s) for top up.
The Top Up API from Howler — 1 operation(s) for top up.
openapi: 3.1.0
info:
title: Howler API v3 Artists Top Up API
version: 3.6.1
description: '*Last updated: 2026-01-20 21:15:49 +0200*
'
servers:
- url: https://{defaultHost}/api/v3/consumer_portal
variables:
defaultHost:
default: www.howler.co.za
description: Server for consumer portal endpoints
security:
- bearer_header: []
bearer_param: []
api_key: []
bearer_auth: []
tags:
- name: Top Up
paths:
/top_up:
post:
summary: select ticket or cashless tag (1)
operationId: updateConsumerTopup
tags:
- Top Up
parameters: []
description: 'Start the top up process of either a ticket or cashless tag by proving the barcode of the ticket or the uid of the cashless tag.
The next_step in the body will indicate which action should be performed next.
Whether the provided barcode or uid is a ticket or cashless tag will also depend on the response. Either the ticket or cashless_tag property will be populated.
'
responses:
'200':
description: successful
content:
application/json:
examples:
Ticket:
value:
top_up_order:
id: 1
reference: '123'
status: pending
type: TopUpOrder
user: {}
ticket:
id: 2
barcode: '1234'
next_step: /api/v3/consumer_portal/tickets/2/top_up/1/amounts
Cashless Tag:
value:
top_up_order:
id: 4
reference: '123'
status: pending
type: TopUpOrder
user: {}
cashless_tag:
id: 3
uid: 1234EEEEE
next_step: /api/v3/consumer_portal/cashless_tags/1234EEEEE/top_up/4/amounts
schema:
type: object
properties:
top_up_order:
$ref: '#/components/schemas/Order'
ticket:
$ref: '#/components/schemas/Ticket'
cashless_tag:
$ref: '#/components/schemas/CashlessTag'
next_step:
type: string
required:
- top_up_order
- next_step
'404':
description: topupable not found
'400':
description: topups not available
requestBody:
content:
application/json:
schema:
type: object
properties:
barcode_or_uid:
type: string
required:
- barcode_or_uid
examples:
ticket:
summary: Ticket
value:
barcode_or_uid: '1234'
cashless_tag:
summary: Cashless Tag
value:
barcode_or_uid: 1234EEEEE
required: true
components:
schemas:
Answer:
type: object
properties:
id:
type: integer
description: Answer ID
question_id:
type: integer
description: ID of the question this answer belongs to
response:
type:
- string
- 'null'
- array
description: The answer text
required:
- id
- question_id
- response
UserValidationConfiguration:
type: object
properties:
require_id_number?:
type: boolean
description: South African ID number is required
require_unique_identifier?:
type: boolean
description: ''
require_first_name?:
type: boolean
description: First Name is required
require_last_name?:
type: boolean
description: Last Name is required
require_cellphone_number?:
type: boolean
description: Cellphone Number is required
require_country?:
type: boolean
description: Country of Residence is required
require_passport_country?:
type: boolean
description: Passport Country is required
require_city?:
type: boolean
description: City of Residence is required
require_gender?:
type: boolean
description: Gender is required
require_date_of_birth?:
type: boolean
description: Date of Birth is required
require_passport_number?:
type: boolean
description: Passport Number is required
require_nickname?:
type: boolean
description: Nickname is required
require_billing_address?:
type: boolean
description: Nilling Address is required
required:
- require_id_number?
- require_unique_identifier?
- require_first_name?
- require_last_name?
- require_cellphone_number?
- require_country?
- require_passport_country?
- require_city?
- require_gender?
- require_date_of_birth?
- require_passport_number?
- require_nickname?
- require_billing_address?
description: Indicates which user details need to be completed before their profile is considered setup for an event.
CashlessTag:
type: object
properties:
id:
type: integer
event_id:
type: integer
uid:
type: string
tag_type:
type: string
enum:
- card
- wristband
required:
- id
- uid
Addonable:
type:
- object
- 'null'
properties:
name:
type: string
description: Name
size:
type: string
description: Size
required:
- name
- size
Order:
type: object
properties:
id:
type: integer
reference:
type: string
type:
type: string
status:
type: string
enum:
- pending
- paid
- expired
- pending_payment
- created
- processing
user:
$ref: '#/components/schemas/User'
cashless_deposit_cents:
type: integer
required:
- id
- reference
- status
- type
- user
- cashless_deposit_cents
TicketType:
type: object
properties:
id:
type: integer
created_at:
type: string
format: ISO 8601
updated_at:
type: string
format: ISO 8601
name:
type: string
ticket_category:
$ref: '#/components/schemas/TicketCategory'
nullable: true
cost:
type: integer
fee:
type: integer
booking_status:
type: string
virtual_credit_cents:
type:
- integer
- 'null'
description:
type: string
image_url:
type:
- string
- 'null'
description: URL to the ticket type image if attached
topups_configuration:
$ref: '#/components/schemas/TopupsConfiguration'
customer_settings_configuration:
$ref: '#/components/schemas/CustomerSettingsConfiguration'
questions:
type: array
items:
$ref: '#/components/schemas/Question'
description: Questions associated with this ticket type
hidden:
type: boolean
hidden_by_promo_code:
type: boolean
required:
- id
- updated_at
- created_at
- topups_configuration
Question:
type: object
properties:
id:
type: integer
description: Question ID
text:
type: string
description: Question text
required:
type: boolean
description: Whether the question is required
question_type:
type: string
description: Type of question
enum:
- text
- number
- multiple_choice
- multiple_answer
- date
- boolean
- cellphone_number
- id_number
options:
type:
- array
- 'null'
items:
type: string
description: Available options for multiple choice questions
position:
type: integer
description: Display position of the question
required:
- id
- text
- required
- question_type
TopupsConfiguration:
type: object
properties:
topups_enabled?:
type: boolean
description: Top Ups are enabled for the event
prevent_topup_for_multiple_tickets_of_same_type?:
type: boolean
description: If a user own mutliple tickets of the same ticket type then they cannot bt topped up.
small_topup_amount:
type: integer
description: Small Topup Amount
medium_topup_amount:
type: integer
description: Medium Topup Amount
large_topup_amount:
type: integer
description: Large Topup Amount
required:
- topups_enabled?
- small_topup_amount
- medium_topup_amount
- large_topup_amount
Venue:
type: object
properties:
id:
type: integer
readOnly: true
description: Primary Key
address:
type: string
description: Address
external_identifier:
type:
- string
- 'null'
description: External Identifier
latitude:
type: string
description: Latitude
longitude:
type: string
description: Longitude
name:
type: string
description: Name
source:
type:
- string
- 'null'
description: Source
required:
- id
- address
- external_identifier
- latitude
- longitude
- name
- source
Ticket:
type: object
properties:
id:
type: integer
barcode:
type:
- string
- 'null'
personalised_name:
type:
- string
- 'null'
status:
type: string
enum:
- pending
- pending_payment
- active
- expired
- closed
- transferred
- refunded
- reseated
- pending_assignment
- on_resale
- sold
- pending_allocation
created_at:
type: string
format: ISO 8601
event_id:
type: integer
event:
$ref: '#/components/schemas/Event'
nullable: true
ticket_type:
$ref: '#/components/schemas/TicketType'
is_addonable?:
type: boolean
addonable:
$ref: '#/components/schemas/Addonable'
updated_at:
type: string
format: ISO 8601
scanned_at:
type:
- string
- 'null'
format: ISO 8601
user:
anyOf:
- $ref: '#/components/schemas/User'
- type: 'null'
purchaser:
$ref: '#/components/schemas/User'
cashless_tag_uid:
type:
- string
- 'null'
can_be_transferred?:
type: boolean
can_be_topped_up?:
type: boolean
can_be_downloaded?:
type: boolean
can_show_barcode?:
type: boolean
active_status:
type: string
enum:
- pending
- pending_payment
- active
- expired
- closed
- transferred
- refunded
- reseated
- pending_assignment
- on_resale
- sold
- pending_allocation
- incomplete_registration
- refund_processing
- transfer_pending
- resale_pending_purchase
- assignment_pending
claimed?:
type: boolean
can_edit_ticket_transfer?:
type: boolean
registered?:
type: boolean
total_top_up_amount_cents:
type: integer
download_url:
type:
- string
- 'null'
answers:
type:
- array
- 'null'
items:
$ref: '#/components/schemas/Answer'
description: Answers to ticket questions
required:
- id
- personalised_name
- barcode
- status
- purchaser
- updated_at
- created_at
- event_id
- event
- ticket_type
- is_addonable?
- addonable
- can_be_transferred?
- can_be_topped_up?
- can_show_barcode?
- claimed?
TicketCategory:
type: object
properties:
id:
type: integer
name:
type: string
position:
type: integer
description:
type: string
created_at:
type: string
format: ISO 8601
updated_at:
type: string
format: ISO 8601
required:
- id
- name
- position
- created_at
- updated_at
User:
type: object
properties:
id:
type: integer
readOnly: true
description: Primary Key
first_name:
type: string
description: First Name
last_name:
type: string
description: Last Name
primary_email:
type: string
readOnly: true
description: Email address of user or dummy user
dummy?:
type: boolean
readOnly: true
description: True if the user has not yet signed up for an account.
required:
- id
- first_name
- last_name
- primary_email
- dummy?
CustomerSettingsConfiguration:
type: object
properties:
customer_transfers_enabled?:
type: boolean
description: Ticket transfers are allowed
require_signup_for_ticket_downloads?:
type: boolean
description: User profile must be setup, all required data capture completed and marketing questions answered before a user can download their tickets.
ticket_downloads_enabled_at:
type:
- string
- 'null'
format: ISO 8601
description: Specified date and time when tickets will be able to be downloaded.
ticket_downloads_enabled?:
type: boolean
description: If true a user will be able to download their tickets at the specified date and time
show_ticket_barcode?:
type: boolean
description: If tickets cannot be downloaded and this is true then the user will be able to see their barcode number of their ticket as text but not download or view it.
sharing_required_enabled?:
type: boolean
description: Sharing required enabled.
required: []
Event:
type: object
properties:
id:
type: integer
name:
type: string
description: Name of the event
ticket_types:
type: array
items:
$ref: '#/components/schemas/TicketType'
description: List of ticket types available for this event
add_ons:
type: array
items:
$ref: '#/components/schemas/TicketType'
description: List of addon ticket types for the event
status:
type: string
enum:
- pending
- active
- cancelled
start_time:
type:
- string
- 'null'
format: ISO 8601
end_time:
type:
- string
- 'null'
format: ISO 8601
currency:
type: string
description: ISO 4217 Currency Code
cashouts_enabled_at:
type:
- string
- 'null'
format: ISO 8601
cashouts_disabled_at:
type:
- string
- 'null'
format: ISO 8601
auto_cashouts_enabled?:
type: boolean
description: Event supports auto cashouts
claim_barcode_feature?:
type: boolean
description: Tickets can be claimed by topping them up.
enable_live_topups?:
type: boolean
description: Topups are allowed during the event.
slug:
type: string
description: 'URL slug used for the event. The url for the event can be generated as follows: https://{baseUrl}/events/{slug}'
short_url:
type:
- string
- 'null'
description: 'Short URL slug used for the event. The url for the event can be generated as follows: https://{baseUrl}/{short_url}'
classification:
type: string
enum:
- howler
- howler_ticketing
- howler_cashless
- foreign_ticketing
venue:
$ref: '#/components/schemas/Venue'
artist_lineup:
type: array
items:
$ref: '#/components/schemas/ArtistLineup'
description: List of artists performing at the event
my_artist_lineup:
type: array
items:
$ref: '#/components/schemas/ArtistLineup'
description: List of this user's performances for the event
is_cashless?:
type: boolean
is_past_event?:
type: boolean
user_validation_configuration:
$ref: '#/components/schemas/UserValidationConfiguration'
onsite_top_up_available?:
type: boolean
cashless_deposit_cents:
type: integer
header_image_url:
type:
- string
- 'null'
live:
type: boolean
mapboxUrl:
type:
- string
- 'null'
required:
- id
- name
- currency
- auto_cashouts_enabled?
- slug
- enable_live_topups?
- onsite_top_up_available?
- header_image_url
- is_past_event?
- live
- ticket_types
- add_ons
securitySchemes:
oauth2:
type: oauth2
description: OAuth2 authentication for third-party applications
flows:
authorizationCode:
authorizationUrl: /oauth/authorize
tokenUrl: /oauth/token
scopes:
public: Public scope
login: Login scope
ott: One-time token scope
bearer_header:
type: http
scheme: bearer
bearerFormat: oauth2
in: header
bearer_param:
type: apiKey
scheme: bearer
bearerFormat: oauth2
name: bearer_token
in: query
jwt_header:
type: http
scheme: bearer
bearerFormat: JWT
description: JWT token obtained from basic authentication login
jwt_param:
type: apiKey
name: bearer_token
in: query
description: JWT token as query parameter (alternative to Authorization header)
basic_auth:
type: http
scheme: basic
description: Basic authentication with email and password
api_key:
type: apiKey
name: x-auth-token
in: header
description: API key authentication
bearer_auth:
type: http
scheme: bearer
bearerFormat: JWT
description: JWT token authentication