Send us your events

For organisers, venues and platforms who want their events on tuka.events. A curator reviews every event before it goes on the site.

How to become a vendor

We set up each vendor by hand; there is no self-service sign-up. Write to [email protected]: who you are, your city and the events you run, a link to your site, and how you would like to send them. We will send you a personal address, an API key, or both.

Three ways in

Email

Write in your own words to your personal address. Nothing to set up.

API with plain text

Send the description through the API, and we turn it into events.

API with fields

Send each event as structured data from your own system.

Email

You get an address like [email protected]. Write to it as you would to a person: the programme in the body, a poster or a PDF attached. Say the name, date, time and place. You can report changes the same way: a new time, a cancellation, an extra date.

API

Base URL: https://vendors.tuka.events/api/v1. Full schema: openapi.json (OpenAPI 3.1). Send your key in a header on every request, and keep it like a password. Test it with GET /api/v1/me, which stores nothing:

curl https://vendors.tuka.events/api/v1/me \
  -H "Authorization: Bearer $TUKA_API_KEY"

Plain text: POST /api/v1/letters

The simplest way. One request can describe many events.

curl https://vendors.tuka.events/api/v1/letters \
  -H "Authorization: Bearer $TUKA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"subject": "December programme",
       "text": "12 December, 20:00, Sofia Live Club: Jazz Night. Tickets from 15 EUR."}'

An event: POST /api/v1/events

title and starts_at are required. The title needs only one of bg, en, ru; we write the others. The time is local, with no offset. If you do not know the hour, send the date alone. One request is one date.

curl https://vendors.tuka.events/api/v1/events \
  -H "Authorization: Bearer $TUKA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title": {"en": "Jazz Night"},
       "starts_at": "2026-12-12T20:00",
       "city": "sofia",
       "venue": {"name": "Sofia Live Club", "address": "1 Vitosha Blvd"},
       "url": "https://example.com/jazz-night",
       "price": {"from": 15, "currency": "EUR"}}'

A venue: POST /api/v1/venues

Only for a venue with no event yet: an event names its own venue. name is required.

Responses

StatusMeaning
202Accepted and stored. It usually reaches a curator within two hours.
200The same content was already accepted ("duplicate": true). Re-sending is safe.
401The key is invalid or revoked.
422error.fields names each problem. Nothing was stored.
429Over about 30 requests a minute. Wait Retry-After seconds.
503Nothing was stored. Retry in a minute.

Compatibility. /api/v1 will not change incompatibly. New optional fields and new endpoints may appear, and unknown request fields are ignored. A change that would break an integration goes in a new version.