Okidooki API

A REST API for partners to read the public nightlife catalog and manage their own venues, events and promotions programmatically.

Base URL

https://okidooki.app/v1

Auth

Bearer API key, created in your Business dashboard.

Introduction

Two developer products live here. Agent APIs (APP v0): one signed REST protocol that lets your software (an AI agent or any backend) buy on behalf of your users from three networks: Okidooki Night (nightlife), NowTrust (security) and MakeItFun (merch). Business API (below): REST for venues and organizers to manage their own catalog, events and promotions on Okidooki.

Agent APIs (APP v0)

Same protocol on every network: POST {gateway}/a2a/v0/{route}, JSON body, Authorization: Bearer <key> + X-Timestamp + X-Signature (HMAC-SHA256 over timestamp.rawBody), Idempotency-Key on order. Flow: discover → quote (firm 30 min) → order → status; the user links their account once (Connect with Okidooki) and sets limits (mandate) your calls must respect. Every network also speaks Google A2A and MCP.

Portal (keys, sandbox users, webhooks, usage, billing) · Quickstart · Full API reference (every route per network, generated from the spec) · OpenAPI · Postman · SDK JavaScript / Python · conformance test · network registry · status. Pricing: test and sandbox free; live traffic 2,000 calls/month free, then CHF 0.01 per call and CHF 0.50 per paid order.

Okidooki Night API

Venues (table reservations, free entry with a reservation at partner venues) and events (tickets) across cities; the user confirms and pays in the Okidooki app. Gateway https://europe-west1-okidooki-nightlife.cloudfunctions.net/a2aGateway, A2A okidooki.app/.well-known/agent.json, MCP okidooki.app/mcp.

RouteWhat it does
discoverVenues and events by cityName / cityId / near {lat,lng}, type venue | event, date.
quoteTable (date, time, partySize) or tickets (tierId, quantity) for the linked user; firm 30 minutes.
order / orders / status / cancelReservation requested (venue confirms) or tickets ready to pay in the app; cancellation per venue/event policy.
link/status · link/confirm · link/revokeAccount link of your user to an Okidooki account; link/status returns the mandate the user set for you.
connect/start · connect/statusUniversal consent: one page where the user approves your agent on all networks and sets limits (reference).
venues/menu · offerings · drinks/cheapestDrink/food menus with item ids and prices; ticket tiers of an event; cheapest drinks across the city.
menu/quotePrice a drinks/food basket for the user's table; the user pays it on the venue page in the app (confirmUrl).
venues/liveLive city pulse: venues ranked by people checked in right now, tonight's events, live promotions, friends out.
guestlist/join · guestlist/leaveRSVP on an event's guest list with plus-ones (mandate capability guestlist).
promotions · promotions/claimFree-of-charge offers in the city; claim one for the user (the venue approves, QR in the app).
checkinCheck the user in at a venue (crowd counter, check-in perks).
djs · djs/book · djs/bookings · djs/cancelBookable DJs and artists; booking requests with date, duration, event type, budget; the DJ answers with a price in the app.
tickets · reservations · reservations/cancelThe user's tickets and table reservations.
reviewsReviews and average rating of a venue.
friends/nearby · profile · gifts/sendFriends out right now, the user's profile and gifts to other users, each behind its own mandate capability (social, profile).

NowTrust API

Licensed private security in Switzerland: guards and company teams for events, nightclubs, bodyguard, property and escort; SOS dispatch of the nearest guards; spending mandates so bookings can settle without a tap. Gateway https://nowtrust.app (card /a2a/v0/card), A2A nowtrust.app/.well-known/agent.json (RPC /a2a/v0/rpc), MCP nowtrust.app/mcp.

