Skip to content

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 sale
  • seq_num is the serial number of the ticket
  • ticket_config.id is the ticket's ticket config ID
  • ticket_config.event.id is the ticket's event ID
  • price is the price in the currency of the ticket's ticket_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 offered
    • DIRECT to a specific user, specified by buyer_id
    • MARKET to everyone
    • AUCTION 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 the fee_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.

Back to top