Secondary market
Ticket resale
It is possible to securely resell a ticket by using our system. It is required for all participants to have their BAM wallets available. Tickets listed on the secondary market are also easily accessible via our marketplace, through the event page.
Maximum markups, organizer fees and the availability of the secondary market are subject to secondary market rulesets. These are defined on a per-ticket-config basis. For example, if the organizer has set the maximum markup at 20%, you cannot list a ticket for sale for a 25% markup.
PDF tickets cannot be sold, due to being insecure.
Selling a ticket
The way to mark a ticket for sale is through the blockchain function ticket.mark_for_sale
.
The payload looks like this:
{
"tickets": [
{
"seq_num": 1,
"ticket_config": {
"id": 2,
"event": {
"id": 3
}
},
"price": 20.50,
"locked_until": "2022-06-24T10:10:10+06:00",
"buyer_id": "123456-1233-1233-baac223",
"type": "DIRECT" | "MARKET" | "AUCTION"
}
],
"seller_id": "123432-1233-1233-baac223",
}
Parameter explanation:
tickets
is an array of tickets to be put up for saleseq_num
is the serial number of the ticketticket_config.id
is the ticket's ticket config IDticket_config.event.id
is the ticket's event IDprice
is the price in the currency of the ticket'sticket_config
, ie. if the ticket config's price is in EUR, the price is also in EUR.locked_until
determines for how long will the ticket be on sale. If it is not sold until then, the owner can access it as usual.buyer_id
is an optional parameter that, if specified, determines the user who can purchase the ticket. By default, ticket sales are public.type
has the value specifying how the ticket is offeredDIRECT
to a specific user, specified bybuyer_id
MARKET
to everyoneAUCTION
to the highest bidder (not available ATM, stay tuned :D)
seller_id
is the enrollment ID of the user who owns the tickets. This user also has to call this function.
It is possible to get all currently active offers for a user by using the GET orderbook/v1/offer/mine endpoint.
Buying a ticket
Buying a ticket is done through interactions with the Orderbook service. To find all currently available offers, use the GET orderbook/v1/offer endpoint, which you can filter by events, ticket configurations and currencies.
To take an offer/s, you need to create an order with the POST orderbook/v1/order endpoint. The only parameter is the array of offer IDs you want to purchase. If the call is successful, the offer is reserved and you will receive the payment info. After the payment is processed, the tickets will be automatically transferred to the buyer. If no payments were made during the payment period (30 min as of now), the offer is available again.
Payouts
Currently, the payouts are handled manually by the organizers of the events.
We are moving towards direct payments via Stripe Express accounts.
Resale control
It is possible to control markups on ticket resale, eliminating scalping. Additionally, it is possible to set fees which the organizer will charge for resale. This can be used, for example, to cover the costs of a new KYC request. It is also possible, but not advised, to disable the secondary market.
Creating a ruleset
To create a ruleset, use the POST account/v1/market-control endpoint.
All fixed amount values are in the ticket config's currency.
The parameters are used as follows:
Required:
organizer_id
specifies the organizer to whom the ruleset belongs.- The caller needs to have the
account.organization.update
permission.
Optional:
transfer_enabled
specifies if users can transfer tickets to other users for free. Defaults to true. It is best not to change this.resale_enabled
specifies if users can sell their tickets. If enabled, the following apply. Its also recommended to allow it, to avoid users going through other channels to purchase tickets, and possibly getting scammed.price_limit_percentage
specifies the max percentage of the markup. It is in a decimal notation, so 1.2 would mean 120% of the face value is the maximum for which a ticket can go on sale. Defaults to 1.price_limit_fixed
specifies the maximum price in the ticket config's currency. For example, if it is 120 and the currency for the ticket config is EUR, you cannot list a ticket for more than 120 EUR.fee_fixed
is the fee in the ticket config's currency that the organizer will take from the sale. It is added to the ticket's price and is paid by the buyer. Defaults to 0.fee_percentage
is the percentage in the decimal notation (ie. 0.05 for 5%) of the sale value that the organizer will take from the sale. It is added to the ticket price. When thefee_fixed
is also specified, the values are summed up.
Publishing a ruleset
After a ruleset is created, it needs to be published to the blockchain.
The payload is available at the GET account/v1/market-control/:id/chaincode-payload.
After getting the payload, you need to send a transaction with the function name secondary_market_ruleset.set
and the first argument being the payload.
After this is done, you can properly use this ruleset for ticket configurations.
You also need to do this after every update to the ruleset.
Applying the rules to ticket configurations
You can specify the ruleset when creating an event and its ticket configurations.
Send the ruleset ID the secondary_market_ruleset_id
field in each ticket configuration.
The rulesets can differ between ticket configs.