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.
| Route | What it does |
|---|---|
discover | Venues and events by cityName / cityId / near {lat,lng}, type venue | event, date. |
quote | Table (date, time, partySize) or tickets (tierId, quantity) for the linked user; firm 30 minutes. |
order / orders / status / cancel | Reservation requested (venue confirms) or tickets ready to pay in the app; cancellation per venue/event policy. |
link/status · link/confirm · link/revoke | Account link of your user to an Okidooki account; link/status returns the mandate the user set for you. |
connect/start · connect/status | Universal consent: one page where the user approves your agent on all networks and sets limits (reference). |
venues/menu · offerings · drinks/cheapest | Drink/food menus with item ids and prices; ticket tiers of an event; cheapest drinks across the city. |
menu/quote | Price a drinks/food basket for the user's table; the user pays it on the venue page in the app (confirmUrl). |
venues/live | Live city pulse: venues ranked by people checked in right now, tonight's events, live promotions, friends out. |
guestlist/join · guestlist/leave | RSVP on an event's guest list with plus-ones (mandate capability guestlist). |
promotions · promotions/claim | Free-of-charge offers in the city; claim one for the user (the venue approves, QR in the app). |
checkin | Check the user in at a venue (crowd counter, check-in perks). |
djs · djs/book · djs/bookings · djs/cancel | Bookable DJs and artists; booking requests with date, duration, event type, budget; the DJ answers with a price in the app. |
tickets · reservations · reservations/cancel | The user's tickets and table reservations. |
reviews | Reviews and average rating of a venue. |
friends/nearby · profile · gifts/send | Friends 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.
| Route | What it does |
|---|---|
discover | Guards 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. |
quote | sellerId 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 / cancel | Booking: 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/cancel | Dispatch the nearest guards to the user's location now; status and cancellation (fee once a guard is en route). |
link/start · link/status | 8-character code the user enters in NowTrust (Settings, Connected apps); status includes ID verification, card on file, mandate and partnerMandate. |
sellers · availability · reviews | Guard 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/order | Multi-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/status | Every booking of the user (made in the app or by any agent) with guard, payment, arrival, completion, incident report, review state. |
messages · messages/send | Chat with the guard of an active booking on the user's behalf (capability message). |
reviews/create · incidents · receipt | Review 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.
| Route | What it does |
|---|---|
discover | Products 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/status | Render 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. |
designs | The user's saved designs (free to reuse) with the ids quote/order accept. |
quote | Units × 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 / cancel | Order 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/feedback | Thumbs up / down on a curated look (ranking signal, per city). |
link/start · link/status · link/revoke | Code the user enters in MakeItFun (Profile, Connected apps); status includes the shipping address state and the mandate. |
sandbox/pay | Test keys only: settle a sandbox order as if the user paid. |
categories · products · sizes | Browse the whole Printful catalog by category for a country, products with price from (CHF) and placements, size charts in cm or inches. |
shipping | Shipping options and prices for variants to a country/zip or to the user's saved address, before any quote. |
upload | Upload the user's own picture (base64 or URL) and use it as a design (design.kind imageUrl). |
mockups · mockups/status | Extra views (lifestyle, flat, folded, hanger) of a saved design; ready in about 45 s or polled by task. |
receipt | Stripe 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:
- Catalog (read): public upcoming events and venues across every city, for discovery and listings.
- Your data (read and write): the venues you own, their events, promotions and live analytics. Scoped strictly to the account that owns the key.
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.
# All requests use a Bearer key curl https://okidooki.app/v1/ping \ -H "Authorization: Bearer ok_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
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.
| Prefix | Meaning |
|---|---|
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.
| Scope | Grants |
|---|---|
catalog:read | Read the public events and venues catalog. |
events:read | List your own events. |
events:write | Create, update and delete your own events. |
venues:read | List the venues you own. |
venues:write | Update your venue profiles. |
promotions:read | List your promotions. |
promotions:write | Create and update your promotions. |
analytics:read | Read 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.
| Plan | Price / month | Included calls / month | Burst / min | Overage |
|---|---|---|---|---|
| Free | €0 | 5,000 | 60 | hard cap |
| Starter | €15 | 50,000 | 120 | €5 / 1,000 |
| Pro | €79 | 500,000 | 600 | €4 / 1,000 |
| Business | €199 | 2,000,000 | 1,200 | €3 / 1,000 |
| Enterprise | Contact us | Custom | Custom | €2 / 1,000 |
Manage your plan and API keys in the Okidooki web app.
| Header | Description |
|---|---|
X-RateLimit-Limit | Your daily quota. |
X-RateLimit-Remaining | Requests left in the current day. |
X-RateLimit-Reset | Unix time (seconds) when the daily window resets. |
Retry-After | Seconds to wait, sent on a per-minute 429. |
Errors
Okidooki uses conventional HTTP status codes. Errors return a JSON body with an error object.
{
"error": {
"type": "invalid_request_error",
"code": "invalid_dates",
"message": "'end_date' must be after 'start_date'."
}
}| Status | Type | Meaning |
|---|---|---|
400 | invalid_request_error | Missing or malformed parameter. |
401 | authentication_error | Missing, invalid or revoked key. |
403 | permission_error | Key lacks the scope, or you do not own the resource. |
404 | not_found_error | No such resource or endpoint. |
429 | rate_limit_error | Rate limit or daily quota exceeded. |
500 | api_error | Something 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 "https://okidooki.app/v1/events?limit=20&cursor=eyJvIjoyMH0" \ -H "Authorization: Bearer ok_live_..."
List events
Returns upcoming public events (those whose end_date is in the future), soonest first.
| Query param | Description | |
|---|---|---|
cityId | optional | Restrict to one city. |
type | optional | Event type, e.g. CLUB, CONCERT, FESTIVAL. |
limit | optional | 1 to 100 (default 20). |
cursor | optional | Pagination cursor. |
{
"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
Retrieve a single event by id.
List venues
Returns venues, optionally filtered by cityId. Sensitive owner fields (legal name, registration number, verification documents) are never exposed.
Get a venue
List your events
Lists every event you organise (newest first), including hidden and past ones.
Create an event
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.
| Field | Description | |
|---|---|---|
title | required | Event title. |
start_date | required | ISO-8601 start. |
end_date | required | ISO-8601 end, after start. |
venue_id | conditional | A venue you own. Fills name, city and coordinates automatically. |
venue_name, latitude, longitude | conditional | Required when no venue_id is given. |
type | optional | Event type (default CLUB). |
description, image_url, genres, external_ticket_url, city_id, show_on_map | optional | Extra fields. |
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"] }'
external_ticket_url to link an external ticket page.Update an event
Update your own event. Patchable: title, description, start_date, end_date, image_url, genres, external_ticket_url, show_on_map, type.
Delete an event
Permanently delete an event you own. Events with sold tickets cannot be deleted through the API.
List your venues
Update a venue
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
Optional query venueId narrows to one venue.
Create a promotion
| Field | Description | |
|---|---|---|
venue_id | required | A venue you own. |
title | required | Promotion title. |
starts_at, ends_at | required | ISO-8601 window. |
reward_type | optional | FREE_DRINK, FREE_ENTRY, DISCOUNT, VIP, OTHER. |
limit | optional | Max approved claims, the "first N". 0 means unlimited. |
require_check_in | optional | Require an active venue check-in to claim. |
target | optional | { "gender": "any|female|male", "ageMin": n, "ageMax": n }. |
Update a promotion
Patchable: title, description, limit, ends_at, and status (only to ENDED, to close a promotion early).
Venue analytics
Live, computed metrics for a venue you own.
{
"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 }
}