RouteWhat it does
discoverGuards or companies near near {lat,lng}; kind guard | company, securityType (event_security, bodyguard, nightclub_security, private_property, escort_security) or intent (birthday, party, corporate, event, wedding…), partySize, now.
quotesellerId guard:<id> | company:<id>, when (ISO 8601), durationHours 1-24, location {lat,lng,address}; returns the price, card-on-file and mandate state.
order / orders / status / cancelBooking: settles at once within a mandate, otherwise the user approves and pays in NowTrust; cancellation free before acceptance, 50 % within 2 h of start.
sos · sos/status · sos/cancelDispatch the nearest guards to the user's location now; status and cancellation (fee once a guard is en route).
link/start · link/status8-character code the user enters in NowTrust (Settings, Connected apps); status includes ID verification, card on file, mandate and partnerMandate.
sellers · availability · reviewsGuard or company profile (rating, jobs, rate, specializations, languages, bio); day-by-day availability of a guard for up to 30 days; reviews with average rating.
series/quote · series/orderMulti-day or recurring bookings: up to 12 firm quotes from occurrences or when + repeat {every: day|week, count}, booked in one call; each settles within the mandate or waits for approval.
bookings · bookings/statusEvery booking of the user (made in the app or by any agent) with guard, payment, arrival, completion, incident report, review state.
messages · messages/sendChat with the guard of an active booking on the user's behalf (capability message).
reviews/create · incidents · receiptReview a completed booking (capability review); the guards' incident reports on the user's bookings and SOS calls; Stripe receipt of a paid order or booking.

MakeItFun API

Print-on-demand merch (Printful): t-shirts, hoodies, caps, mugs, posters, bags, patches and more, designed by AI, from an image, from exact text, or from the Design Curator's looks; mockups, firm quotes with real shipping, orders paid by the user in MakeItFun (30 minutes), crew orders with per-person sizes. Gateway https://europe-west1-make-it-fun-app.cloudfunctions.net/a2aGateway, A2A make-it-fun-app.web.app/.well-known/agent.json, MCP make-it-fun-app.web.app/mcp.

RouteWhat it does
discoverProducts by productType (tshirt, hoodie, cap, mug, poster, bag, phone_case, sticker, bottle, blanket, patch, tank, polo, tote, pillow, mousepad) or query; one product with sellerId (variants, CHF prices, placements, surcharges); occasions:true templates; styles:true or suggest {productType, occasion, vibe, city, event} curated looks with preview pictures and a recommended product.
preview · preview/statusRender a design on a variant: design.kind prompt | imageUrl | text (font, colour, outline, arc) | savedDesignId | style (styleId + slots); placements, position modes, multi-placement via baseDesignId; poll the job (30-120 s) for mockups, designId and the print spec.
designsThe user's saved designs (free to reuse) with the ids quote/order accept.
quoteUnits × unit price + real shipping to the user's saved address (options returned); team: [{name, number, size}] prints names and prices each member's own size.
order / orders / status / cancelOrder with confirmUrl (Stripe Checkout in the app, 30 minutes); statuses paid, in_production, shipped (tracking), cancelled, refunded, expired, failed; cancel free until production starts.
styles/feedbackThumbs up / down on a curated look (ranking signal, per city).
link/start · link/status · link/revokeCode the user enters in MakeItFun (Profile, Connected apps); status includes the shipping address state and the mandate.
sandbox/payTest keys only: settle a sandbox order as if the user paid.
categories · products · sizesBrowse the whole Printful catalog by category for a country, products with price from (CHF) and placements, size charts in cm or inches.
shippingShipping options and prices for variants to a country/zip or to the user's saved address, before any quote.
uploadUpload the user's own picture (base64 or URL) and use it as a design (design.kind imageUrl).
mockups · mockups/statusExtra views (lifestyle, flat, folded, hanger) of a saved design; ready in about 45 s or polled by task.
receiptStripe receipt and invoice link of a paid order.

Webhooks (order.status, sos.status, connect.approved, link.revoked) replace polling on every network; set them in the portal. Full request/response fields for all routes above: API reference.

Business API (Okidooki venues and organizers)

The Okidooki API is organised around REST. It has predictable resource-oriented URLs, accepts JSON request bodies, returns JSON responses and uses standard HTTP verbs and status codes. Every response object carries an object field naming its type.

There are two families of endpoints:

Authentication

Authenticate every request with your secret API key in the Authorization header. Keys carry the account and the scopes they are allowed to use. Never expose a live key in client-side code, a mobile app or a public repository.

curl
# All requests use a Bearer key
curl https://okidooki.app/v1/ping \
  -H "Authorization: Bearer ok_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Always send the key in the Authorization header. The key is a secret: keep it server-side and never put it in a URL, client-side code or a public repo.

API keys

Create and revoke keys in the Okidooki app under Business → Developers. A key is shown in full exactly once, at creation. We store only a hash, so if you lose it you must create a new one.

PrefixMeaning
ok_live_Live key. Reads and writes real production data.
ok_test_Test key. Same API surface, intended for integration testing.

Scopes

Each key holds a set of scopes. A request to an endpoint whose scope the key lacks returns 403 permission_error.

ScopeGrants
catalog:readRead the public events and venues catalog.
events:readList your own events.
events:writeCreate, update and delete your own events.
venues:readList the venues you own.
venues:writeUpdate your venue profiles.
promotions:readList your promotions.
promotions:writeCreate and update your promotions.
analytics:readRead live analytics for your venues.

Pricing & limits

Plans are billed monthly in EUR. Each plan includes a monthly call quota and a per-minute burst limit. Paid plans keep serving past the included quota and bill the excess as overage; the Free plan is a hard cap. Every response includes the rate-limit headers below, and a blocked request does not consume quota.

PlanPrice / monthIncluded calls / monthBurst / minOverage
Free€05,00060hard cap
Starter€1550,000120€5 / 1,000
Pro€79500,000600€4 / 1,000
Business€1992,000,0001,200€3 / 1,000
EnterpriseContact usCustomCustom€2 / 1,000

Manage your plan and API keys in the Okidooki web app.

HeaderDescription
X-RateLimit-LimitYour daily quota.
X-RateLimit-RemainingRequests left in the current day.
X-RateLimit-ResetUnix time (seconds) when the daily window resets.
Retry-AfterSeconds to wait, sent on a per-minute 429.

Errors

Okidooki uses conventional HTTP status codes. Errors return a JSON body with an error object.

json
{
  "error": {
    "type": "invalid_request_error",
    "code": "invalid_dates",
    "message": "'end_date' must be after 'start_date'."
  }
}
StatusTypeMeaning
400invalid_request_errorMissing or malformed parameter.
401authentication_errorMissing, invalid or revoked key.
403permission_errorKey lacks the scope, or you do not own the resource.
404not_found_errorNo such resource or endpoint.
429rate_limit_errorRate limit or daily quota exceeded.
500api_errorSomething went wrong on our end.

Pagination

List endpoints return an object with object: "list", a data array, a has_more boolean and a next_cursor. To fetch the next page, pass next_cursor back as the cursor query parameter. Treat the cursor as opaque. limit ranges from 1 to 100 (default 20).

curl
curl "https://okidooki.app/v1/events?limit=20&cursor=eyJvIjoyMH0" \
  -H "Authorization: Bearer ok_live_..."

List events

GET/v1/eventsscope catalog:read

Returns upcoming public events (those whose end_date is in the future), soonest first.

Query paramDescription
cityIdoptionalRestrict to one city.
typeoptionalEvent type, e.g. CLUB, CONCERT, FESTIVAL.
limitoptional1 to 100 (default 20).
cursoroptionalPagination cursor.
json
{
  "object": "list",
  "data": [
    {
      "object": "event",
      "id": "7Qd2...",
      "title": "Saturday Mainroom",
      "type": "CLUB",
      "venue_id": "vnu_123",
      "venue_name": "Club Aurora",
      "city_id": "basel",
      "start_date": "2026-10-10T22:00:00.000Z",
      "end_date": "2026-10-11T05:00:00.000Z",
      "image_url": "https://...",
      "has_tickets": true,
      "latitude": 47.5596,
      "longitude": 7.5886
    }
  ],
  "has_more": true,
  "next_cursor": "MTc2..."
}

Get an event

GET/v1/events/{id}scope catalog:read

Retrieve a single event by id.

List venues

GET/v1/venuesscope catalog:read

Returns venues, optionally filtered by cityId. Sensitive owner fields (legal name, registration number, verification documents) are never exposed.

Get a venue

GET/v1/venues/{id}scope catalog:read

List your events

GET/v1/me/eventsscope events:read

Lists every event you organise (newest first), including hidden and past ones.

Create an event

POST/v1/me/eventsscope events:write

Create an event. Provide a location either by referencing a venue you own (venue_id) or by supplying a free-text venue_name with latitude and longitude.

FieldDescription
titlerequiredEvent title.
start_daterequiredISO-8601 start.
end_daterequiredISO-8601 end, after start.
venue_idconditionalA venue you own. Fills name, city and coordinates automatically.
venue_name, latitude, longitudeconditionalRequired when no venue_id is given.
typeoptionalEvent type (default CLUB).
description, image_url, genres, external_ticket_url, city_id, show_on_mapoptionalExtra fields.
curl
curl https://okidooki.app/v1/me/events \
  -H "Authorization: Bearer ok_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Friday Techno",
    "venue_id": "vnu_123",
    "type": "CLUB",
    "start_date": "2026-10-17T22:00:00Z",
    "end_date": "2026-10-18T05:00:00Z",
    "genres": ["techno","house"]
  }'
Ticketing and guest lists are not created through the API yet. Use external_ticket_url to link an external ticket page.

Update an event

PATCH/v1/me/events/{id}scope events:write

Update your own event. Patchable: title, description, start_date, end_date, image_url, genres, external_ticket_url, show_on_map, type.

Delete an event

DELETE/v1/me/events/{id}scope events:write

Permanently delete an event you own. Events with sold tickets cannot be deleted through the API.

List your venues

GET/v1/me/venuesscope venues:read

Update a venue

PATCH/v1/me/venues/{id}scope venues:write

Update a venue you own. Patchable: name, description, phone, website, email, socials, opening_hours, cuisines, amenities, venue_type, currency, accepts_food_orders, reservations_enabled, banner_url, logo_url, address.

List promotions

GET/v1/me/promotionsscope promotions:read

Optional query venueId narrows to one venue.

Create a promotion

POST/v1/me/promotionsscope promotions:write
FieldDescription
venue_idrequiredA venue you own.
titlerequiredPromotion title.
starts_at, ends_atrequiredISO-8601 window.
reward_typeoptionalFREE_DRINK, FREE_ENTRY, DISCOUNT, VIP, OTHER.
limitoptionalMax approved claims, the "first N". 0 means unlimited.
require_check_inoptionalRequire an active venue check-in to claim.
targetoptional{ "gender": "any|female|male", "ageMin": n, "ageMax": n }.

Update a promotion

PATCH/v1/me/promotions/{id}scope promotions:write

Patchable: title, description, limit, ends_at, and status (only to ENDED, to close a promotion early).

Venue analytics

GET/v1/me/analytics?venueId={id}scope analytics:read

Live, computed metrics for a venue you own.

json
{
  "object": "analytics",
  "venue_id": "vnu_123",
  "live_check_ins": 42,
  "oki_rating": 4.6,
  "events": { "total": 31, "upcoming": 4, "tickets_sold": 860 },
  "reservations": { "total": 120, "by_status": { "CONFIRMED": 90 } },
  "orders": { "drinks": { "total": 540 }, "food": { "total": 120 } },
  "promotions": { "total": 6, "active": 2, "claimed_total": 148 }
}